Sympy:如何计算矩阵相对于矢量场的李导数

时间:2017-07-22 14:04:49

标签: python numpy vector sympy derivative

我有一个系统(x' = f(x)+ g(x)u),f(x) is f:R3->R3g(x) is g:R3->R(3x2)。 我的系统是

enter image description here enter image description here

如您所见,它是一个MIMO非线性控制系统,我希望找到我系统的可控性矩阵。在这种情况下,可控性矩阵由公式表示 C = [g [f,g] [f,[f,g]] ..],
其中[f,g]表示f和g之间的斜括号操作。 这就是我需要相对于矢量场计算矩阵的李导数的原因,反之亦然。因为[f,g] = f dg / dx-g df / dx

在我的系统中,f是3x1,g是3x2,因为有两个输入可用。 我希望用Python计算上面的矩阵C. 我的系统是
f=sm.Matrix([[x1**2],[sin(x1)+x3**2],[cos(x3)+x1**2]])
g=sm.Matrix([[cos(x1),0],[x1**2,x2],[0,0]])

我的代码是:

from sympy.diffgeom import *
from sympy import sqrt,sin,cos

M     = Manifold("M",3)
P     = Patch("P",M)

coord          = CoordSystem("coord",P,["x1","x2","x3"])
x1,x2,x3       = coord.coord_functions()
e_x1,e_x2,e_x3 = coord.base_vectors()

f      = x1**2*e_x1 + (sin(x1)+x3**2)*e_x2 + (cos(x3) + x1**2)*e_x3
g      = (cos(x1))*e_x1+(x1**2,x2)*e_x2 + 0*e_x3

#h1    = x1
#h2    = x2
#Lfh1  = LieDerivative(f,h1)
#Lfh2  = LieDerivative(f,h2)
#print(Lfh1)
#print(Lfh2)

Lfg    = LieDerivative(f,g)
print(Lfg)

为什么我的代码没有给我正确答案?

1 个答案:

答案 0 :(得分:0)

您的代码中唯一的错误是由于用于多个输入的元组。为了使Sympy.diffgeom中的LieDerivative工作,您需要正确定义的向量字段。

对于单输入系统,您拥有的确切代码无需元组即可工作,因此,在这种情况下,例如,如果您拥有 g = (cos(x1))*e_x1+x1**2*e_x2 + 0*e_x3

(即g(x)是3 x 1矩阵,只有第一列)。然后,进行上述更改,您将获得正确的Lie导数。

对于多输入情况(如您的问题),您可以简单地将两列分为g1和g2并按上述情况进行操作。之所以可行,是因为对于多种输入情况, See math here

其中g_1和g_2是两列。 Lgh的最终结果是1 x 2矩阵,如果您具有上面计算的两个结果(Lg1h和Lg2h),则基本上可以得到。

代码-

from sympy.diffgeom import *
from sympy import sqrt,sin,cos
from sympy import *
M = Manifold("M",3)
P = Patch("P",M)

coord          = CoordSystem("coord",P,["x1","x2","x3"])
x1,x2,x3       = coord.coord_functions()
e_x1,e_x2,e_x3 = coord.base_vectors()

f  = x1**2*e_x1 + (sin(x1)+x3**2)*e_x2 + (cos(x3) + x1**2)*e_x3
g1 = (cos(x1))*e_x1+(x1**2)*e_x2 + 0*e_x3
g2 = 0*e_x1+ x2*e_x2 + 0*e_x3
h = x1

Lg1h = LieDerivative(g1,h)
Lg2h = LieDerivative(g2,h)
Lgh = [Lg1h, Lg2h]
print(Lgh)