一个偶然的机会,我遇到了下面描述的这种奇怪的情况。
刚度矩阵 K 和质量矩阵 M 为:
K:matrix([141,-39,9],[-39,21,9],[9,9,21]);
M:matrix([1.5,0,0],[0,0.5,0],[0,0,0.5]);
然后通过以下方式找到特征值:
eig:eigenvalues(invert(M).K);
它们都是真实的。
但是,如果我将质量矩阵 M 更改为:
M:matrix([2,0,0],[0,0.5,0],[0,0,0.5]);
或者,甚至:
M:matrix([1.51,0,0],[0,0.5,0],[0,0,0.5]);
或者,否则:
M:matrix([1.499,0,0],[0,0.5,0],[0,0,0.5]);
那么,得到的特征值不再是真实的了(奇怪的事情)。
我也尝试简化获得的结果(使用 simp、ratsimp、fullratsimp、demoivre),但我未能将获得的特征值(复数表达式)转换为实数。
您能帮帮我吗?提前谢谢你。
- 补充资料:用 GNU Octave K=[141,-39,9;-39,21,9;9,9,21] 求解; M=[2,0,0;0,0.5,0;0,0,0.5]; [eigvec,eigval]=eig(K,M);给出实特征值和特征向量.
发生的情况是结果包含虚数单位 %i 但它们实际上并不复杂。我认为 float(rectform(eig)) 将显示浮点 epsilon 数量级的虚部。您可以通过 rectform (即返回矩形形式 rp i 乘以 ip)和 radcan (即返回部首的"规范"表示)来清理输出。例如。 radcan(rectform(eig))。
如果您只需要特征值的数值,请考虑使用附加包 lapack 中的 dgeev。例如。 load(lapack); dgeev(somematrix); 您可以通过 ? dgeev.
查看有关它的更多信息
最后还要注意,Maxima 在符号计算中非常喜欢精确数字(整数和有理数)。因此,请考虑在调用 eigenvalues 等符号算法之前将 ratsimp 应用于浮点表达式。 Maxima 会自动合理化浮点数,但如果您看到作为实际输入的有理形式,它可能会更清楚。
- 感谢您的信息。顺便说一句,wxmaxima 打印出包含虚数单位 %i 但它们实际上并不复杂的结果是否合理?
-
没有调查,我的第一个猜测是解特征多项式的公式是用虚数单位表示的,而且对于大多数实根的情况,Maxima 可以将虚部简化为零,但这种情况下默认的简化是不足够了,并且需要 radcan。当然,在实际表达式中发出 %i 是不可取的。
-
感谢您提供更多信息。您是否知道为什么在质量矩阵 M 完全等于矩阵 ([1.5,0,0],[0,0.5,0],[0,0,0.5]) 的情况下,wxmaxima 输出实数特征值,不像其他情况下的输出那样复杂。这个案子有什么特别之处吗?
-
必须查看 invert(M).K 的特征多项式才能看到发生了什么变化。我的猜测是,随着系数的变化,计算其根的算法会沿着代码的不同分支进行。
-
是的,我同意你的观点,算法应该走不同的分支,但是对应于 M:matrix([1.5,0,0],[0,0.5,0],[0,0 ,0.5]) 打印出真正的特征值很特别?如果这个矩阵只是稍微改变一下,恕我直言,我不认为 invert(M).K 的特征多项式变化到足以将计算切换到另一个分支的程度。
-
符号算法经常根据某个数量是零还是非零来进行分支,问题参数的微小变化很容易改变测试分支的数量。但是这个问题到底发生了什么只能通过查看您列出的特定情况的特征多项式来回答。