LINUX.ORG.RU

sympy.funct -> numpy->funct автоматом

 , ,


0

1

Нужно путем дифференцирования, с использованием sympy, получить функцию, а затем эту функцию использовать в расчетах. Причем параметрами функции будут выступать numpy матрицы в общем случае. Возникает проблема при использовании sympy функций (в примере ниже с логарифмом log, причем в этом примере log даже не попадает результат диференцирования). Что можно сделать, чтобы dFx принимала numpy - матрицы или вектора?

$ cat simplytest.py 
#!/usr/bin/python
import numpy
import sympy
x,y=sympy.symbols('x y')
F=x**2+sympy.log(y*x)
dFx=sympy.diff(F,x)
sympy.pprint(dFx)
funct_dFx=sympy.lambdify((x,y),F)
print funct_dFx(1,1)

def diffFx(x):
    return funct_dFx(x[0].reshape(-1,1),x[1].reshape(1,-1))

o=numpy.linspace(0,numpy.pi,4)
vect_x=numpy.array([numpy.cos(o),numpy.sin(o)])
print diffFx(vect_x)

$ ./simplytest.py 
      1
2⋅x + ─
      x
1.0
Traceback (most recent call last):
  File "./simplytest.py", line 16, in <module>
    print diffFx(vect_x)
  File "./simplytest.py", line 12, in diffFx
    return funct_dFx(x[0].reshape(-1,1),x[1].reshape(1,-1))
  File "<string>", line 1, in <lambda>
TypeError: only length-1 arrays can be converted to Python scalars

P.S. если удалить log, то все ok - пробовал разные выражения, но без мат. функций (типа F=x**2+y/x). но мне нужно log и другие функции.



Последнее исправление: dmitry-d67 (всего исправлений: 2)

Я хоть и ничего не понимаю в символьных вычислениях, имею подозрение, что log в данном случае непричастен к ошибке - я видел такое же сообщение в программах на чистом numpy.

tailgunner ★★★★★
()
Ответ на: комментарий от baverman

просто тестировал и оставил F, котор. содерж. log

dmitry-d67
() автор топика
Ответ на: комментарий от tailgunner

без log все ok.

$ cat simplytest.py 
#!/usr/bin/python
import numpy
import sympy
x,y=sympy.symbols('x y')
F=x**2+y/x
dFx=sympy.diff(F,x)
sympy.pprint(dFx)
funct_dFx=sympy.lambdify((x,y),dFx)
print funct_dFx(1,1)

def diffFx(x,z):
    return funct_dFx(x[0].reshape(-1,1),z[0].reshape(1,-1))

o=numpy.linspace(0,numpy.pi,4)
vect_x=numpy.array([numpy.cos(o),numpy.sin(o)])
vect_z=numpy.array([[0.0,1.0],[2.0,3.0]])
print diffFx(vect_x,vect_z)

$ ./simplytest.py 
      y 
2⋅x - ──
       2
      x 
1.0
[[ 2.  1.]
 [ 1. -3.]
 [-1. -5.]
 [-2. -3.]]

dmitry-d67
() автор топика
Ответ на: комментарий от tailgunner

в первом посте может не самый лучший вариант примера, но точно установил, что проблема в sympy.log, sympy.exp и других функциях. Они не хотят принимать вектор как аргумент. Если бы можно было как нибуть заменить sympy.log на numpy.log, то все бы заработало.

dmitry-d67
() автор топика
Ответ на: комментарий от dmitry-d67

проблема решена

funct_dFx=sympy.lambdify((x,y),dFx,modules='numpy')
dmitry-d67
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.