重新审视抛物线下的区域

时间:2010-12-18 01:30:44

标签: python sage

我无法离开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)

但是,我需要将其置于一个完整的功能之下。关于如何做到这一点的任何想法?

2 个答案:

答案 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) / 26,宽度为2,因此面积为12

现在这实际上是实际的区域,但这仅仅是因为我们正在使用的公式。对于非线性公式,由于顶部“线”的性质,将存在不准确性。具体来说,在您的情况下,抛物线是弯曲的。

但是这些不准确性变得越来越少,并且你使用更薄更薄的切片,因为当你缩短它时,任何线都倾向于直线(线性)。对于上述情况,如果将其分为两个切片,则区域将为5.5 x 16.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之间抛物线的截面,然后将它划分为一组垂直矩形切片,使每个矩形的顶部中心正好在抛物线上。

这使得每个矩形的一个角落“悬挂在”抛物线上,另一个角落太低,留下未填充的空间;所以抛物线下的面积等于矩形的面积,加上一点,减去一点。但是我们如何比较这些比特?矩形区域有点太多,还是不够?

alt text

如果我们在矩形的顶部中心绘制与抛物线相切的直线,我们可以“切断”重叠位,将其翻转,并将其添加到另一侧;请注意,这不会改变矩形的总面积(现在是梯形)。

alt text alt text

我们现在可以看到抛物线下方两侧留有一点空间,因此梯形的面积略小于抛物线下的面积。我们现在可以将梯形顶部视为沿抛物线底部形成一串直线段(“线性分段近似”);并且细分的区域与我们正在寻找的实际区域几乎相同(但总是略小)。

那么我们如何最小化“略小于”的数量,以使我们的计算区域更准确?一种方法是使用弯曲的近似件而不是直线;这导致样条(Bezier曲线,NURBS等)。另一种方法是使用更多数量的较短线条来“增加分辨率”。微积分将这个想法发挥到极限(双关语),使用无数个无限短片。