给定一些f和微分方程x'(t)= f(x(t)),我如何根据x(t)计算x(n)(t)?
例如,假设f(x(t))= sin(x(t)),
我想获得x(3)(t)=(cos(x(t))2-sin(x(t))2)sin(x(t))。
到目前为止,我已经尝试过
>>> from sympy import diff, sin
>>> from sympy.abc import x, t
>>> diff(sin(x(t)), t, 2)
这给了我-sin(x(t))*Derivative(x(t), t)**2 + cos(x(t))*Derivative(x(t), t, t)
但是我不确定如何告诉SymPy什么是Derivative(x(t), t)
并自动找出Derivative(x(t), t, t)
等。回答:
这是根据下面收到的答案得出的最终解决方案:
def diff(x_derivs_known, t, k, simplify=False):
try: n = len(x_derivs_known)
except TypeError: n = None
if n is None:
result = sympy.diff(x_derivs_known, t, k)
if simplify: result = result.simplify()
elif k < n:
result = x_derivs_known[k]
else:
i = n - 1
result = x_derivs_known[i]
while i < k:
result = result.diff(t)
j = len(x_derivs_known)
x0 = None
while j > 1:
j -= 1
result = result.subs(sympy.Derivative(x_derivs_known[0], t, j), x_derivs_known[j])
i += 1
if simplify: result = result.simplify()
return result
例子:>>> diff((x(t), sympy.sin(x(t))), t, 3, True)
sin(x(t))*cos(2*x(t))
最佳答案
这是一种返回直到n
-th阶的所有导数的列表的方法
import sympy as sp
x = sp.Function('x')
t = sp.symbols('t')
f = lambda x: x**2 #sp.exp, sp.sin
n = 4 #3, 4, 5
deriv_list = [x(t), f(x(t))] # list of derivatives [x(t), x'(t), x''(t),...]
for i in range(1,n):
df_i = deriv_list[-1].diff(t).replace(sp.Derivative,lambda *args: f(x(t)))
deriv_list.append(df_i)
print(deriv_list)
随着
f=sp.sin
它返回编辑:用于计算
n
-th导数的递归函数:def der_xt(f, n):
if n==1:
return f(x(t))
else:
return der_xt(f,n-1).diff(t).replace(sp.Derivative,lambda *args: f(x(t)))
print(der_xt(sp.sin,3))
关于python - 如何使用SymPy查找给定一阶导数的n阶导数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40324336/