好的,通过将函数改为y = x并尝试一些已知的输入值,我得出结论:它可以正常工作:0 .. 1 => 0.5

0 .. 2 => 2.0

1 .. 2 => 1.5

0 .. 9 => 40.5

如果您想在一个函数中实现这一切,只需去掉parabola(),从approx_area()函数中删除第一个参数(并调用),然后更改:

^{pr2}$

收件人:height = mid * mid

如:def approx_area(a, b, n):

"""

Approximate the area under fn in the interval [a,b]

by adding the area of n rectangular slices.

"""

a = float(a)

b = float(b)

area = 0.0

for slice in range(n):

left = a + (b-a)*slice/n

right = a + (b-a)*(slice+1)/n

mid = (left + right)*0.5

height = mid * mid

width = right - left

area += height * width

return area

print "Area is", approx_area(-1, 1, 500)

请注意,我通常不会对家庭作业给予如此明确的帮助,但是,由于大部分作业都是你自己完成的,这只是一个小小的推动,可以让你越过这条线。在

我警告你不要按原样交这段代码,因为简单的网络搜索很容易在这里找到它,你的成绩可能会因此受到影响。在

仔细检查它,了解它是如何工作的,然后试着自己重新编写代码,而不要看这个源代码。相信我,这对你的职业生涯的帮助远不止盲目抄袭。在

为了理解这种方法背后的理论,考虑一下函数y = x的部分:7 .

6 /|

5 / |

| |

| |

| |

| |

| |

0 +-+

567

顶部的中点y坐标(以及高度)是(5 + 7) / 2,或者6,宽度是2,所以面积是12。在

这实际上是实际的面积,但这只是因为我们使用的公式。对于一个非线性公式,由于顶部“线”的性质,会有误差。具体来说,在你的例子中,抛物线是弯曲的。在

但是这些误差越来越小,你使用越来越薄的切片,因为任何一条直线都会随着你的缩短而趋向于一条直线(线性)。对于上面的例子,如果将其分成两个部分,那么面积将是5.5 x 1和{},总共是12。如果你的线条不直,两片的答案会比一片的答案更接近现实。在

对于你的抛物线(但是从x = 0 .. 1开始,为了让我的生活更轻松,只要把x = -1 .. 1的所有东西都加倍,因为它是围绕y轴对称的),这是单片解的最坏情况。在这种情况下,中点在x = 0.5, y = 0.25处,当你用y乘以1的宽度,就得到了0.25的面积。在

对于两个切片(width=0.5),中点位于:x y y x width

-

0.25 0.0625 0.03125

0.75 0.5625 0.28125

-

0.31250

所以面积估计是0.3125。在

对于四个切片(width=0.25),中点位于:x y y x width

-

0.125 0.015625 0.00390625

0.375 0.140625 0.03515625

0.625 0.390625 0.09765625

0.875 0.765625 0.19140625

0.32812500

所以面积估计是0.328125。在

对于八个切片(width=0.125),中点位于:x y y x width

-

0.0625 0.00390625 0.000488281

0.1875 0.03515625 0.004394531

0.3125 0.09765625 0.012207031

0.4375 0.19140625 0.023925781

0.5625 0.31640625 0.039550781

0.6875 0.47265625 0.059082031

0.8125 0.66015625 0.082519531

0.9375 0.87890625 0.109863281

-

0.332031248

所以面积估计是0.332031248。在

如您所见,这越来越接近1/3的实际面积(我知道这一点,因为我知道微积分,见下文)。在

希望这将有助于您理解现有的代码。在

如果你真的想知道这是怎么工作的,你需要研究微积分,特别是积分和微分。这些方法可以采用一个公式,并给出另一个计算直线斜率和直线下面积的公式。在

但是,除非你要经常使用它并且需要真正的(数学)精确性,否则你可能只需要使用你正在学习的近似方法。在