通过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(即 return 矩形形式 rp + i 乘以 ip)和 radcan(即 return "canonical" 根的表示)来清理输出。例如。 radcan(rectform(eig))

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

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