作者HDT (氕氘氚)
看板Fortran
標題[問題] 牛頓法逼近求解
時間Wed Jun 2 17:47:11 2010
資概上機考題目
給定一個方程式(題目會提供 但我先用x**3-0.165*x**2+3.993/10**4來練習)
以牛頓法逼近求解
誤差值也是題目提供
這是我的原程式碼(!的部分不是)
program test
implicit none
real::error,x,f1,f2,e
write(*,*)"請輸入初始值"
read(*,*)x
write(*,*)"請輸入誤差值"
read(*,*)e
f1=x**3-0.165*x**2+3.993/10**4 !f1是原方程式
f2=3*x**2-0.33*x !f2是f1的一次微分
error=f1/(f2*x)-f2 !誤差值算法
do while(error>=e)
f1=x**3-0.165*x**2+3.993/10**4
f2=3*x**2-0.33*x
error=f1/(f2*x)-f2
if(error<0)then
error=-1*error !強迫誤差值為正
end if
x=x-(f1/f2) !利用DO WHILE迴圈使x值可以一值變換計算
end do
write(*,*)x !將小於誤差值的x寫出來
end program
可以跑出.exe檔
但是結果和老師上課示範的不同
我哪裡錯了?
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.198.181.184
1F:→ HDT:write的結果是Nan 這正常嗎? 06/02 18:18
2F:→ weichich:初始值猜零的話誤差值會爆掉,error值可用絕對值函數abs 06/02 18:47
3F:→ weichich:這個函數的解會有三個實根,有一些解必須初始值非常靠近 06/02 19:00
4F:→ weichich:才能算出來,但收斂條件不能太嚴苛... 06/02 19:02
5F:→ HDT:...我們目前只交過do loop,do while 迴圈甚至還沒交完... 06/02 20:03
6F:→ HDT:大至講下程度... 06/02 20:03
7F:推 Cypresslin:你說的結果不同是怎麼個不同法? 另外如果你迴圈前所算 06/03 19:57
8F:→ Cypresslin:出的error值為負,小於輸入的誤差容許值程式就不會跑 06/03 19:59
9F:→ HDT:救老師的解是0.061... 我的則是Nan 06/03 22:03
10F:→ Cypresslin:測試了一下,用3跟0.001,可以求出0.1464的根,這狀況 06/03 23:25
11F:→ Cypresslin:跟2F說的一樣,初始值不對就抓不到那個根 06/03 23:28
12F:→ Cypresslin:你用這個值測看看,要修的地方推文中都有講了 06/03 23:37
13F:→ HDT:謝謝 06/04 07:12