如何找到SymPy给出一阶导数的n阶导数?

时间:2016-10-29 22:32:11

标签: python sympy differential-equations

给定一些 f 和微分方程 x &#39;( t )= f (< em> x ( t )),我如何计算 x n (< em> t ) x t )?

例如,给定 f x t ))= sin( x )), 我想获得 x (3) t )=(cos( x t < / em>)) 2 - sin( x t )) 2 )sin( x ))。

到目前为止,我已经尝试了

>>> 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))

2 个答案:

答案 0 :(得分:3)

声明f并使用替换:

>>> f = diff(x(t))
>>> diff(sin(x(t)), t, 2).subs(f, sin(x(t)))
-sin(x(t))**3 + cos(x(t))*Derivative(sin(x(t)), t)

答案 1 :(得分:3)

这是一种方法,它返回所有导数的列表,直到n - 顺序

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)
  

[x(t), x(t)**2, 2*x(t)**3, 6*x(t)**4, 24*x(t)**5]

使用f=sp.sin返回

 [x(t), sin(x(t)), sin(x(t))*cos(x(t)), -sin(x(t))**3 + sin(x(t))*cos(x(t))**2, -5*sin(x(t))**3*cos(x(t)) + sin(x(t))*cos(x(t))**3]

编辑:用于计算n - 衍生物的递归函数:

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))
  

-sin(x(t))**3 + sin(x(t))*cos(x(t))**2