2

我无法回答上一个问题,因为我不是该网站的成员,所以当我返回时无法对此发表评论。这是我的问题:

要找到由图 y=x^2 和区间 [a,b] 上的 x 轴界定的区域的面积,我们可以通过绘制许多“薄”矩形并取它们的面积之和来近似该区域. 让我们将 [a,b] 划分为 n 个相同宽度的较小区间 h=b-1/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)

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

4

2 回答 2

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 112

对于您的抛物线(但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(我知道这一点,因为我知道微积分,见下文)。

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


如果你真的想知道它是如何工作的,你需要研究微积分,特别是积分和微分。这些方法可以采用一个公式,并为您提供另一个计算线斜率和线下面积的公式。

但是,除非您将大量使用它并且需要真实(数学)准确性,否则您可能只使用您正在学习的近似方法。

于 2010-12-18T01:40:43.353 回答
1

在http://en.wikipedia.org/wiki/Integral#Formal_definitions也有一个很好的可视化

我们看抛物线在 a 和 b 之间的部分,我们把它分成一组垂直的矩形切片,使得每个矩形的顶部中心正好在抛物线上。

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

替代文字

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

替代文字 替代文字

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

那么我们如何最小化“略小于”的数量,以使我们计算的面积更准确呢?一种方法是使用曲线近似块而不是直线;这会导致样条曲线(Bezier 曲线、NURBS 等)。另一种方法是使用大量较短的线段,以“提高分辨率”。微积分将这个想法发挥到了极致(双关语),使用了无数个无限短的片段。

于 2010-12-18T16:41:13.923 回答