2016-05-30 59 views
0
program newton_raphson 
    implicit none 
    real,parameter::error=1e-4 
    integer::i 
    real::xo,x1,f,fd 
    print*,"Please enter the initial guess !!!" 
    read*,xo 
    i=1 
    10 x1=xo-(f(xo)/fd(xo)) 
    if(abs((x1-xo)/x1)<error) then 
    print*,"root is", x1,"no. of iteration=",i 
    else 
    xo=x1 
    i=i+1 
    goto 10 
    endif 
    end 

    real function f(x) 
    real::x 
    f=cos(x) 
    end 

    real function fd(x) 
    real::x 
    fd=-sin(x) 

    end 

該程序正常工作時,我給1作爲初始猜測,但失敗或不顯示任何東西,當我給0作爲初始猜測。我的代碼有任何錯誤嗎?牛頓拉夫森不與某些初始猜測收斂

+1

它失敗的方式很重要。但是,如果您對此有疑問,請顯示錯誤消息以及您對行爲的期望。更有可能你有一個數學問題而不是計算問題,那就是:當評估'f(0)/ fd(0)'時,你會發生什麼? – francescalus

+0

Arghh .........抱歉,感謝您澄清.... –

回答

2

雖然牛頓 - 拉夫遜法快速收斂在根附近,但其全局收斂性很差。原因是切線並不總是一個可接受的函數近似值,所以可以嘗試將你的代碼和二分法結合起來,這樣就可以改善結果。