Ламбдификация Симпи-вектора - PullRequest
0 голосов
/ 08 февраля 2019

Я использую sympy для вычислений векторного исчисления, и мне стало интересно, существует ли простой способ численной оценки векторных и двоичных выражений.Я знаю функцию lambdify, которую можно использовать следующим образом:

from sympy.abc import x,lambdify

expr=x**x+1
lambda_expr=lambdify(x,expr)
print(lambda_expr(5.0))

Есть ли подобная функциональность для двоичных / векторных выражений?Я попытался следующий код, но он выдает синтаксическую ошибку:

from sympy.vector import CoordSys3D, Del

C=CoordSys3D('C')
nabla=Del()

#define some test vectorial field
B=C.x*C.y*C.z*(C.i+C.j+C.k)

#compute a field and a dyad
nabla_B=nabla.dot(B).doit()
rot_B=nabla.cross(B).doit()

#try to get lambda expressions...
lambda_nablaB=lambdify((C.x,C.y,C.z),nabla_b
lambda_rotB=lambdify((C.x,C.y,C.z),rot_B)

Синтаксическая ошибка:

 lambda C.x,C.y,C.z: (C.x*C.y*C.z*C.i + C.x*C.y*C.z*C.j + C.x*C.y*C.z*C.k)
                ^
    SyntaxError: invalid syntax

Я хочу, чтобы численно оценить поле / диаду и получить массив Numpy.

1 Ответ

0 голосов
/ 09 февраля 2019

Возможно, это не идеальный ответ, но, похоже, работает следующее решение.Функция evalsym преобразует вектор симппи в вектор с нулевыми числами:

C=CoordSys3D('C')

def evalsym(symvec,pos):
    numvec=num.zeros(3)
    numvec[0]=symvec.evalf(subs={C.x:pos[0],C.y:pos[1],C.z:pos[2]}).dot(C.i)
    numvec[1]=symvec.evalf(subs={C.x:pos[0],C.y:pos[1],C.z:pos[2]}).dot(C.i)
    numvec[2]=symvec.evalf(subs={C.x:pos[0],C.y:pos[1],C.z:pos[2]}).dot(C.i)
    return numvec
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...