Цепное правило в симпы
Я пытаюсь немного попрактиковаться с SymPy. Я хотел бы символически взять вторую производную функции в прямоугольных координатах по параметру радиуса в полярных координатах.
Мне бы хотелось хорошее символическое выражение правила цепочки, где оно вычисляет, что может, и оставляет недооцененным то, что не может быть упрощено в дальнейшем.
from sympy import *
init_session()
x, y, r, t = symbols('x y r t') # r (radius), t (angle theta)
f, g = symbols('f g', cls=Function)
g = f(x,y)
x = r * cos(t)
y = r* sin(t)
Derivative(g,r, 2).doit()
Этот код дает 0
, Есть ли способ получить символическое представление ответа, а не 0?
1 ответ
Краткий ответ: Ваши команды не в порядке.
Длинный ответ:
x, y, r, t = symbols('x y r t') # r (radius), t (angle theta)
f, g = symbols('f g', cls=Function)
g = f(x,y)
Сейчас x,y
являются символами, f
является функцией и g
является прикладной функцией, т.е. символами x,y
применительно к f
как f(x,y)
,
x = r * cos(t)
y = r* sin(t)
Теперь вы переопределяете x
а также y
как выражение r
а также t
, Это не влияет g
в малейшей степени!
Derivative(g,r, 2).doit()
Теперь вы выводите g
WRT r
, Как g
все еще определяется через начальные символы x,y
это не зависит от r
, таким образом, производная равна нулю.
Чтобы достичь того, что вы хотите, используйте это:
from sympy import *
r, t = symbols('r t') # r (radius), t (angle theta)
f = symbols('f', cls=Function)
x = r* cos(t)
y = r* sin(t)
g = f(x,y)
Derivative(g,r, 2).doit()
Я также отбросил все ненужные определения символов.