Re: [問題] 牛頓法逼近求解

看板Fortran作者 (木頭著火)時間14年前 (2010/06/03 23:29), 編輯推噓2(201)
留言3則, 3人參與, 最新討論串2/2 (看更多)
※ 引述《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
很熱心!! 可以給個讚嗎~~XD
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
文章代碼(AID): #1C1yfk8W (Fortran)
討論串 (同標題文章)
文章代碼(AID): #1C1yfk8W (Fortran)