Python 如何用Sympy绘制点?

Python 如何用Sympy绘制点?,python,matplotlib,sympy,graphing,Python,Matplotlib,Sympy,Graphing,我需要计算并绘制一个函数,它的前两个导数。然后,我需要在图上绘制原始函数的最小点和最大点。我已经计算了这些数据,但对于如何绘制数据图表却一无所知。 最小/最大点的x值为 关键点[] y值为 criticalPointsY[] 下面是出现错误的代码段 equation=CreateFunction(); firstDeriv=equation.diff(x); secondDeriv=firstDeriv.diff(x); print(equation); critical

我需要计算并绘制一个函数,它的前两个导数。然后,我需要在图上绘制原始函数的最小点和最大点。我已经计算了这些数据,但对于如何绘制数据图表却一无所知。 最小/最大点的x值为
关键点[]

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();
当我运行程序时,我得到了这个错误。 `


有没有办法在这张图上画点?(p)

同向图可以与。但是,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()

我已经解决了这个问题。由于方程的导数要么不存在,要么是一条水平线,所以出现了这种困境

x = symbols('x')
UserInput()
equation = CreateFunction()
firstDeriv = equation.diff(x)
secondDeriv = firstDeriv.diff(x)
workingEquations=[]
hasEquations=False
我在这一段中所做的是通过将方程转换成字符串进行测试,看看是否有x值。如果有一个,我会将这个方程附加到一个数组中,我们稍后将访问该数组,否则,我会绘制水平线。如果我们有一个带变量的方程,我也会翻出一个布尔来告诉我们

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()

为了在这种情况下使用Symphy定义临界点,并在
matplotlib.pyplot
中绘制结果,可以使用
Symphy.utilities.lambdify
方法生成要在
mathplotlib
中绘制的点列表(以下由用户6655984发布)

数组是构造的,但如果在
numpy.transpose
步骤中绘制了一个常量值,则数组的长度可能不相同。因此,在第一个
matplotlib.pyplot
之前传递一个条件

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

x = symbols('x')
equation = x**2 + 2 #OK = x*exp(-x**2/10) OR x**2 + 2
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, 100)
lam_f= lambdify(x, [equation, firstDeriv, secondDeriv])
yy=[elem if  type(elem) == np.ndarray else np.full(len(xx), elem) for elem in lam_f(xx)]
plt.plot(xx, np.transpose(yy))
plt.plot(criticalPoints, criticalPointsY, 'k*')
plt.show()

“'FiniteSet'对象不支持索引”与plottin无关。集合没有顺序,所以要求它的第一个或第二个元素是没有意义的。使用
criticalPoints=list(solveset(firstDeriv,x))
。另外,
equation=CreateFunction()对于那些不知道什么是
CreateFunction()的人来说是没有用的是。我已经调整了列表,但是由于我在“plt”上绘制点,所以点绘制在不同的图形上。有没有办法将它们绘制在“p”上?我尝试时收到第二个错误。Create function从已经收集的用户输入返回一个函数y,形式为x。我并没有把它放在房间里。这些编辑有时有效,但很少用多项式。“plt.plot(xx,np.transpose(yy))”行抛出错误,指出xx和np.transpose(yy)分别具有不同的第一维度(1000,)和(3,)。我正在研究一个解决方案,但不明白为什么它们会以不同的维度输出。我正在用“等式=x**2+6”测试它,谢谢!帮助我想象一件事。我最初试图与它的plot3d&co合作完成这项工作,但被卡住了。使用numpy+matplotlib获得成功,完全跳过SymPy。
if(hasEquations):
    xx = np.linspace(-10, 10, 1000)
    yy = lambdify(x, workingEquations)(xx)
    plt.plot(xx, np.transpose(yy))
plt.show()
from sympy import *
import numpy as np
import matplotlib.pyplot as plt

x = symbols('x')
equation = x**2 + 2 #OK = x*exp(-x**2/10) OR x**2 + 2
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, 100)
lam_f= lambdify(x, [equation, firstDeriv, secondDeriv])
yy=[elem if  type(elem) == np.ndarray else np.full(len(xx), elem) for elem in lam_f(xx)]
plt.plot(xx, np.transpose(yy))
plt.plot(criticalPoints, criticalPointsY, 'k*')
plt.show()