我无法离开previous question,因为我不是该网站的成员,所以当我回来时,我无法发表评论。 这是我的问题:
为了找到由图y = x ^ 2和区间[a,b]上的x轴限定的区域的区域,我们可以通过绘制多个“薄”矩形并取总和来近似该区域他们的领域。让我们将[a,b]分成相同widght h = b-1 / n的n个较小间隔。在每个间隔上有一个高度为y = r的矩形,其中r是x轴上那个小间隔的中间。那个矩形的区域是hy。编写一个Python函数,它将a,b和n作为参数,并使用上述方法返回抛物线y = x ^ 2下区域的近似区域。如果你能解释为什么你的程序有用,那将是有帮助的。
感谢有用的会员,我找到了以下程序(请编辑程序,因为我无法/不知道如何
def parabola(x):
y = x*x
return y
def approx_area(fn, 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 = fn(mid)
width = right - left
area += height * width
return area
print "Area is", approx_area(parabola, -1.0, 1.0, 500)
但是,我需要将其置于一个完整的功能之下。关于如何做到这一点的任何想法?
答案 0 :(得分:3)
好的,通过将函数更改为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
的实际区域(我知道这个,因为我知道微积分,见下文)。
希望这有助于您理解您的代码。
如果你真的想知道它是如何工作的,你需要研究微积分,特别是整合和差异化。这些方法可以采用公式,并为您提供另一个计算线的斜率和线下面积的公式。
但是,除非你要经常使用它并且需要真正的(数学)准确度,否则你可能只是使用你正在学习的近似方法。
答案 1 :(得分:1)
http://en.wikipedia.org/wiki/Integral#Formal_definitions
还有一个很好的可视化我们看一下a和b之间抛物线的截面,然后将它划分为一组垂直矩形切片,使每个矩形的顶部中心正好在抛物线上。
这使得每个矩形的一个角落“悬挂在”抛物线上,另一个角落太低,留下未填充的空间;所以抛物线下的面积等于矩形的面积,加上一点,减去一点。但是我们如何比较这些比特?矩形区域有点太多,还是不够?
如果我们在矩形的顶部中心绘制与抛物线相切的直线,我们可以“切断”重叠位,将其翻转,并将其添加到另一侧;请注意,这不会改变矩形的总面积(现在是梯形)。
我们现在可以看到抛物线下方两侧留有一点空间,因此梯形的面积略小于抛物线下的面积。我们现在可以将梯形顶部视为沿抛物线底部形成一串直线段(“线性分段近似”);并且细分的区域与我们正在寻找的实际区域几乎相同(但总是略小)。
那么我们如何最小化“略小于”的数量,以使我们的计算区域更准确?一种方法是使用弯曲的近似件而不是直线;这导致样条(Bezier曲线,NURBS等)。另一种方法是使用更多数量的较短线条来“增加分辨率”。微积分将这个想法发挥到极限(双关语),使用无数个无限短片。