numpy précision arbitraire d'algèbre linéaire
J'ai un numpy tableau 2d [moyenne/grande taille - dire 500x500]. Je veux trouver les valeurs propres de l'élément-sage de l'exposant. Le problème est que certaines de ces valeurs sont assez négatifs (-800,-1000, etc), et leurs exposants underflow (ce qui signifie qu'ils sont si proches de zéro, de sorte que numpy les traite comme de zéro). Est-il de toute façon à utiliser en précision arbitraire dans numpy?
La façon dont je rêve:
import numpy as np
np.set_precision('arbitrary') # <--- Missing part
a = np.array([[-800.21,-600.00],[-600.00,-1000.48]])
ex = np.exp(a) ## Currently warns about underflow
eigvals, eigvecs = np.linalg.eig(ex)
J'ai cherché une solution avec gmpy et mpmath en vain. Toute idée sera la bienvenue.
Je serais à la recherche d'une solution qui n'implique pas l'exponentiation
Heffernan eh Bien, c'est le problème physique, je suis de problèmes. Je ne pouvais pas trouver un moyen de faire la diagonalisation avant de les exposants.
Soins à donner plus de détails? Votre déclaration
Maintenant, qu'attendez-vous les valeurs propres et les vecteurs d'une matrice de nulle éléments? Merci
Redimensionner votre problème? Pour presque toutes les pratiques propose exp(-1000.) est égal à zéro.
Heffernan eh Bien, c'est le problème physique, je suis de problèmes. Je ne pouvais pas trouver un moyen de faire la diagonalisation avant de les exposants.
Soins à donner plus de détails? Votre déclaration
ex = np.exp(a)
semble être hors contexte, car eigvals, eigvecs = np.linalg.eig(a)
donne parfaitement raisonnable de répondre. Mais ex
devrait être traitée comme une matrice 2x2, où tous les éléments sont égaux à zéro. MerciMaintenant, qu'attendez-vous les valeurs propres et les vecteurs d'une matrice de nulle éléments? Merci
Redimensionner votre problème? Pour presque toutes les pratiques propose exp(-1000.) est égal à zéro.
OriginalL'auteur jarondl | 2011-07-29
Vous devez vous connecter pour publier un commentaire.
SymPy peut calculer la précision arbitraire:
de sortie:
vous pouvez changer 100 N(x, 100) à d'autres précision, mais, comme j'ai essayé de 1000, le calcul des modes propres vect a échoué.
OriginalL'auteur HYRY
Sur les systèmes 64 bits, il y a un
numpy.float128
dtype. (Je crois qu'il y a unfloat96
dtype sur les systèmes 32 bits) Alors quenumpy.linalg.eig
ne prend pas en charge 128 bits flotteurs,scipy.linalg.eig
(en quelque sorte).Cependant, rien de tout cela est d'aller à la matière, dans le long terme. Général solveur pour une valeur propre problème va être itératif, plutôt que d'exact, de sorte que vous ne gagnez pas tout en gardant une précision supplémentaire!
np.linalg.eig
fonctionne pour n'importe quelle forme, mais ne retourne jamais exacte solution.Si vous êtes toujours à la résolution des matrices 2x2, il est trivial d'écrire votre propre solveur qui devrait être plus exact. Je vais vous montrer un exemple de ce à la fin...
Peu importe, à aller de l'avant dans inutilement précis de la mémoire des conteneurs:
Cependant, vous remarquerez que ce que vous obtenez est identique à juste faire
np.linalg.eig(ex.astype(np.float64)
. En fait, je suis assez sûr que cescipy
est en train de faire, tandis quenumpy
génère une erreur plutôt que de le faire en silence. Je pourrais être tout à fait tort, mais...Si vous ne voulez pas utiliser de scipy, une solution de contournement consiste à redimensionner les choses après l'exponentiation mais avant de résolution pour les valeurs propres, les jeter comme "normale", les chars, les résoudre pour les valeurs propres, et puis refonte des choses comme float128 de suite et de le redimensionner.
E. g.
Enfin, si vous êtes seulement à résoudre 2x2 ou 3x3 matrices, vous pouvez écrire vos propres solveur, qui sera retourner une valeur exacte pour ces formes de matrices.
Celle-ci rentre vraiment une solution exacte, mais ne fonctionne que pour les matrices 2x2. C'est la seule solution qui en fait des avantages de l'une précision supplémentaire, cependant!
OriginalL'auteur Joe Kington
Autant que je sache, numpy ne prend pas en charge plus élevé que la double précision (float64), qui est la valeur par défaut si aucun n'est spécifié.
Essayez d'utiliser ceci: http://code.google.com/p/mpmath/
De la liste des fonctions (entre autres)
Arithmétique:
Oui, je n'ai pas trouvé non plus. Je ne pense pas que numpy lui-même peut vous aider ici, soit combinées avec mpmath ou la colombie-britannique (Pic de la réponse), de sorte que vous devez travailler pour obtenir votre résultat. Vous pouvez prendre un coup d'oeil à numpy source pour voir ce que linalg.gie() ressemble. Il pourrait ne pas être trop difficile à mettre en œuvre dans votre programme.
Il y a un
numpy.float128
pour ce que ça vaut. Je ne pense pas que c'est pris en charge parnumpy.linalg
, mais c'est pour les opérations de base.Pour ce que ça vaut
numpy.linalg.eig
appels de routines LAPACK. (C'est pourquoinumpy.linalg
ne supporte pas de précision à 128 bits). Peu importe, à la recherchenumpy.linalg.eig
'source est peu probable pour vous aider à mettre en œuvre une base de valeur propre solveur.Non, numpy a eu
float128
pour un très longtemps (au moins depuis la 1.1, et je suis sûr que c'était là un long moment avant que). Cependant, il est présent uniquement sur un système 64 bits. Sinon, je pense qu'il y a unfloat96
sur les systèmes 32 bits? Je pourrais être tout à fait tort sur lefloat96
partie, mais...OriginalL'auteur milancurcic
Je n'ai aucune expérience avec numpy en particulier, mais l'ajout d'un point décimal avec un nombre de zéros peut aider. Par exemple, l'utilisation de 1,0000 au lieu de 1. Dans la normale des scripts python où j'ai eu ce problème, ce qui a aidé, donc, sauf si votre problème est causé par une bizarrerie dans numpy et n'a rien à voir avec python, ce qui devrait aider.
Bonne chance!
OriginalL'auteur Sinthet
Si vous avez besoin de 350 chiffres de précision. Vous n'obtiendrez pas que la norme IEEE nombres à virgule flottante (ce que numpy est de l'utiliser). Vous pouvez l'obtenir avec la colombie-britannique programme:
OriginalL'auteur Spike Gronim