我正在尝试使用Python从链接中复制数学运算。
我设法集成了功能,但无法在指定的时间间隔内绘制它。我试图使用安排来获取参数值并将其相对于函数进行绘制,但是它不起作用。
有人知道如何使它工作吗?
我的代码段:
from scipy.integrate import quad
def f(x):
if x >= 0 and x <= 2:
return x ** 2
elif x > 2 and x <= 4:
return 4
else:
return 0
res = quad(f, 0, 5)
print(res)
答案 0 :(得分:2)
我假设您想绘制函数f(x),而不是对其进行积分的结果。为此,您将需要创建一个x值的列表(类似您的声音),为每个值计算f,然后使用matplotlib的plot函数显示结果。
arange的文档说:“当使用非整数步骤(例如0.1)时,结果通常将不一致。对于这些情况,最好使用linspace。”您可能希望在x中使用非整数步进行绘图,否则您将使用绘图的大部分细节。因此,我建议切换到linspace。
import numpy as np
from matplotlib.pyplot import plot
xvals = np.linspace(0,6,100) #100 points from 0 to 6 in ndarray
yvals = list(map(f, xvals)) #evaluate f for each point in xvals
plot(xvals, yvals)
最有可能遇到问题的地方是直接将函数f应用于ndarray。它的编写方式是,f期望将单个值作为输入而不是数组。 Map通过将f分别应用于ndarray中的每个值来解决此问题。
编辑:要使用sympy符号功能:
您也可以在sympy中定义分段函数。对于您要在问题中尝试完成的事情,这与使用所描述的原始方法没有什么不同。但是,如果您想对函数进行进一步的符号操作,这可能会很有用。
import sympy
x = sympy.symbols('x')
f = sympy.Piecewise((0, x>4),(4, x>2) ,(x**2, x>=0)) #defines f as a symbolic function
sympy.plot(f, (x, 0,6)) #Plots f on the interval 0 to 6
请注意,在分段函数的定义中,条件是按顺序评估的,因此定义它们的顺序确实很重要。例如,如果交换前两个条件,则将永远不会满足x> 4的条件,因为始终首先满足x> 2。这就是为什么条件与原始功能的定义顺序相反的原因。