我需要计算和绘制一个函数,它是前两个导数。然后,我需要在图表上绘制原始函数的最小和最大点。我已经计算了这些,但是对于如何绘制数据图形却迷失了。
最小/最大点的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'
有没有办法在此图上绘制点? (p)
答案 0 :(得分:0)
SymPy图可以与p.extend
组合。但是,SymPy图类型不包括点图,这是关键点所需的。在这种情况下,应该直接使用matplotlib,无论如何SymPy都会使用matplotlib。
这是一个基于您的代码的示例,但没有分号,具有列表理解,并且对所有绘图都使用了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()
答案 1 :(得分:0)
我已解决此问题。由于方程的导数可能不存在,或者水平线,因此出现了难题。
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()
答案 2 :(得分:0)
在这种情况下,为了使用Sympy定义关键点并在matplotlib.pyplot
中绘制结果,可以使用sympy.utilities.lambdify
方法生成要在{{1}中绘制图形的点的列表}(根据user6655984的帖子)。
已构造数组,但是如果绘制常量值(在mathplotlib
步骤中存在问题),数组的长度可能不相同。因此,条件是在第一个numpy.transpose
之前传递的。
matplotlib.pyplot
答案 3 :(得分:0)
在这种情况下,为了使用Sympy定义关键点并在matplotlib.pyplot
中绘制结果,可以使用sympy.utilities.lambdify
方法生成要在{{1}中绘制图形的点的列表}(根据user6655984的帖子)。
已构造数组,但是如果绘制常量值(在mathplotlib
步骤中存在问题),数组的长度可能不相同。因此,必须在第一个numpy.transpose
之前通过条件。
matplotlib.pyplot