用二项式公式和二次完备式简化一个更大的表达式

2024-09-29 03:31:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我得到了矩阵的一些特征值

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()相同。在

你知道怎么解决这个问题吗?在

提前谢谢你

亚历克斯


Tags: inimportsqrtkeysoutsymbolsfactor特征值
1条回答
网友
1楼 · 发布于 2024-09-29 03:31:40

这类事情被要求很多(例如,请参见这个问题:Expression simplification in SymPy),但是在SymPy中没有一个好的方法来完成它。问题是这样的“部分”因式分解不是唯一的(可能有多种方法可以将多项式转换为乘积和)。在

我在SymPy issue tracker上打开了关于它的this issue。我展示了一种接近的方法(这里a是平方根下的项)

In [92]: collect(expand(a.subs(Ry*Y, x - Rz*Z)), x, func=factor).subs(x, Ry*Y + Rz*Z)
Out[92]:
      2  2                                                                   2
- 4⋅Rz ⋅Z ⋅(Ryz⋅Rzy - 1) + 4⋅Rz⋅Z⋅(Ry⋅Y + Rz⋅Z)⋅(Ryz⋅Rzy - 1) + (Ry⋅Y + Rz⋅Z)

这里我暂时用一个变量x替换Ry*Y + Rz*Z,这样我就可以得到你想要的平方项。在

我想不出一个更接近你想要的东西的方法(也就是说,把剩下的词去掉{})。在

相关问题 更多 >