【问题标题】:How to find the nth derivative given the first derivative with SymPy?给定 SymPy 的一阶导数,如何找到第 n 阶导数?
【发布时间】:2016-10-29 22:32:10
【问题描述】:

给定一些f和微分方程x'(t) = f(x (t)),我如何计算 x(n)(t ) 表示为 x(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))

【问题讨论】:

  • 您应该将您的答案与您的问题分开发布。
  • @Fermiparadox:这不是我的真正答案,它只是对我从其他答案中收集到的内容的描述。我不希望它从现有答案中夺走潜在的选票......
  • @Mehrdad 您仍然应该将其发布为答案。它不会带走选票(您可以对多个答案进行投票)。
  • @asmeurer:我的意思是人们可能会投票给我而不是他们的答案,因为它更好(人们通常只是投票给最佳答案)即使它是基于他们的。我也不明白这一点。

标签: python sympy differential-equations


【解决方案1】:

这是一种方法,它返回所有导数的列表,最高可达n-th order

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 替换通常不起作用。尝试将2 替换为4
    • 是的。你的意思是像每一个积分和微分的自动对话?同情没有这样的事情。你需要告诉它你想要用一些预定义的函数替换表示,否则它总是想转换为完整的表示。另外,f 是一个函数。不是某个整数。它替换了评估表达式中的核心 sympy 表达式。
    • 我认为如果 SymPy 仅使用一阶导数(即没有自动将 Derivative(Derivative(x(t),t),t) 转换为 Derivative(x(t),t,t)),替换实际上应该可以正常工作。也没有办法告诉它吗?
    • 他们没有指定这种方式,我认为这违背了他们构建的类。当我测试它时,它会自动将Derivative(Derivative(x(t),t),t) 转换为Derivative(x(t),t,t)(在 shell 中输入时)
    猜你喜欢
    • 1970-01-01
    • 2015-09-21
    • 1970-01-01
    • 1970-01-01
    • 2016-10-30
    • 2020-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多