我目前正在编写一个程序,该程序使用Simpson的3/8规则对多项式进行绘制并对两个端点之间的曲线下面积进行阴影处理,然后在图形上打印该信息。目前,该程序适用于两个端点(2和9)之间的一个多项式("(x-3)*(x-5)*(x-7)+ 85")。但是,当尝试让程序使用输入命令接受多项式或任一端点的输入时,程序会冻结并崩溃而不构建图形。即使重新输入当前号码,也会发生这种情况。以下是代码:
这是代码的基础
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Polygon
这里我将多项式定义为func(x)
def func(x):
return (x - 3) * (x - 5) * (x - 7) + 85
这里我定义了使用Simpson规则计算曲线下面积的函数
def simpson(function, a, b, n):
"""Approximates the definite integral of f from a to b by the
composite Simpson's rule, using n subintervals (with n even)"""
if n % 2:
raise ValueError("n must be even (received n=%d)" % n)
h = (b - a) / n #The first section of Simpson's 3/8ths rule
s = function(a) + function(b) #The addition of functions over an interval
for i in range(1, n, 2):
s += 4 * function(a + i * h)
for i in range(2, n-1, 2):
s += 2 * function(a + i * h)
return(s * h / 3)
这里我定义了要集成的端点
a, b = 2, 9 # integral limits
为方便起见,这里还有一些定义
x = np.linspace(0, 10) #Generates 100 points evenly spaced between 0 and 10
y = func(x) #Just defines y to be f(x) so its ez later on
fig, ax = plt.subplots()
plt.plot(x, y, 'r', linewidth=2)
plt.ylim(ymin=0)
final_integral = simpson(lambda t:func(t), a, b, 100000)
这里我构建了阴影区域
# Make the shaded region
ix = np.linspace(a, b)
iy = func(ix)
verts = [(a, 0)] + list(zip(ix, iy)) + [(b, 0)]
poly = Polygon(verts, facecolor='0.9', edgecolor='0.5')
ax.add_patch(poly)
这里我在图表上打印积分表示法
plt.text(0.5 * (a + b), 30, r"$\int_a^b f(x)\mathrm{d}x$",
horizontalalignment='center', fontsize=20)
在这里,我打印曲线下的区域,由simpson的3/8规则计算在图表上
ax.text(0.25, 135, r"Using Simpson's 3/8ths rule, the area under the curve is: ", fontsize=20) #r denotes a raw string
ax.text(0.25, 114, final_integral , fontsize=20) #prints the value of the
integral defined using simpson's 3/8ths prior
在这里,我完成了图表的构建
plt.figtext(0.9, 0.05, '$x$')
plt.figtext(0.1, 0.9, '$y$')
ax.spines['right'].set_visible(False) #no dashes on axis
ax.spines['top'].set_visible(False)
ax.xaxis.set_ticks_position('bottom')
ax.set_xticks((a, b))
ax.set_xticklabels(('$a$', '$b$'))
ax.set_yticks([])
plt.show()
然而,当我更改定义端点的行时,读取' a,b = int(输入("以格式2,9和#34输入端点))#integitude limits& #39;,程序errors out as shown.
任何帮助将不胜感激。我很难理解这种困境,所以我赞成不提供更多信息。
答案 0 :(得分:1)
这是运行时系统中的一个错误,因为它没有给出错误消息。崩溃很少是可接受的响应。
我怀疑最近的原因是您的无效输入转换: int 采用带有单个整数的字符串参数。当您尝试将此分配给两个变量时,应该收到一条消息,告诉您没有足够的值来解压缩...但首先,您将获得尝试将字符串(如“2,9”)转换为单个整数时的ValueError。
试试这个,而不是:
str_in = input("enter your endpoints in the format 2,9") # integral limits
fields = str_in.split(',')
a, b = [int(i) for i in fields]
您可以添加错误检查或将其折叠为一行 - 但我希望您现在可以看到所需的处理。