【问题标题】:Non-Evaluation of Numerical Expression in MaximaMaxima 中数值表达式的非求值
【发布时间】:2017-06-08 22:33:33
【问题描述】:

我从一个简单的 Maxima 问题开始,这个问题的答案可能会为我正在努力解决的实际问题提供答案。

相关的简单问题: 我怎样才能得到最大值来计算: bfloat((1+%i)^0.3); 是否可以设置一个选项变量,以便计算为复数?

实际问题: 在评估有限元方法的数值时间积分的近似值时,为此我使用了谱分析,这需要计算 4 x 4 矩阵的特征值。这个矩阵“cav”也在最大值内计算,使用最大值的一些代数能力,但代替数值,所以矩阵完全是数值的,即不包含变量。我用 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]$

【问题讨论】:

    标签: maxima


    【解决方案1】:

    这里的主要问题是 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
    

    关于 long 问题,如果您可以接受固定精度(即普通浮点数,而不是大浮点数),那么您可以使用 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 代码以使用可变精度浮点数,但这是一项艰巨的任务,我不确定细节。

    【讨论】:

    • 非常感谢罗伯特·多迪尔。来自 lapack 的 Dgeev 工作得很好,从打印的位数和从“?dgeev”获得的验证示例来看,即使没有变化,准确性似乎也绰绰有余。能够用同一个程序进行数值和符号计算是非常有用的。我已经搜索了使用 Maxima 计算特征值的方法,但没有找到 dgeev 替代方案,这至少是最有用的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多