我从一个简单的千里马问题开始,答案可以解决我正在努力解决的实际问题。
相关简单问题: 如何计算最大值: bfloat((1 +%I)^ 0.3); 可能有一个选项变量可以设置,以便计算复数?
实际问题: 在评估有限元方法的数值时间积分的近似值时,为此目的,我使用光谱分析,这需要计算4×4矩阵的特征值。这个矩阵" cav"也可以使用maxima的一些代数能力在最大值内计算,但是使用数值,这样矩阵就完全是数字的,即不包含变量。我用Mathematica计算了特征值,它返回了4个实特征值。然而,Maxima为这个案例计算了非常复杂的表达式,显然它并没有"知道"如何简化,甚至数字化为" bigfloat"。也许这个问题出现是因为Maxima首先逼近矩阵" cac"通过有理数(即分数),然后尝试完全准确地解决问题,而不是简单地使用数字" bigfloat"整个计算。我有办法改变这个吗?
请注意,如果您只将gzv的输入值更改为0.5,则可以正常工作,并返回复数特征值的数值。
我包含以下代码。请注意所有代码直到" cav:subst(vs,ca)$"只是为了定义矩阵cav,似乎工作正常。在此之后的几个陈述中,它无法计算特征值的数值。
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]$
答案 0 :(得分:2)
这里的主要问题是Maxima非常努力地使计算变得准确,并且很难说它缓和并且允许不精确的结果。
您在上面发布的代码中是否有错误?您有cav:subst(vs,ca)
但未定义ca
。这应该是cav:subst(vs,cad)
吗?
对于简短的问题,通常rectform
可以将复杂的表达式简化为更有用的东西:
(%i58) rectform (bfloat((1+%i)^0.3));
`rat' replaced 1.0B0 by 1/1 = 1.0B0
(%o58) 2.59023849130283b-1 %i + 1.078911979230303b0
关于长期问题,如果您可以接受固定精度(即普通浮点数,而不是大浮点数),则可以使用LAPACK函数dgeev
来计算特征值和/或特征向量。
(%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]
如果你真的需要可变精度,我不知道该尝试什么。原则上,可以重新编写LAPACK代码以使用可变精度浮点数,但这是一项重大任务,而且我不确定细节。