Използване на sympy с mayavi

Имам проект, в който бих искал да начертая резултатите от някаква манипулация на SymPy с mayavi. По-специално, бих искал да използвам някаква функция в contour3d. Ето какво измислих, но не работи

#!/usr/bin/env python2

from sympy import *
from mayavi.mlab import *
from functools import partial
import numpy as np

def XYZ(f, xp, yp, zp):
  return f.evalf(subs={x:xp,y:yp,z:zp})


x, y, z = symbols('x y z')
r=x**2+y**2+z**2

F=partial(XYZ, r)

X, Y, Z = np.mgrid[-3:3:50j, -3:3:50j, -3:3:50j]

obj=contour3d(X, Y, Z, F)

Въпреки това се показват две грешки (и двете от sympify)

1.) Както е написано, грешката е

ValueError: sequence too large; must be smaller than 32

2.) Намаляване на броя на точките (до 10 във всяка посока)

ValueError: negative dimensions are not allowed

Някакви мисли как да накарате нещо подобно да работи? Мисля, че тези два пакета ще вървят добре заедно.


person Benjamin Pritchard    schedule 12.12.2013    source източник


Отговори (1)


Първо, бих искал да отбележа, че екипът на SymPy ще бъде много благодарен, ако допринесете с бекенд на mayavi за нашия модул за чертане (за момента имаме само бекенд на matplotlib, който не е чудесен за 3d).

Същността на вашия проблем изглежда е, че numpy и sympy не си сътрудничат добре. По принцип не трябва да очаквате (поне засега), че функциите на sympy знаят как да оценяват въведените масиви (те не са ufuncts, както би било казано в numpy).

Текущото решение на този проблем е да се използва lambdify. Има своите проблеми, но работи достатъчно добре. Подобна, но частна функция, наречена experimental_lambdify се използва за собствения модул за чертане на sympy. Виж тук:

https://github.com/sympy/sympy/blob/master/sympy/plotting/plot.py#L750

По-конкретно get_meshes(). Или всички други get_something методи. Ако сте мързеливи, можете просто да ги използвате повторно, като създадете sympy Plot обект, без всъщност да го чертаете в matplotlib:

your_plot_object = plot3d_parametric_surface(expr_x, expr_y, expr_z, range_u, range_v, show=False)
the_single_geometrical_object_in_this_plot = your_plot_object[0]
your_meshes = the_single_geometrical_object_in_this_plot.get_meshes()
person Krastanov    schedule 13.12.2013
comment
Е, аз давам пример за параметрична повърхност, така че няма да работи директно във вашия случай, но можете просто да копирате и поставите подходящия код от get_meshes() и да импортирате останалото от текущия модул за чертане на sympy. Отново, екипът ще бъде благодарен за приноса на нов бекенд за чертане. - person Krastanov; 13.12.2013
comment
За съжаление е малко вероятно да съм достатъчно опитен в момента, за да внедря такъв бекенд. Това обаче би било много готина функция. - person Benjamin Pritchard; 13.12.2013
comment
Да, би било страхотно да накарам mayavi да работи със SymPy, особено сега, когато Anaconda идва с mayavi, така че всъщност мога да го инсталирам на моя Mac. - person asmeurer; 17.12.2013