我在研究非线性方程组。这些系统一般是一个非线性矢量微分方程。现在我想使用函数并导出它们关于时间和它们的时间导数,并通过求解非线性方程0=rhs(eqs)来找到平衡点。类似的东西需要计算欧拉-拉格朗日方程,在这里,你需要L wrt的导数。差(x,t)
现在我的问题是,如何在Sympy中实现这一点?我的两个主要问题是,导出一个符号的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。函数本身,就像
diff(x**2,x) -DOES NOT WORK.因为我需要这些东西,尤其是对于标量,而且向量(使用jacobian),我真的希望这是一个干净和功能的工作流程。为了避免奇怪的替换,我应该在Sympy中使用哪种类型的数学函数?情况只会变得更糟,在我无法得到的情况下
eqns = Matrix([f1-5, f2+1]);
variabs = Matrix([f1,f2]);
nonlinsolve(eqns,variabs);按预期工作,因为它只允许符号作为输入。这里有很容易的转换吗?比如eqns.tolist() --它也不起作用吗?
编辑:我刚刚找到了这问题,这个问题是关于使用表达式和矩阵的。我想要能够求解一组非线性方程组,建立向量wrt的jacobian。另一个向量并导出wrt。如上所述的职能。有人能为我指出一个方向来启动一个简洁的工作流程吗?我想最复杂的任务是计算谎言导数wrt。一个向量或函数列表,其余的应该是直接向前的。
编辑2:
def substi(expr,variables):
return expr.subs( {w:w(t)} )将自动转换,因此substi(vector_expr,varlist_vector).diff(t)不是全部为0。
发布于 2017-11-11 03:58:30
是的,必须在函数中插入一个参数,然后才能得到它的导数。但在那之后,关于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)。
也就是说,有一个欧拉-拉格朗日的内建方法
EL = euler_equations(L)将得到相同的结果,除非表示为一个右侧为0:[Eq(2*x(t) - 2*Derivative(x(t), t, t), 0)]的微分方程。
发布于 2017-11-08 01:00:23
下面将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'代替第二个变量。
https://stackoverflow.com/questions/47159723
复制相似问题