在sympy中将变量代入二阶导数
substituting variable to second order derivative in sympy
我正在使用 sympy 推导一些方程式,并且我在代入时遇到了一些意外行为。假设我有一个函数 f(x),我像这样用 x 区分它:
fx = f(x).diff()
结果如下:
现在,如果我将 x 替换为 pi 之类的值,如下所示:
fx.subs(x, pi)
我得到:
但是,如果我用另一个变量替换 x,假设 phi,如下所示:
fx.subs(x, phi)
我得到了一些意想不到的东西:
正在发生的事情是 sympy 在微分之前替换了方程中的 x,我希望它在微分之后替换它。我看到一些建议我应该使用 .doit(),但这并没有得到想要的解决方案:
fx.doit().subs(x, phi)
我做错了什么,微分后如何替换变量?
使用srepr
更直接地查看表达式的结构:
In [48]: f(x).diff(x).subs(x, pi)
Out[48]:
⎛d ⎞│
⎜──(f(x))⎟│
⎝dx ⎠│x=π
In [49]: srepr(f(x).diff(x).subs(x, pi))
Out[49]: "Subs(Derivative(Function('f')(Symbol('x')), Tuple(Symbol('x'), Integer(1))), Tuple(Symbol('x')), Tuple(pi))"
所以你可以看到 Subs
是用来表示 未计算的 替换:
In [50]: Subs(f(x).diff(x), x, phi)
Out[50]:
⎛d ⎞│
⎜──(f(x))⎟│
⎝dx ⎠│x=φ
然后 doit
用于使 Subs
评估 (通过执行替换):
In [51]: Subs(f(x).diff(x), x, phi).doit()
Out[51]:
d
──(f(φ))
dφ
我正在使用 sympy 推导一些方程式,并且我在代入时遇到了一些意外行为。假设我有一个函数 f(x),我像这样用 x 区分它:
fx = f(x).diff()
结果如下:
现在,如果我将 x 替换为 pi 之类的值,如下所示:
fx.subs(x, pi)
我得到:
但是,如果我用另一个变量替换 x,假设 phi,如下所示:
fx.subs(x, phi)
我得到了一些意想不到的东西:
正在发生的事情是 sympy 在微分之前替换了方程中的 x,我希望它在微分之后替换它。我看到一些建议我应该使用 .doit(),但这并没有得到想要的解决方案:
fx.doit().subs(x, phi)
我做错了什么,微分后如何替换变量?
使用srepr
更直接地查看表达式的结构:
In [48]: f(x).diff(x).subs(x, pi)
Out[48]:
⎛d ⎞│
⎜──(f(x))⎟│
⎝dx ⎠│x=π
In [49]: srepr(f(x).diff(x).subs(x, pi))
Out[49]: "Subs(Derivative(Function('f')(Symbol('x')), Tuple(Symbol('x'), Integer(1))), Tuple(Symbol('x')), Tuple(pi))"
所以你可以看到 Subs
是用来表示 未计算的 替换:
In [50]: Subs(f(x).diff(x), x, phi)
Out[50]:
⎛d ⎞│
⎜──(f(x))⎟│
⎝dx ⎠│x=φ
然后 doit
用于使 Subs
评估 (通过执行替换):
In [51]: Subs(f(x).diff(x), x, phi).doit()
Out[51]:
d
──(f(φ))
dφ