2013-11-12 4 views
2

Я хотел бы построить 2 кривые на тот же рисунок со следующим кодом:Заговор 2 или более функций в одном графике

import sympy as syp 


x, y = syp.symbols('x, y') 

my_function = syp.exp(-(x-2)**2)*syp.exp(-(y-3)**2) + 2*syp.exp(-(x+1)**2)*syp.exp(-(y-1)**2) 

gradient_1 = syp.diff(my_function, x) 
gradient_2 = syp.diff(my_function, y) 


curve_1 = syp.plot_implicit(syp.Eq(gradient_1, 0)) 
curve_2 = syp.plot_implicit(syp.Eq(gradient_2, 0)) 

То, что я вижу, это только первый участок, в то время как я хотел бы иметь оба кривых на одном снимке, возможно, также с сеткой, если это возможно. Любые идеи?

Примечание: с Matplotlib это очень легко, но я не могу найти какой-либо конкретный пример для функции syp.plot_implicit

ответ

1

Это может сработать, если вы:

>>> curve_1.extend(curve_2) 
>>> curve_1.show() 

Однако смесительные неявные участки не могут быть реализовано.

Имейте в виду, что ваш curve_1 и curve_2 не то, что SymPy считает «одиночные кривые», т.е. Series экземпляра, а «коллекции ряда кривых», то есть Plot экземпляры.

Вы также можете извлечь объекты matplotlib от curve_1._backend.fig и других атрибутов _backend.

В заключение, есть хороший API, чтобы делать то, что вы хотите, но, вероятно, методы, стоящие за ним, еще не закончены.

+0

Да, это работает, это здорово! Я также нашел другой способ, используя «pyplot.contour» (см. [Здесь] (http://stackoverflow.com/questions/2484527/is-it-possible-to-plot-implicit-equations-using-matplotlib)), но для этого требуется ручной расчет градиента, поэтому ваш метод по-прежнему является лучшим. Знаете ли вы, можно ли его построить с помощью сетки? Я не вижу этот параметр в параметрах, которые могут быть переданы функции ... – user2983638

6

Другой, возможно, более эффективным способом, было бы вычислить и в то же время, используя Or

plot_implicit(Or(Eq(gradient_1, 0), Eq(gradient_2, 0))) 
+2

- это все-таки лучший способ обойти это или изменить что-то? – baxx

0

Другой способ:

curve_1.append(curve_2[0]) curve_1.show()

Смежные вопросы