在同情中替换偏导数

时间:2015-08-24 20:44:13

标签: python sympy

我在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]

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

0 个答案:

没有答案