Sympy: проблема с упрощением вектора Sympy из пользовательского преобразования.Python

Программы на Python
Ответить
Anonymous
 Sympy: проблема с упрощением вектора Sympy из пользовательского преобразования.

Сообщение Anonymous »

Я создаю собственную систему координат с помощью векторного модуля и столкнулся с каким-то странным поведением.
Краткая версия:
Почему этот код возвращает нулевой вектор?
from sympy import Function
from sympy.vector import CoordSys3D, gradient

S = CoordSys3D('S',transformation=lambda x,y,z : (x, y, z), \
variable_names=('x','y','z'))

f = Function('f')
grad_f = gradient(f(S.x,S.y,S.z)).simplify()
print(grad_f)

0

Длинная версия:
Во-первых, следующее работает должным образом.
import sympy as sp
from sympy.vector import CoordSys3D, gradient

R = CoordSys3D('R')
f = sp.Function('f')

grad_f = gradient(f(R.x,R.y,R.z))
print(grad_f)
print(grad_f.simplify())

(Derivative(f(R.x, R.y, R.z), R.x))*R.i + (Derivative(f(R.x, R.y, R.z), R.y))*R.j + (Derivative(f(R.x, R.y, R.z), R.z))*R.k
(Derivative(f(R.x, R.y, R.z), R.x))*R.i + (Derivative(f(R.x, R.y, R.z), R.y))*R.j + (Derivative(f(R.x, R.y, R.z), R.z))*R.k

Однако, когда я пробую описанное выше в системе координат, созданной с помощью пользовательского преобразования, последний шаг упрощения не возвращает ожидаемый результат.
S = CoordSys3D('S',transformation=lambda x,y,z : (x, y, z),variable_names=('x','y','z'))

grad_f = gradient(f(S.x,S.y,S.z))
print(grad_f)
print(grad_f.simplify())

Сам градиент вычисляется правильно, но шаг упрощения возвращает вектор 0:
(Derivative(f(S.x, S.y, S.z), S.x))*S.i + (Derivative(f(S.x, S.y, S.z), S.y))*S.j + (Derivative(f(S.x, S.y, S.z), S.z))*S.k
0

При нетривиальном преобразовании координат (например, в сферической системе, определяемой пользователем) этап упрощения может занять несколько минут, прежде чем вернется (неправильный?) 0.
Это ошибка? Или я что-то упускаю из пользовательского преобразования?
ОБНОВЛЕНИЕ:
Следующее работает (но почему?)
x,y,z = sp.symbols('x,y,z')
grad_f = grad_f.subs({S.x : x, S.y : y, S.z : z})
print(grad_f)
print(grad_f.simplify())

с ожидаемыми результатами
(Derivative(f(x, y, z), x))*S.i + (Derivative(f(x, y, z), y))*S.j + (Derivative(f(x, y, z), z))*S.k
(Derivative(f(x, y, z), x))*S.i + (Derivative(f(x, y, z), y))*S.j + (Derivative(f(x, y, z), z))*S.k


Подробнее здесь: https://stackoverflow.com/questions/798 ... sformation
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»