作者weichich (木头着火)
看板Fortran
标题Re: [问题] 牛顿法逼近求解
时间Thu Jun 3 23:29:47 2010
※ 引述《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
1F:→ charlesdc:很热心!! 可以给个赞吗~~XD 06/04 01:18
2F:推 HDT:感谢 虽然...很多都不懂= = 06/04 16:26
3F:推 howdiee:赞!! 06/04 16:36