牛顿迭代法实验报告

  • 格式:doc
  • 大小:131.50 KB
  • 文档页数:5

用牛顿迭代法求非线性方程的根

一、 实验题目

求方程013xxxf在5.1附近的根。

二、 实验引言

(1)实验目的

1. 用牛顿迭代法求解方程的根

2. 了解迭代法的原理

3. 改进和修缮迭代法

(2)实验意义

牛顿迭代法就是众多解非线性方程迭代法中比较普遍的一种,求解方便实用。

三、 算法设计

(1)基本原理

给定初始值0x,为根的容许误差,为xf的容许误差,N为迭代次数的容许值。

1.如果0xf或迭带次数大于N,则算法失败,结束;否则执行2.

2.计算0001xfxfxx.

3.若21xx或1xf,则输出1x,程序结束;否则执行4.

4.令10xx,转向1.

(2)流程图

四、 程序设计

program nndd01

implicit none

real,parameter::e=0.005

real,parameter::n=9

real::x1

real::x0=1.5

integer::k

real,external::f,y

do k=1,9

if (y(x0)==0) then

write(*,*)"失败"

else

x1=x0-f(x0)/y(x0)

if (abs(x1-x0)

write(*,*)k,x1

else

x0=x1

end if

end if

end do

end

function f(x)

implicit none

real::f

real::x

f=x*x*x-x-1

return

end function

function y(x)

implicit none

real::y

real::x

y=3*x*x-1

return

end function

五、 求解结果

3 1.324718

4 1.324718

5 1.324718

6 1.324718

7 1.324718

8 1.324718

9 1.324718

六、 算法评价及讨论

1. 在求解在1.5处附近的根,不难发现在输入区间左端值为1时需要迭代6次,而输入区间左端值为1.5时,却只要4次。初值更接近方程根时,迭代次数越少。

2. 在实验中,都是选取的区间左端值作为初次迭代值,而没有用到右端,应该设置左右端值作为迭代初值,比较它们的迭代次数,这样可以得到更少的迭代次数。

3. 在编写代码过程中,有几点疑惑,左右两端的导数是否会影响迭代次数,也就是选取哪个端点值迭代的问题。

4. 怎么样求出方程所有的根,在根的附近,得到解后程序就结束运行,如何将方程所有的根找出。

5. 怎么进一步加速迭代将是牛顿法进一步需要改进的问题。

6. 迭代过程中,导数值比较小,会导致误差比较大,如何规避。

附:

二分法程序

program erfenfa

implicit none

real::a =1.0000

real ::b=1.5000

real, parameter :: k=0.0050

real x, y1,f, y2

write(*,*)"a=, b="

read(*,*) a , b

do while (b-a>k)

y1=a*a*a-a-1

x=(a+b)/2

f=x*x*x-x-1

y2=f

if(y1*y2>0) then

a=x

else

b=x

end if

write(*,*) x , y2 end do

stop

end

一般迭代法程序

program main

implicit none

real::x0

integer::k

real::x1

integer,parameter::N=9

real,external::f

k=0

x0=1.5

do while (k<=N)

k=k+1

write(*,*) k,x0

x0=f(x0)

end do

end

function f(x)

real::x,f

f=(x+1)**(real(1)/real(3))

return

end