関数を次のように変更し、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 1
12
あなたの放物線の場合(ただし、x = 0 .. 1
私の人生を楽にするためにx = -1 .. 1
、y軸を中心に対称であるため、すべてを2倍にしてください)、1スライスソリューションの最悪のケースです。その場合、中点は にあり、これに の幅x = 0.5, y = 0.25
を掛けると、 の面積が得られます。y
1
0.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
(私は微積分を知っているので、これを知っています。以下を参照してください)。
うまくいけば、それはあなたが持っているコードを理解するのに役立ちます.
これがどのように機能するかを本当に知りたい場合は、微積分、特に積分と微分を調べる必要があります。これらのメソッドは式を取り、線の傾きと線の下の面積を計算するための別の式を与えることができます。
しかし、それを頻繁に使用し、実際の (数学的) 精度が必要でない限り、学習している近似方法を使用することができます。