好了,通過改變功能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
,使我的生活更容易,只是因爲它是圍繞Y軸對稱的x = -1 .. 1
加倍所有),在單片解決方案中最糟糕的情況。在這種情況下,中點爲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-18 01:33:10
@Ronnie,輸入代碼確保它前面有一個空行,並且每行至少有四個空格(更多以獲得實際縮進)。 – paxdiablo 2010-12-18 01:34:25
嗯,我將不得不使用問題 – Ronnie 2010-12-18 01:34:34