看板 Fortran 關於我們 聯絡資訊
資概上機考題目 給定一個方程式(題目會提供 但我先用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
HDT:write的結果是Nan 這正常嗎? 06/02 18:18
weichich:初始值猜零的話誤差值會爆掉,error值可用絕對值函數abs 06/02 18:47
weichich:這個函數的解會有三個實根,有一些解必須初始值非常靠近 06/02 19:00
weichich:才能算出來,但收斂條件不能太嚴苛... 06/02 19:02
HDT:...我們目前只交過do loop,do while 迴圈甚至還沒交完... 06/02 20:03
HDT:大至講下程度... 06/02 20:03
Cypresslin:你說的結果不同是怎麼個不同法? 另外如果你迴圈前所算 06/03 19:57
Cypresslin:出的error值為負,小於輸入的誤差容許值程式就不會跑 06/03 19:59
HDT:救老師的解是0.061... 我的則是Nan 06/03 22:03
Cypresslin:測試了一下,用3跟0.001,可以求出0.1464的根,這狀況 06/03 23:25
Cypresslin:跟2F說的一樣,初始值不對就抓不到那個根 06/03 23:28
Cypresslin:你用這個值測看看,要修的地方推文中都有講了 06/03 23:37
HDT:謝謝 06/04 07:12