[問題] 牛頓法逼近求解

看板Fortran作者 (氕氘氚)時間14年前 (2010/06/02 17:47), 編輯推噓1(1012)
留言13則, 3人參與, 最新討論串1/2 (看更多)
資概上機考題目 給定一個方程式(題目會提供 但我先用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

06/02 18:18, , 1F
write的結果是Nan 這正常嗎?
06/02 18:18, 1F

06/02 18:47, , 2F
初始值猜零的話誤差值會爆掉,error值可用絕對值函數abs
06/02 18:47, 2F

06/02 19:00, , 3F
這個函數的解會有三個實根,有一些解必須初始值非常靠近
06/02 19:00, 3F

06/02 19:02, , 4F
才能算出來,但收斂條件不能太嚴苛...
06/02 19:02, 4F

06/02 20:03, , 5F
...我們目前只交過do loop,do while 迴圈甚至還沒交完...
06/02 20:03, 5F

06/02 20:03, , 6F
大至講下程度...
06/02 20:03, 6F

06/03 19:57, , 7F
你說的結果不同是怎麼個不同法? 另外如果你迴圈前所算
06/03 19:57, 7F

06/03 19:59, , 8F
出的error值為負,小於輸入的誤差容許值程式就不會跑
06/03 19:59, 8F

06/03 22:03, , 9F
救老師的解是0.061... 我的則是Nan
06/03 22:03, 9F

06/03 23:25, , 10F
測試了一下,用3跟0.001,可以求出0.1464的根,這狀況
06/03 23:25, 10F

06/03 23:28, , 11F
跟2F說的一樣,初始值不對就抓不到那個根
06/03 23:28, 11F

06/03 23:37, , 12F
你用這個值測看看,要修的地方推文中都有講了
06/03 23:37, 12F

06/04 07:12, , 13F
謝謝
06/04 07:12, 13F
文章代碼(AID): #1C1YYYkT (Fortran)
討論串 (同標題文章)
文章代碼(AID): #1C1YYYkT (Fortran)