在同情中替换偏导数

use*_*691 5 python sympy

我正在学习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
Run Code Online (Sandbox Code Playgroud)

...给我以下输出:

Derivative(U(X, Y(X)), X) +
Derivative(Y(X), X)*Subs(Derivative(U(X, _xi_2), _xi_2), (_xi_2,), (Y(X),))
Run Code Online (Sandbox Code Playgroud)

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

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)
Run Code Online (Sandbox Code Playgroud)

如果我有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]
Run Code Online (Sandbox Code Playgroud)

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