好的,通过将函数改为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的实际面积(我知道这一点,因为我知道微积分,见下文)。在
希望这将有助于您理解现有的代码。在
如果你真的想知道这是怎么工作的,你需要研究微积分,特别是积分和微分。这些方法可以采用一个公式,并给出另一个计算直线斜率和直线下面积的公式。在
但是,除非你要经常使用它并且需要真正的(数学)精确性,否则你可能只需要使用你正在学习的近似方法。在