Python 问题:如何计算矩阵对向量场的李导数

Python 问题:如何计算矩阵对向量场的李导数,python,numpy,vector,sympy,derivative,Python,Numpy,Vector,Sympy,Derivative,我有一个系统(x'=f(x)+g(x)u),使得f(x)是f:R3->R3,而g(x)是g:R3->R(3x2)。 我的系统是 如你所见,这是一个MIMO非线性控制系统,我希望找到我的系统的可控性矩阵。这种情况下的可控性矩阵由 C=[g[f,g][f[f,g]], 其中[f,g]表示f和g之间的李括号运算。 这就是为什么我需要计算矩阵对向量场的李导数,反之亦然。因为[f,g]=fdg/dx-gdf/dx 在我的系统中,f是3x1,g是3x2,因为有两个输入可用。 我想用Python计算上面的

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

如你所见,这是一个MIMO非线性控制系统,我希望找到我的系统的可控性矩阵。这种情况下的可控性矩阵由
C=[g[f,g][f[f,g]],
其中[f,g]表示f和g之间的李括号运算。 这就是为什么我需要计算矩阵对向量场的李导数,反之亦然。因为[f,g]=fdg/dx-gdf/dx

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

g=sm.矩阵([[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)

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

代码中唯一的错误是由于用于多个输入的元组。要使symphy.diffgeom中的导数起作用,需要正确定义向量场

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

(即g(x)是只有第一列的3x1矩阵)。然后,进行上述更改,得到正确的李导数

对于多输入情况(如您的问题所示),您可以简单地将这两列分为g1和g2,并按照上述情况继续操作。这是因为对于多输入情况,

其中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)

这是怎么回事?我不明白?实际上,为了计算非线性系统的状态变换,我需要计算Lfg。我已经编辑了我的原始问题,请检查一下,如果你想知道确切的问题,我也会发布。SO=StackOver。。。你需要给出数据和预期的输出,否则你就无法知道你想做什么。试着用这个来表示你的g:
g=(cos(x1)*e_-x1+x1**2*e_-x2+0*e_-x3,0*e_-x1+x2*e_-x2+0*e_-x3)
这会让你走得更远一些。但是,您将遇到
导数(f,g)
的问题。它似乎不像你期望的那样工作。看看这里:有任何numpy或scpiy版本的谎言导数吗?这将非常解决我的问题!