2

私はウェブサイトのメンバーではなかったので前の質問から行くことができなかったので、私が戻ったときにそれについてコメントすることができませんでした。これが私の質問です:

グラフy=x ^ 2と区間[a、b]のx軸で囲まれた領域の面積を見つけるには、いくつかの「薄い」長方形を描画し、それらの面積の合計をとることで、領域を概算できます。 。[a、b]を同じ幅h = b-1/nのn個の小さな間隔に分割しましょう。各間隔には、高さy = rの長方形があります。ここで、rはx軸上のその小さな間隔の中央です。その長方形の面積はhyです。a、b、nをパラメーターとして取り、上記の方法を使用して放物線y = x^2の下の領域のおおよその面積を返すPython関数を記述します。プログラムが機能する理由を説明していただければ助かります。

親切なメンバーのおかげで、私は次のプログラムを見つけました(私はできない/方法がわからないのでプログラムを編集してください

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)

ただし、これを1つの整関数の下に配置する必要があります。これをどのように行うことができるかについてのアイデアはありますか?

4

2 に答える 2

3

関数を次のように変更し、y = x既知の入力値をいくつか試してみると、問題なく動作することがわかりました。

0 .. 1 =>  0.5
0 .. 2 =>  2.0
1 .. 2 =>  1.5
0 .. 9 => 40.5

すべてを 1 つの関数にまとめたい場合は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)

通常、私は宿題にこれほど明確なヘルプを提供することはありませんが、作業の大部分は自分で行っているため、一線を越えてプッシュするのはほんのわずかな微調整に過ぎないことに注意してください。

簡単な Web 検索でここで簡単に見つけることができ、そのために成績が低下する可能性があるため、このコードをそのまま提出しないように警告します。

それを調べて、それがどのように機能するかを徹底的に理解してから、このソースを見ずに自分で再コーディングしてみてください。そうすることで、盲目的にコピーするだけでなく、あなたのキャリアにおいてはるかに役立つでしょう。


そして、このメソッドの背後にある理論を理解するために、関数のスライスを考えてみましょうy = x:

7   .
6  /|
5 / |
  | |
  | |
  | |
  | |
  | |
0 +-+
  567

頂点の中点の y 座標 (および高さ) は(5 + 7) / 2、または6で、幅は である2ため、面積は12です。

これは実際の面積ですが、これは使用している公式によるものです。非線形式の場合、上部の「線」の性質により不正確になります。具体的には、あなたの場合、放物線が曲がっています。

しかし、これらの不正確さはますます少なくなり、線を短くすると直線 (線形) になる傾向があるため、より薄いスライスを使用します。上記の場合、それを 2 つのスライスに分割すると、面積は合計で5.5 x 1とになります。ラインがまっすぐでない場合、2 スライスの答えは 1 スライスの答えよりも現実に近くなります。6.5 x 112

あなたの放物線の場合(ただし、x = 0 .. 1私の人生を楽にするためにx = -1 .. 1、y軸を中心に対称であるため、すべてを2倍にしてください)、1スライスソリューションの最悪のケースです。その場合、中点は にあり、これに の幅x = 0.5, y = 0.25を掛けると、 の面積が得られます。y10.25

2 つのスライス (幅 = 0.5) では、中間点は次のようになります。

   x       y    y x width
----  ------    ---------
0.25  0.0625      0.03125
0.75  0.5625      0.28125
                ---------
                  0.31250

したがって、面積の推定値は0.3125です。

4 つのスライス (幅 = 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です。

8 つのスライス (幅 = 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 の間の放物線のセクションを見て、それを一連の垂直な長方形のスライスに分割して、各長方形の上部中央が放物線上に正確にくるようにします。

これにより、各長方形の一方の角が放物線に「ぶら下がった」ままになり、もう一方の角が低すぎて、塗りつぶされていないスペースが残ります。したがって、放物線の下の面積は、長方形の面積に 1 ビットを足して 1 ビットを引いたものに等しくなります。しかし、どうやってビットを比較するのでしょうか? 長方形の面積が少し大きすぎますか、それとも十分ではありませんか?

代替テキスト

長方形の上部中央で放物線に接する線を引くと、重なっているビットを「切り取って」裏返し、反対側に追加できます。これは、長方形 (現在は台形) の総面積を変更しないことに注意してください。

代替テキスト 代替テキスト

放物線の下の両側に少しスペースが残っていることがわかります。そのため、台形の面積は放物線の下の面積よりもわずかに小さくなります。台形の頂点は、放物線の底に沿って一連の直線セグメント (「線形区分的近似」) を形成するものと考えることができます。セグメントの下の領域は、探している実際の領域とほぼ同じ (ただし常にわずかに小さい) です。

では、計算された面積をより正確にするために、「わずかに少ない」量をどのように最小化すればよいのでしょうか? 1 つの方法は、直線の代わりに曲線の近似ピースを使用することです。これはスプライン (ベジエ曲線、NURBS など) につながります。もう1つの方法は、「解像度を上げる」ために、より短いラインピースを多数使用することです。微積分は、無限に短いピースを無限に使用して、このアイデアを限界まで (しゃれを意図して) 取り入れます。

于 2010-12-18T16:41:13.923 に答える