2017-01-23 9 views
2

Когда следующий код запускается Derivative(Ksi(uix, uiy), uix)) и Derivative(Ksi(uix, uiy), uiy)) термины появляются:Можем ли мы заменить «производные» члены в sympy, исходящие из дифференциации переменных sympy.Function?

In [4]: dgN 
Out[4]: 
Matrix([ 
[-(x1x - x2x)*(-x1y + x2y)*((x1x - x2x)**2 + (-x1y + x2y)**2)**(-0.5)*Derivative(Ksi(uix, uiy), uix) + (-x1y + x2y)*(-(-x1x + x2x)*Derivative(Ksi(uix, uiy), uix) + 1)*((x1x - x2x)**2 + (-x1y + x2y)**2)**(-0.5)], 
[-(-x1x + x2x)*(-x1y + x2y)*((x1x - x2x)**2 + (-x1y + x2y)**2)**(-0.5)*Derivative(Ksi(uix, uiy), uiy) + (x1x - x2x)*(-(-x1y + x2y)*Derivative(Ksi(uix, uiy), uiy) + 1)*((x1x - x2x)**2 + (-x1y + x2y)**2)**(-0.5)]]) 

Я хотел бы заменить этот Derivative условия от, скажем, символическое выражение производной функции, я знаю, я, например, хотел бы установить Derivative(Ksi(uix,uiy), uix) = 2 * uix. Есть ли опрятный способ сделать эту замену и получить символическое выражение для dgN с Derivative(Ksi(uix,uiy), uix), установленное в 2 * uix? Вот мой код:

import sympy as sp 

sp.var("kPenN, Xix, Xiy, uix, uiy, Alpha, x1x, x1y, x2x, x2y, x3x, x3y ", real = True) 
Ksi = sp.Function('Ksi')(uix,uiy) 
Xi   = sp.Matrix([Xix, Xiy]) 
ui   = sp.Matrix([uix, uiy]) 
xix   = Xix + uix 
xiy   = Xiy + uiy 
xi   = sp.Matrix([xix, xiy]) 
x1 = sp.Matrix([x1x, x1y]) 
x2 = sp.Matrix([x2x, x2y]) 

N   = sp.Matrix([x2 - x1, sp.zeros(1)]).cross(sp.Matrix([sp.zeros(2,1) , sp.ones(1)])) 
N = sp.Matrix(2,1, sp.flatten(N[0:2])) 
N = N/(N.dot(N))**(0.5) 

xp = x1 + (x2 - x1)*Ksi 
# make it scalar (in agreement with 9.231) 
gN = (xi - xp).dot(N) 
dgN = sp.Matrix([gN.diff(uix), gN.diff(uiy)]) 
+0

Похоже, вы сделали бы это с помощью того же инструмента, который вы используете для любой другой подстановки, метода ['subs'] (http://docs.sympy.org/latest/tutorial/basic_operations.html#substitution). Разве это не сработало? – user2357112

+0

Я не работал. Возможно, я сделал это неправильно – MarcoMag

ответ

2

Замещение вы хотите, может быть достигнуто с

dgN_subbed = dgN.subs(sp.Derivative(Ksi, uix), 2*uix) 

Здесь Ksi есть без аргументов (UIX, Uiy), так как те были уже объявлены, когда K была создана.

Синтаксис будет немного понятнее, если вы использовали from sympy import *, избегая префикс sp везде (это разумно, что нужно сделать: SymPy пространства имен не столь огромна и нежелательные конфликты с другими модулями, вряд ли).

+0

Это прекрасно работает. Я добавлял аргументы после Ksi, как 'dgN.subs (sp.Derivative (Ksi (uix, uiy), uix), 2 * uix)' – MarcoMag

+1

Переменная 'Ksi' уже вызывается с аргументами, когда вы ее определяете. Вы можете либо написать 'Ksi = Function (" Ksi ")' и называть его аргументами каждый раз, когда вы это используете, либо 'Ksi = Function (" Ksi ") (uix, uiy)' и использовать его как просто 'Ksi' (I предпочла бы первый случай, если вы когда-нибудь захотите вызвать функцию с разными аргументами). – asmeurer