我在SymPy中学习扰动。让我们说我有一个表达式U(X,Y)= 0,其中U是X和Y的函数。该函数对于Y没有闭合形式的解,所以我用它围绕a的泰勒展开来近似它。通过对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),))
我知道如何将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)
如果我有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]
等等。注意,要替换的第一个变量是感兴趣的衍生物;它被一个虚拟变量所取代,可以解决表达式。然后替换所有其他衍生物(其值从前面的步骤中得知);然后替换参数和变量。这确实有效,但我曾希望有更优雅的方式来做到这一点。显然不是。