关于复数:用wxmaxima简化特征解的表达

Simplify the expression of eigensolution by wxmaxima

一个偶然的机会,我遇到了下面描述的这种奇怪的情况。

刚度矩阵 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),但我未能将获得的特征值(复数表达式)转换为实数。

您能帮帮我吗?提前谢谢你。


发生的情况是结果包含虚数单位 %i 但它们实际上并不复杂。我认为 float(rectform(eig)) 将显示浮点 epsilon 数量级的虚部。您可以通过 rectform (即返回矩形形式 rp i 乘以 ip)和 radcan (即返回部首的"规范"表示)来清理输出。例如。 radcan(rectform(eig))

如果您只需要特征值的数值,请考虑使用附加包 lapack 中的 dgeev。例如。 load(lapack); dgeev(somematrix); 您可以通过 ? dgeev.

查看有关它的更多信息

最后还要注意,Maxima 在符号计算中非常喜欢精确数字(整数和有理数)。因此,请考虑在调用 eigenvalues 等符号算法之前将 ratsimp 应用于浮点表达式。 Maxima 会自动合理化浮点数,但如果您看到作为实际输入的有理形式,它可能会更清楚。