Re: [問題] 牛頓法逼近求解
※ 引述《HDT (氕氘氚)》之銘言:
: 資概上機考題目
: 給定一個方程式(題目會提供 但我先用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檔
: 但是結果和老師上課示範的不同
: 我哪裡錯了?
題目y=x**3-0.165*x**2+3.993/10**4 會有三個實根 a. 0.146359504
b. -0.043737086
c. 0.062377581 ←你老師的解
因此隨著妳初始x值位置所收歛的結果會有不同
至於為何,可以畫三次曲線出來
用牛頓法的原理(垂切垂切....) 即可明白
然而收斂準則 (也就是error值) 取絕對值就能轉為正
初始猜值在這個函數不能猜0,因為計算第一次f2(0)放在分母會爆掉
至於Nan就是你的結果發散,跑到正負無限大...
原因有可能為error沒有取絕對值所導致
大概問題是這樣
小改了一下程式碼...
收斂準則 e 大概0.01或0.001就可以了
猜值隨你猜不同的位置會有不同(3個)結果
==============================以下為程式碼============================
program test
implicit none
real(8)::error,x,f1,f2,e
integer :: i
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 !誤差值算法
error=dabs(f1/(f2*x)-f2)
i=0
do while(error>=e)
i=i+1
if (i>1000) exit !超過1000次跳出迴圈
f1=x**3-0.165*x**2+3.993/10**4
f2=3*x**2-0.33*x
!error=f1/(f2*x)-f2
error=dabs(f1/(f2*x)-f2)
!if(error<0)then
!error=-1*error !強迫誤差值為正
!end if
x=x-(f1/f2) !利用DO WHILE迴圈使x值可以一值變換計算
write(*,*)error
end do
write(*,*)"==========Convge!!!=========="
write(*,*)x !將小於誤差值的x寫出來
end program
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.116.155.90
→
06/04 01:18, , 1F
06/04 01:18, 1F
推
06/04 16:26, , 2F
06/04 16:26, 2F
推
06/04 16:36, , 3F
06/04 16:36, 3F
討論串 (同標題文章)
Fortran 近期熱門文章
PTT數位生活區 即時熱門文章