我正在使用非线性方程组。这些系统通常是非线性矢量微分方程。 我现在想要使用函数并根据时间和它们的时间导数推导它们,并通过求解非线性方程0 = rhs(eqs)找到平衡点。 计算欧拉 - 拉格朗日方程需要类似的东西,你需要L wrt的导数。 DIFF(X,T)。
现在我的问题是,如何在Sympy中实现这一点?
我的主要两个问题是,得出符号f wrt。 t diff(f,t)
,我得到0.我可以看到,
x = Symbol('x',real=True);
diff(x.subs(x,x(t)),t) # because diff(x,t) => 0
和
diff(x**2, x)
做了一些工作。
然而,
x = Fuction('x')(t);
diff(x,t);
我让这个工作,但我无法区分wrt。功能x本身,如
diff(x**2,x) -DOES NOT WORK.
由于我需要这些东西,特别是不仅对于标量,而且对于矢量(使用雅各比),我真的希望这是一个干净而实用的工作流程。 我应该在Sympy中启动哪种类型的数学函数以避免奇怪的替换? 对于那些我无法获得的基础来说,它只会变得更糟糕
eqns = Matrix([f1-5, f2+1]);
variabs = Matrix([f1,f2]);
nonlinsolve(eqns,variabs);
按预期工作,因为它只允许符号作为输入。这里有简单的转换吗?就像eqns.tolist()
- 它也不起作用?
编辑: 我刚刚找到了this问题,这个问题在使用表达式和基质时被回答。我希望能够解决一组非线性方程,构建矢量wrt的雅可比。另一个向量并导出wrt。功能如上所述。任何人都可以指出我为此目的开始简洁的工作流程吗?我想最复杂的任务是计算Lie导数wrt。一个向量或函数列表,其余的应该是直截了当的。
编辑2:
def substi(expr,variables):
return expr.subs( {w:w(t)} )
会自动化替换,因此substi(vector_expr,varlist_vector).diff(t)
并非全部为0。
答案 0 :(得分:1)
以下将x
定义为t
import sympy as s
t = s.Symbol('t')
x = s.Function('x')(t)
这可以解决您diff(x,t)
被评估为0
的问题。但我认为你的计算后期仍然会遇到问题。
我还使用变量微积分和欧拉 - 拉格朗日方程。在这些计算中,x'
需要被视为独立于x
。因此,通常最好为x
和x'
使用两个完全不同的变量,以免混淆Sympy与这两个变量之间的关系。完成Sympy中的计算后,我们回到笔和纸上,我们可以用x'
代替第二个变量。
答案 1 :(得分:1)
是的,必须先在函数中插入一个参数才能获得它的衍生物。但在那之后,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*Derivative(x(t), t, t)
。
那就是build-in method for Euler-Lagrange:
EL = euler_equations(L)
将产生相同的结果,除了作为右边0的微分方程表示:[Eq(2*x(t) - 2*Derivative(x(t), t, t), 0)]