2010-12-18 47 views
2

我無法從previous question去,因爲我不是網站的成員,所以當我返回時我無法評論它。 這裏是我的問題:重修拋物線下的區域

要找到由圖y = x^2和x軸在區間[a,b]上的邊界區域,我們可以通過繪製一些「薄「的矩形,並把它們的面積總和。讓我們把[a,b]劃分成相同的邊界h = b-1/n的n個較小的區間。在每個間隔上都有一個高度爲y = r的矩形,其中r是x軸上該小間隔的中間值。那個矩形的面積很小。編寫一個以a,b和n爲參數的Python函數,並使用上述方法返回拋物線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) 

不過,我需要把這個下一個完整的功能。我如何能做到這一點的任何想法

+0

我們是否允許使用微積分來得出拋物線下方區域的分析公式?它會更快,更準確。 – 2010-12-18 01:33:10

+0

@Ronnie,輸入代碼確保它前面有一個空行,並且每行至少有四個空格(更多以獲得實際縮進)。 – paxdiablo 2010-12-18 01:34:25

+0

嗯,我將不得不使用問題 – Ronnie 2010-12-18 01:34:34

回答

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 16.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的實際面積(我知道這是因爲我知道微積分,見下文)。

希望這可以幫助你理解你的代碼。


如果你真的想知道這是如何工作,你需要尋找到微積分,具體的整合與分化。這些方法可以採用一個公式,並給出另一個計算線的斜率和線下面積的公式。但是,除非你要使用它並且需要真正的(數學)準確性,否則你可能只是使用你正在學習的近似方法。

+0

嘿非常感謝你非常感謝 – Ronnie 2010-12-18 01:50:15

+0

如果你不介意你能向我解釋切片操作員是如何工作的,因爲我無法挑出正確的詞來解釋它 – Ronnie 2010-12-18 01:56:03

+0

@羅尼,我已經更新了答案以顯示切片如何工作。注意術語,因爲Python實際上有一個用於獲取數組切片的切片「運算符」(比如'name [7:3]')。 – paxdiablo 2010-12-18 02:41:14

1

也有這樣的http://en.wikipedia.org/wiki/Integral#Formal_definitions

我們看A和B之間的拋物線的部分良好的可視性,我們把它分成一組垂直的矩形切片使得每個頂部中心的矩形恰好在拋物線上。

這使每個矩形的一個角落「懸在」拋物線上,另一個太低,留下未填充的空間;所以拋物線下的面積等於矩形的面積,再加上一點,減去一點。但是我們如何比較這些比特?矩形區域有點太多了,還是不夠?

alt text

如果我們繪製在矩形的頂部中心的線相切的拋物線,我們可以「切斷」的重疊位,將它翻轉,並將其添加到另一側;注意這不會改變矩形的總面積(現在是梯形)。

alt textalt text

現在,我們可以看到,有留在拋物線下兩側的空間一點點,所以梯形的面積比拋物線下的面積略少。現在我們可以想到梯形頂部沿着拋物線的底部形成一束直線段(「線性分段逼近」);並且分段下的面積幾乎與我們正在尋找的實際面積相同(但總是略小於)。

那麼我們如何最小化「略小於」的數量,使我們的計算區域更精確?一種方法是使用曲線近似件而不是直線;這導致樣條(貝塞爾曲線,NURBS等)。另一種方法是使用大量較短的線條來「增加分辨率」。微積分把這個想法帶到極限(雙關語意思),使用無限多的無限短片。