Python 辛函数导数与方程组

Python 辛函数导数与方程组,python,types,sympy,Python,Types,Sympy,我在研究非线性方程组。这些系统通常是一个非线性向量微分方程。 现在我想使用函数,导出它们关于时间和它们的时间导数,通过解非线性方程组0=rhs(eqs)找到平衡点。 计算Euler-Lagrange方程也需要类似的东西,这里需要L wrt的导数。微分(x,t) 现在我的问题是,如何在Symphy中实现这一点? 我的主要两个问题是,推导符号f wrt。tdiff(f,t),我得到0。我看得出来,那是我的 x = Symbol('x',real=True); diff(x.subs(x,x(t)),

我在研究非线性方程组。这些系统通常是一个非线性向量微分方程。 现在我想使用函数,导出它们关于时间和它们的时间导数,通过解非线性方程组0=rhs(eqs)找到平衡点。 计算Euler-Lagrange方程也需要类似的东西,这里需要L wrt的导数。微分(x,t)

现在我的问题是,如何在Symphy中实现这一点? 我的主要两个问题是,推导符号f wrt。t
diff(f,t)
,我得到0。我看得出来,那是我的

x = Symbol('x',real=True);
diff(x.subs(x,x(t)),t) # because diff(x,t) => 0

做一些工作

但是,

x = Fuction('x')(t);
diff(x,t);
我让这个工作,但我不能区分wrt。函数x本身,比如

diff(x**2,x) -DOES NOT WORK.
因为我需要这些东西,尤其是对于标量,而且对于向量(使用雅可比矩阵),我真的希望这是一个干净和功能性的工作流。 为了避免奇怪的替换,我应该在Symphy中启动哪种类型的数学函数? 这只会让婚姻变得更糟,在那里我无法得到

eqns = Matrix([f1-5, f2+1]);
variabs = Matrix([f1,f2]);
nonlinsolve(eqns,variabs);
按预期工作,因为它只允许符号作为输入。这里有容易的转换吗?像
eqns.tolist()
-哪个也不起作用

编辑: 我刚刚发现了一个问题,这个问题的答案是关于使用表达式和矩阵的。我想能够解非线性方程组,建立向量wrt的雅可比矩阵。另一个向量并导出wrt。功能如上所述。有人能为我指出一个方向,以便为此目的启动一个简明的工作流程吗?我想最复杂的任务是计算谎言导数wrt。一个向量或函数列表,其余的应该是直接的

编辑2:

def substi(expr,variables): 
   return expr.subs( {w:w(t)} )

将自动进行替代,因此
substi(vector\u expr,varlist\u vector).diff(t)
不都是0。

以下定义
x
t

import sympy as s
t = s.Symbol('t')    

x = s.Function('x')(t)
这将解决
diff(x,t)
被评估为
0
的问题。但我认为你在以后的计算中仍然会遇到问题。
我还研究了变分法和欧拉-拉格朗日方程。在这些计算中,
x'
需要被视为独立于
x
。因此,通常最好对
x
x'
使用两个完全不同的变量,以免混淆这两个变量之间的关系。在Sympy中完成计算后,我们回到笔和纸上,我们可以用
x'
替换第二个变量。

以下定义
x
t

import sympy as s
t = s.Symbol('t')    

x = s.Function('x')(t)
这将解决
diff(x,t)
被评估为
0
的问题。但我认为你在以后的计算中仍然会遇到问题。
我还研究了变分法和欧拉-拉格朗日方程。在这些计算中,
x'
需要被视为独立于
x
。因此,通常最好对
x
x'
使用两个完全不同的变量,以免混淆这两个变量之间的关系。在完成Sympy中的计算后,我们回到笔和纸上,我们可以用
x'
替换第二个变量。

是的,在函数求导之前必须在函数中插入一个参数。但在这之后,关于
x(t)
的微分在SymPy 1.1.1中对我有效,我也可以关于它的导数进行微分。欧拉-拉格朗日方程推导示例:

t = Symbol("t")
x = Function("x")(t)
L = x**2 + diff(x, t)**2    # Lagrangian
EL = -diff(diff(L, diff(x, t)), t) + diff(L, x)
现在EL是
2*x(t)-2*导数(x(t),t,t)
和预期一样

也就是说,有一个:


将产生相同的结果,除了以右边为0的微分方程表示外:
[Eq(2*x(t)-2*导数(x(t),t,t),0)]

是的,在取其导数之前必须在函数中插入参数。但在这之后,关于
x(t)
的微分在SymPy 1.1.1中对我有效,我也可以关于它的导数进行微分。欧拉-拉格朗日方程推导示例:

t = Symbol("t")
x = Function("x")(t)
L = x**2 + diff(x, t)**2    # Lagrangian
EL = -diff(diff(L, diff(x, t)), t) + diff(L, x)
现在EL是
2*x(t)-2*导数(x(t),t,t)
和预期一样

也就是说,有一个:


将产生相同的结果,除了以右边为0的微分方程表示:
[Eq(2*x(t)-2*导数(x(t),t,t),0)]

这是一种观点,是的。我已经知道这一点(第二种方法),但我确实忘记了在我的问题中更改函数的符号。问题仍然是:我应该为所有事情使用函数吗?正如你所说,推导wrt。功能不容易实现!?这就是重点,是的。我已经知道这一点(第二种方法),但我确实忘记了在我的问题中更改函数的符号。问题仍然是:我应该为所有事情使用函数吗?正如你所说,推导wrt。功能不容易实现!?谢谢Solve也可以工作,这基本上就是一个好的工作流程。但是,nonlinsolve和新的解算器不接受函数作为目标变量。Solve也可以工作,这基本上就是一个好的工作流程。但是,nonlinsolve和新的解算器不接受函数作为目标变量:/