2017-01-24 4 views
4

Je commence par une simple question Maxima, dont la réponse peut fournir la réponse au problème réel auquel je suis confronté.Non-évaluation de l'expression numérique en Maxima

Question simple liée: Comment calculer le maximum: bfloat ((1 +% i)^0.3); Peut-il y avoir une variable d'option qui peut être définie pour que cela évalue un nombre complexe? Dans l'évaluation des approximations pour l'intégration du temps numérique pour les méthodes d'éléments finis, j'utilise à cet effet l'analyse spectrale qui nécessite le calcul des valeurs propres d'une matrice 4 x 4. Cette matrice "cav" est également calculée à l'intérieur des maxima, en utilisant certaines des capacités d'algèbre des maxima, mais en stockant des valeurs numériques, de sorte que la matrice est entièrement numérique, c'est-à-dire ne contenant pas de variables. J'ai calculé les valeurs propres avec Mathematica et retourne 4 valeurs propres réelles. Cependant Maxima calcule des expressions horriblement compliquées pour ce cas, qui apparemment ne "sait" pas simplifier, même numériquement comme "bigfloat". Ce problème est peut-être dû au fait que Maxima se rapproche d'abord de la matrice "cac" par des nombres rationnels (c'est-à-dire des fractions) et tente ensuite de résoudre le problème complètement, au lieu de simplement utiliser des calculs numériques "bigfloat". Est-ce que je peux changer cela?

Notez que si vous ne modifiez que la valeur d'entrée de gzv à 0,5, cela fonctionne correctement et renvoie des valeurs numériques de valeurs propres complexes.

J'inclus le code ci-dessous. Notez que tout le code jusqu'à "cav: subst (vs, ca) $" est juste pour la définition de la matrice cav et semble fonctionner correctement. C'est dans les quelques énoncés suivants qu'il ne parvient pas à calculer des valeurs numériques pour les valeurs propres.

v1:v0+ (1-gg)*a0+gg*a1$ 
d1:d0+v0+(1/2-gb)*a0+gb*a1$ 
obf:a1+(1+ga)*(w^2*d1 + 2*gz*w*(d1-d0)) - 
      ga *(w^2*d0 + 2*gz*w*(d0-g0))$ 
obf:expand(obf)$ 
cd:subst([a1=1,d0=0,v0=0,a0=0,g0=0],obf)$ 
fd:subst([a1=0,d0=1,v0=0,a0=0,g0=0],obf)$ 
fv:subst([a1=0,d0=0,v0=1,a0=0,g0=0],obf)$ 
fa:subst([a1=0,d0=0,v0=0,a0=1,g0=0],obf)$ 
fg:subst([a1=0,d0=0,v0=0,a0=0,g0=1],obf)$ 
f:[fd,fv,fa,fg]$ 
cad1:expand(cd*[1,1,1/2-gb,0] - gb*f)$ 
cad2:expand(cd*[0,1,1-gg,0] - gg*f)$ 
cad3:expand(-f)$ 
cad4:[cd,0,0,0]$ 
cad:matrix(cad1,cad2,cad3,cad4)$ 
gav:-0.05$ 
ggv:1/2-gav$ 
gbv:(ggv+1/2)^2/4$ 
gzv:1.1$ 
dt:0.01$ 
wv:bfloat(dt*2*%pi)$ 
vs:[ga=gav,gg=ggv,gb=gbv,gz=gzv,w=wv]$ 
cav:subst(vs,ca)$ 
cav:bfloat(cav)$ 
evam:eigenvalues(cav)$ 
evam:bfloat(evam)$ 
eva:evam[1]$ 

Répondre

2

Le principal problème ici est que Maxima essaie assez difficile de faire des calculs précis, et il est difficile de le dire pour faciliter et permettre des résultats inexacts.

Y at-il une erreur dans le code que vous avez posté ci-dessus? Vous avez cav:subst(vs,ca) mais ca n'est pas défini. Est-ce que c'est censé être cav:subst(vs,cad)?

Pour le problème à court, généralement rectform peut simplifier des expressions complexes à quelque chose de plus utile:

(%i58) rectform (bfloat((1+%i)^0.3)); 
`rat' replaced 1.0B0 by 1/1 = 1.0B0 
(%o58)  2.59023849130283b-1 %i + 1.078911979230303b0 

du long problème, si précision fixe (c.-à-flotteurs ordinaires, non bigfloats) est acceptable pour vous, Vous pouvez utiliser la fonction LAPACK dgeev pour calculer des valeurs propres et/ou des vecteurs propres.

(%i51) load (lapack); 
<bunch of messages here> 
(%o51) /usr/share/maxima/5.39.0/share/lapack/lapack.mac 
(%i52) dgeev (cav); 
(%o52) [[- 0.02759949957202372, 0.06804641655485913, 0.997993508502892, 0.928429191717788], false, false] 

Si vous avez vraiment besoin de précision variable, je ne sais pas quoi essayer. En principe, il est possible de retravailler le code LAPACK pour qu'il fonctionne avec des flotteurs de précision variable, mais c'est une tâche importante et je ne suis pas sûr des détails.

+0

Merci beaucoup, Robert Dodier. Dgeev de Lapack a travaillé magnifiquement, et la précision, même si elle n'est pas variable, semble plus qu'adéquate du nombre de chiffres imprimés, et l'exemple de verfication obtenu de "? Dgeev". Il est très utile de pouvoir faire des calculs numériques et symboliques avec le même programme. J'avais cherché des moyens de calculer des valeurs propres avec Maxima, mais je n'ai pas trouvé l'alternative de dgeev, ce qui était au moins très utile. –