Sympy函数导数和方程组

时间:2017-11-07 13:55:11

标签: python types sympy

我正在使用非线性方程组。这些系统通常是非线性矢量微分方程。 我现在想要使用函数并根据时间和它们的时间导数推导它们,并通过求解非线性方程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。

2 个答案:

答案 0 :(得分:1)

以下将x定义为t

的函数
import sympy as s
t = s.Symbol('t')    

x = s.Function('x')(t)

这可以解决您diff(x,t)被评估为0的问题。但我认为你的计算后期仍然会遇到问题。 我还使用变量微积分和欧拉 - 拉格朗日方程。在这些计算中,x'需要被视为独立于x。因此,通常最好为xx'使用两个完全不同的变量,以免混淆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)]