Как построить график с помощью Sympy? - PullRequest
0 голосов
/ 14 ноября 2018

Мне нужно вычислить и построить график функции, и это первые две производные. Затем мне нужно отобразить минимальные и максимальные точки исходной функции на графике. Я рассчитал это, но я потерял, как наметить данные. Значения x для минимальной / максимальной точек criticalPoints[]

со значениями y, равными

criticalPointsY[]

Вот сегмент кода, где появляется ошибка.

equation=CreateFunction();
    firstDeriv=equation.diff(x);
    secondDeriv=firstDeriv.diff(x);
    print(equation);
criticalPoints=solveset(firstDeriv,x);
criticalPointsY=[];
for a in criticalPoints:
    criticalPointsY.append(equation.subs(x,a));

p=plot(equation,firstDeriv,secondDeriv,(x,-10,10));
# Need to add the critical points to the graph. We have them, and the
# y values, but need to put them on the graphs.
print(criticalPoints)
print(criticalPointsY);
for a in range(0, len(criticalPoints)):
    xval=criticalPoints[a];
    yval=criticalPointsY[a];
    plt.plot(xval, yval, 'ro')
p.show();
plt.show();

Когда я запускаю программу, я получаю эту ошибку. `

Traceback (most recent call last):
  File "--------", line 58, in <module>
    xval=criticalPoints[a];
TypeError: 'FiniteSet' object does not support indexing

Я попытался построить точки на p и получить другую ошибку

    p.plot(criticalPoints,criticalPointsY);
AttributeError: 'Plot' object has no attribute 'plot'

Есть ли способ построить точки на этом графике? (Р)

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018

Я исправил проблему. Дилемма возникала из-за уравнений, чьи производные были бы либо несуществующими, либо горизонтальной линией.

x = symbols('x')
UserInput()
equation = CreateFunction()
firstDeriv = equation.diff(x)
secondDeriv = firstDeriv.diff(x)
workingEquations=[]
hasEquations=False

В этом сегменте я проверяю, преобразовывая уравнение в строку и проверяя, есть ли значение x. Если он присутствует, я добавляю уравнение в массив, к которому мы будем обращаться позже, в противном случае я строю график горизонтальной линии. Я также переключаю bool, чтобы сообщить нам позже, если у нас есть уравнение с переменной.

if(not str(equation).find("x")==-1):
    workingEquations.append(equation)
    hasEquations=True
    print("True")
else:
    plt.axhline(y=equation)
if(not str(firstDeriv).find("x")==-1):
    workingEquations.append(firstDeriv)
else:
    plt.axhline(y=firstDeriv)
if(not str(secondDeriv).find("x")==-1):
    workingEquations.append(secondDeriv)
else:
    plt.axhline(y=secondDeriv)
try:
    criticalPoints = list(solveset(firstDeriv, x))
    criticalPointsY = [equation.subs(x, a) for a in criticalPoints]
    plt.plot(criticalPoints, criticalPointsY, 'k*')
except:
    print("No critical points")

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

if(hasEquations):
    xx = np.linspace(-10, 10, 1000)
    yy = lambdify(x, workingEquations)(xx)
    plt.plot(xx, np.transpose(yy))
plt.show()
0 голосов
/ 15 ноября 2018

графики SymPy можно комбинировать с p.extend. Однако типы графиков SymPy не включают точечные графики, что вам и нужно для критических точек. В таких случаях следует использовать matplotlib напрямую, что SymPy будет делать в любом случае под капотом.

Вот пример, основанный на вашем коде, но без точек с запятой, с пониманием списка и с matplotlib, используемым для всех графиков. Обратите внимание, что lambdify предоставляет способ для эффективной оценки набора выражений SymPy в нескольких точках.

from sympy import *
import numpy as np
import matplotlib.pyplot as plt

x = symbols('x')
equation = x*exp(-x**2/10)
firstDeriv = equation.diff(x)
secondDeriv = firstDeriv.diff(x)
criticalPoints = list(solveset(firstDeriv, x))
criticalPointsY = [equation.subs(x, a) for a in criticalPoints]
xx = np.linspace(-10, 10, 1000)
yy = lambdify(x, [equation, firstDeriv, secondDeriv])(xx)
plt.plot(xx, np.transpose(yy))
plt.plot(criticalPoints, criticalPointsY, 'k*')
plt.show()

plot

...