我得到了矩阵的一些特征值
import sys
import mpmath
from sympy import *
X,Y,Z = symbols("X,Y,Z")
Rxy,Rxz, Ry,Ryx,Ryz, Rz,Rzy,Rzz = symbols("Rxy,Rxz, Ry,Ryx,Ryz, Rz,Rzy,Rzz")
J = Matrix([
[ -1, 0, 0],
[ 0, -Ry*Y, Ry*Rzy*Y],
[Rxz*Rz*Z, Ryz*Rz*Z, -Rz*Z]])
具体如下:
^{pr2}$让我们看看特征值1:
In [25]: J.eigenvals().keys()[0]
Out[25]: -Ry*Y/2 - Rz*Z/2 + sqrt(Ry**2*Y**2 + 4*Ry*Ryz*Rz*Rzy*Y*Z - 2*Ry*Rz*Y*Z + Rz**2*Z**2)/2
我想把这个术语简化如下:去掉1/2和(这很重要)半径。在
我可以通过添加二次补码来转换半径如下
Ry**2*Y**2 + 4*Ry*Ryz*Rz*Rzy*Y*Z - 2*Ry*Rz*Y*Z + Rz**2*Z**2 | + 4*Ry*Rz*Y*Z -4*Ry*Rz*Y*Z
从而导致
Ry**2*Y**2 + Rz**2*Z**2 + 2*Ry*Rz*Y*Z - 4*Ry*Rz*Y*Z + 4*Ry*Ryz*Rz*Rzy*Y*Z
可以分解为
(Ry*Y + Rz*Z)**2 - 4*Ry*Rz*Y*Z*(1 - Ryz*Rzy)
有了这些评估,完整的特征值应该是这样的
-1/2*(Ry*Y + Rz*Z - sqrt((Ry*Y + Rz*Z)**2 - 4*Ry*Rz*Y*Z*(1 - Ryz*Rzy)))
这个计算对我来说非常重要,因为我要计算特征值是否为<;0。最后一种形式更容易。在
让我给你看看我到现在为止都做了些什么。在
In [24]: J.eigenvals().keys()[0]
Out[24]: -Ry*Y/2 - Rz*Z/2 + sqrt(Ry**2*Y**2 + 4*Ry*Ryz*Rz*Rzy*Y*Z - 2*Ry*Rz*Y*Z + Rz**2*Z**2)/2
In [25]: J.eigenvals().keys()[0].factor()
Out[25]: -(Ry*Y + Rz*Z - sqrt(Ry**2*Y**2 + 4*Ry*Ryz*Rz*Rzy*Y*Z - 2*Ry*Rz*Y*Z + Rz**2*Z**2))/2
In [26]: J.eigenvals().keys()[0].simplify()
Out[26]: -Ry*Y/2 - Rz*Z/2 + sqrt(Ry**2*Y**2 + 4*Ry*Ryz*Rz*Rzy*Y*Z - 2*Ry*Rz*Y*Z + Rz**2*Z**2)/2
因此,simplify()根本不会更改结果。 .factor()只计算-1/2。 如果我没记错的话,我可以像Y或Z一样将参数传递给.factor(),哪个变量应该被分解。但是我得到了很多略有不同的特征值作为输出,我不想手工指定factor()的每个参数(如果这个解决方案有效的话)。在
我还试着自己计算特征值,通过计算行列式和求解确定==0。。。 我也用过决定因素()并对其进行了求解,但其最佳结果与J.eigenvals().keys()[0].factor()相同。在
你知道怎么解决这个问题吗?在
提前谢谢你
亚历克斯
这类事情被要求很多(例如,请参见这个问题:Expression simplification in SymPy),但是在SymPy中没有一个好的方法来完成它。问题是这样的“部分”因式分解不是唯一的(可能有多种方法可以将多项式转换为乘积和)。在
我在SymPy issue tracker上打开了关于它的this issue。我展示了一种接近的方法(这里
a
是平方根下的项)这里我暂时用一个变量
x
替换Ry*Y + Rz*Z
,这样我就可以得到你想要的平方项。在我想不出一个更接近你想要的东西的方法(也就是说,把剩下的词去掉{})。在
相关问题 更多 >
编程相关推荐