我正在学习SymPy中的扰动 . 假设我有一个表达式U(X,Y)= 0,其中U是X和Y的函数 . 该函数没有Y的闭合形式解,所以我用一个已知解的泰勒展开来近似它我的表达式相对于X的第一,第二,第三等衍生物,其中我考虑到Y是X的函数:

dU(X,Y(X))/ dX = U_X U_Y * Y_X

要找到Y_X,我需要用已知解决方案中的值替换U_X和U_Y . 以下SymPy代码,但是......

from sympy import *

X, b = symbols('X b')
U = Function('U')
Y = Function('Y')(X)

diff1 = diff(U(X,Y))
print diff1

...给我以下输出:

Derivative(U(X, Y(X)), X) +
Derivative(Y(X), X)*Subs(Derivative(U(X, _xi_2), _xi_2), (_xi_2,), (Y(X),))

我知道如何用变量 b 替换 Derivative(Y(X), X)

diff1.subs({diff(Y,X):b})
b*Subs(Derivative(U(X, _xi_2), _xi_2), (_xi_2,), (Y(X),)) + 
Derivative(U(X, Y(X)), X)

如果我有U_X( Derivative(U(X, y(X)), X) )和U_Y( Subs(Derivative(U(X, _xi_2), _xi_2), (_xi_2,), (Y(X),)) )的数值,我可以为 b 解决这个问题然后我估算了Y_X,但是如何用一些数值替换这些偏导数呢?

作为对第一个评论的回应:例如,一种解决方案确实是使用U的显式形式

X, b = symbols('X b')
Y = Function('Y')(X)
U = (X**0.5)*(Y**0.5)-100

diff1 = diff(U,X)
diff1 = diff1.subs({diff(Y,X):b,Y:100,X:100})
sol1 = solve(diff1,b)[0]

diff2 = diff(U,X,2)
diff2 = diff2.subs({diff(Y,X,2):b,diff(Y,X):sol1,Y:100,X:100})
sol2 = solve(diff2,b)[0]

diff3 = diff(U,X,3)
diff3 = diff3.subs({diff(Y,X,3):b,diff(Y,X,2):sol2,diff(Y,X):sol1,Y:100,X:100})
sol3 = solve(diff3,b)[0]

等等 . 注意,要替换的第一个变量是感兴趣的衍生物;它被一个虚拟变量所取代,使人能够解决表达式 . 然后替换所有其他衍生物(其值从前面的步骤中得知);然后替换参数和变量 . 这确实有效,但我曾希望有更优雅的方式来做到这一点 . 显然不是 .