我目前正在尝试制作一个程序,该程序将使用matplotlib绘制函数,绘制图形,遮蔽两个变量之间曲线下的区域,并使用Simpson的3/8规则计算阴影区域。但是,当试图打印分配给积分最终值的变量时,它会打印一个列表。
首先,这是我的代码的基础:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Polygon
这个定义定义了我将在这里使用的函数,一个简单的多项式。
def func(x):
return (x - 3) * (x - 5) * (x - 7) + 85
这是计算曲线下面积的函数
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
现在simpson的规则定义已经结束了,为了简单起见,我定义了一些变量。
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 x: y, 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)
ax.text(0.25, 135, r"Using Simpson's 3/8ths rule, the area under the curve is: ", fontsize=20)
这是应该打印整数值的地方:
ax.text(0.25, 114, final_integral , fontsize=20)
以下是绘制图表所需的其余代码:
plt.figtext(0.9, 0.05, '$x$')
plt.figtext(0.1, 0.9, '$y$')
ax.spines['right'].set_visible(False)
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()
此处的任何帮助表示赞赏。我完全卡住了。另外,对不起,如果这有点长,这是我在论坛上的第一个问题。
答案 0 :(得分:2)
您是否尝试直接将 simpson()函数提供给 func(),而不是使用lambda设置?
我认为这可行:
final_integral = simpson(func, a, b, 100000)
您也可以尝试:
final_integral = simpson(lambda x: func(x), a, b, 100000)
正在发生的是 y 是一个值为 func(x)的数组,当您使用表达式lambda x: y
时,实际上是在创建一个常量形式的函数 f(x)= y = const 。您的final_integral
是一个积分列表,其中每个被积函数都是常量函数,具有来自 y 数组的特定值。
请注意,如果您在图表上打印此数字,可能需要格式化此数字,以防它有大量的尾随小数点。如何执行此操作取决于您使用的是Python 2还是3。
答案 1 :(得分:1)