对症解方程

  • 本文关键字:方程 python sympy
  • 更新时间 :
  • 英文 :


我正在使用sympy玩旋转矩阵和类似的概念。我正试图从以下矩阵中提取α, β, γ:

⎡       α - γ⋅sin(θ)        ⎤
⎢                           ⎥
⎢β⋅cos(φ) + γ⋅sin(φ)⋅cos(θ) ⎥
⎢                           ⎥
⎣-β⋅sin(φ) + γ⋅cos(φ)⋅cos(θ)⎦
所以我得到这个矩阵
⎡1     0        -sin(θ)   ⎤
⎢                         ⎥
⎢0  cos(φ)   sin(φ)⋅cos(θ)⎥
⎢                         ⎥
⎣0  -sin(φ)  cos(φ)⋅cos(θ)⎦

基本上解出方程F(x) = Ax,但解的是A矩阵而不是x,其中F(x)是第一个矩阵,A是第二个矩阵,x是向量。我天真地用sympy.Solve测试,但它输出Matrices A and x are not aligned。从我所已经看到的通常是由于矩阵的尺寸不正确,但就我而言,我认为这是因为使用solve不是正确的方式。

我如何用简单的方法解决这个问题?

您可以使用SymPy的linear_eq_to_matrix函数:

In [6]: a, b, g = symbols("α β γ", positive=True)
...: t, p    = symbols("θ φ",   positive=True, nonzero=True)
In [7]: bres = Matrix([[a - g*sin(t)],
...:                [b*cos(p) + g*sin(p)*cos(t)],
...:                [-b*sin(p) + g*cos(p)*cos(t)]])
In [8]: bres
Out[8]: 
⎡       α - γ⋅sin(θ)        ⎤
⎢                           ⎥
⎢β⋅cos(φ) + γ⋅sin(φ)⋅cos(θ) ⎥
⎢                           ⎥
⎣-β⋅sin(φ) + γ⋅cos(θ)⋅cos(φ)⎦
In [9]: linear_eq_to_matrix(bres, [a,b,g])
Out[9]: 
⎛⎡1     0        -sin(θ)   ⎤  ⎡0⎤⎞
⎜⎢                         ⎥  ⎢ ⎥⎟
⎜⎢0  cos(φ)   sin(φ)⋅cos(θ)⎥, ⎢0⎥⎟
⎜⎢                         ⎥  ⎢ ⎥⎟
⎝⎣0  -sin(φ)  cos(θ)⋅cos(φ)⎦  ⎣0⎦⎠

https://docs.sympy.org/latest/modules/solvers/solveset.html linear-eq-to-matrix

这是我能想到的最接近的了。正如您所知道的F(x)(下面称为bres)和x,您正在寻找包含9个变量(a11,a12等)的A矩阵。A乘以x得到3个自变量方程。我们知道Ax - b = 0,但要找到每个系数,你需要添加约束。例如,要找到a11,您需要解决a11的第一个方程,但当您寻找α系数时,您需要添加βγ为0的约束(subs函数)。
请参阅我对您的回答的评论,因为这可能不是解决问题的最佳方法。

from sympy import *
a, b, g = symbols("α β γ", positive=True)
t, p    = symbols("θ φ",   positive=True, nonzero=True)
x = Matrix([[a],
[b],
[g]])
bres = Matrix([[a - g*sin(t)],
[b*cos(p) + g*sin(p)*cos(t)],
[-b*sin(p) + g*cos(p)*cos(t)]])
a11, a12, a13, a21, a22, a23, a31, a32, a33 = symbols("a11, a12, a13, a21, a22, a23, a31, a32, a33", real=True)
A = Matrix([[a11, a12, a13],
[a21, a22, a23],
[a31, a32, a33]])
v = A*x-bres
Ares = Matrix([[solve(v[0].subs(b, 0).subs(g, 0), a11), solve(v[0].subs(a, 0).subs(g, 0), a12), solve(v[0].subs(a, 0).subs(b, 0), a13)]
,[solve(v[1].subs(b, 0).subs(g, 0), a21), solve(v[1].subs(a, 0).subs(g, 0), a22), solve(v[1].subs(a, 0).subs(b, 0), a23)]
,[solve(v[2].subs(b, 0).subs(g, 0), a31), solve(v[2].subs(a, 0).subs(g, 0), a32), solve(v[2].subs(a, 0).subs(b, 0), a33)]])
print(Ares)

结果:

Matrix([[[1], [0],       [-sin(θ)]],
[[0], [cos(φ)],  [sin(φ)*cos(θ)]],
[[0], [-sin(φ)], [cos(θ)*cos(φ)]]])

最新更新