2015-11-08 66 views
1

這是俄亥俄州立大學在線微積分課程的一個問題。很簡單,但這個老傢伙想寫一個Python程序,而不是慢慢解決它。對接我的頭靠在牆上:如何逐步近似f(x)使用歐拉方法f'(x)

F'(X)= - 0.5×^ 2 - 0.5F(x)和其滿足

F(-3)= 0。

重複使用線性近似(也稱爲歐拉方法)使用的1/2

def fprime(a): 
    return -.5*(a**2) - .5*f(a) 

h = .5 
f(-3) = 0 

# So f'(-3) = -.5*(-3)^2 - .5*(0) = -4.5 
# And since f(a+h) = f(a) + h*f'(a): 
# f(-3 + .5) = f(-3) + .5*(-4.5) = -2.25 which leads to: 
# f'(-2.5) = see fprime above . . . . 
# repeat steps to solve for f(-1) 

一個步長大小如何定義來近似在x = -1

此函數的值f(a)沒有引用自身,然後構造循環? 我很少嘗試編程,並希望我有時間和精力去真正學習。感謝您的耐心等待。

回答

0

關鍵是要改變你的fprime定義,使其接受y參數,所以你可以通過它你的歐拉積分函數內部計算y值。

def euler(df, x0, y0, dx, x1): 
    x, y = x0, y0 
    while x < x1: 
     y = y + dx * df(x, y) 
     x += dx 
    return y 

def fprime(x, y): 
    return -0.5 * (x**2) - 0.5 * y 

x0 = -3.0 
y0 = 0.0 
x1 = -1.0 

for h in (0.5, 0.05, 0.001, 1E-6): 
    print euler(fprime, x0, y0, h, x1) 

輸出

-3.140625 
-2.36751792506 
-2.33223301294 
-2.33149760872 

正如你可以看到,與h = 0.5計算出的值不是非常準確。較小的h可以提供更好的值,但是它在執行一百萬步時有點慢。歐拉整合是直接的,但它不是非常快或準確:有更好的方法。

FWIW,這裏是我使用第三方mpmath任意精度數學模塊計算更精確的值:

-2.3314962060281726737298106653176348


而這裏的解析解:

˚F (x)= - x 2 + 4x - 8 + 29 exp( - (x + 3)/ 2)

或者在Python

f = lambda x: -x**2 + 4*x - 8 + 29 * exp(-0.5*(x+3)) 

我將離開微積分的細節「的讀者練習」。 :)但通過區分和替代邊界值來檢查它是否正確相當容易。

+0

**謝謝@ PM **。我一直對像你們這樣幫助像我這樣的人們的慷慨大方感到驚歎。感謝您的教訓。 – user3308780

+0

@ user3308780:我的榮幸! FWIW,我剛分析解決了它;我會很快將方程式添加到我的答案中。 –

相關問題