好的,通过将函数更改为y = x
并尝试一些已知的输入值,我得出结论它工作正常:
0 .. 1 => 0.5
0 .. 2 => 2.0
1 .. 2 => 1.5
0 .. 9 => 40.5
如果你想把它全部放在一个函数中,只需去掉parabola()
,从函数中删除第一个参数approx_area()
(并调用),然后更改:
height = fn(mid)
至:
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
和。如果你的线不是直的,那么两层的答案会比一层的答案更接近现实。6.5 x 1
12
对于您的抛物线(但x = 0 .. 1
为了让我的生活更轻松,x = -1 .. 1
因为它围绕 y 轴对称,所以只需将所有内容加倍),这是单片解决方案中的最坏情况。在这种情况下,中点位于 处x = 0.5, y = 0.25
,当您将其乘以y
的宽度时1
,您会得到 的面积0.25
。
有两个切片(宽度 = 0.5
),中点位于:
x y y x width
---- ------ ---------
0.25 0.0625 0.03125
0.75 0.5625 0.28125
---------
0.31250
所以面积估计有0.3125
。
有四个切片(宽度 = 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
。
有八个切片(宽度 = 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
(我知道这一点,因为我知道微积分,见下文)。
希望这将有助于您理解您拥有的代码。
如果你真的想知道它是如何工作的,你需要研究微积分,特别是积分和微分。这些方法可以采用一个公式,并为您提供另一个计算线斜率和线下面积的公式。
但是,除非您将大量使用它并且需要真实(数学)准确性,否则您可能只使用您正在学习的近似方法。