作者HDT (氕氘氚)
看板Fortran
标题[问题] 牛顿法逼近求解
时间Wed Jun 2 17:47:11 2010
资概上机考题目
给定一个方程式(题目会提供 但我先用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
1F:→ HDT:write的结果是Nan 这正常吗? 06/02 18:18
2F:→ weichich:初始值猜零的话误差值会爆掉,error值可用绝对值函数abs 06/02 18:47
3F:→ weichich:这个函数的解会有三个实根,有一些解必须初始值非常靠近 06/02 19:00
4F:→ weichich:才能算出来,但收敛条件不能太严苛... 06/02 19:02
5F:→ HDT:...我们目前只交过do loop,do while 回圈甚至还没交完... 06/02 20:03
6F:→ HDT:大至讲下程度... 06/02 20:03
7F:推 Cypresslin:你说的结果不同是怎麽个不同法? 另外如果你回圈前所算 06/03 19:57
8F:→ Cypresslin:出的error值为负,小於输入的误差容许值程式就不会跑 06/03 19:59
9F:→ HDT:救老师的解是0.061... 我的则是Nan 06/03 22:03
10F:→ Cypresslin:测试了一下,用3跟0.001,可以求出0.1464的根,这状况 06/03 23:25
11F:→ Cypresslin:跟2F说的一样,初始值不对就抓不到那个根 06/03 23:28
12F:→ Cypresslin:你用这个值测看看,要修的地方推文中都有讲了 06/03 23:37
13F:→ HDT:谢谢 06/04 07:12