实验五 非线性方程与方程组的数值解法专业班级:信计131班 姓名:段雨博 学号:2013014907一、实验目的1、熟悉matlab 编程。
2、学习非线性方程求根的方法及程序设计算法。
二、实验题目1、迭代函数对收敛性的影响用迭代方法求方程()3210f x x x =--=的根 方案(1):化方程为等价方程:()x x ϕ== 取初值00x =,迭代10次。
方案(2):化方程()3210f x x x =--=为等价方程: ()3021x x x ϕ=-= 取初值00x =,迭代10次,观察其计算值,并加以分析。
2、初值的选取对迭代法的影响用牛顿法求方程310x x --=在0 1.5x =附近的根。
方案(1):使用牛顿法并取0 1.5x =,由()()1k k k k f x x x f x +=-'得: 312131k k k k k x x x x x +--=--,迭代10次。
方案(2):取00x =,并利用相同的公式:312131k k k k k x x x x x +--=--,迭代10次,观察比 较并分析原因。
3、收敛性和收敛速度的比较。
求方程()3sin 121f x x x x =--+的全部实根,其中误差限610ε-= 方案(1):用牛顿法求解;方案(2):用简单迭代法求解。
取相同的迭代初值,比较各方法的收敛速度。
三、实验原理与理论基础1、牛顿法:设已知方程()0f x =有近似根k x (假定()0k f x '≠),将函数()f x 在点k x 展开,有 ()()()()k k k f x f x f x x x '≈+-,于是方程()0f x =可近似地表示为()()()0k k k f x f x x x '+-=这是个线性方程,记其根为1k x +,则1k x +的计算公式为:()()1,0,1...,k k k k f x x x k f x +=-=' 这就是牛顿法。
2、迭代法原理将非线性方程()0f x =化为一个同解方程()x x ϕ=,并且假设()x ϕ为连续函数,任取一个初值0x ,代入()x x ϕ=的右端,得()10x x ϕ=,继续()21x x ϕ=,……,则()1k k x x ϕ+=,0,1,2k = ,称()1k k x x ϕ+=式为求解非线性方程()x x ϕ=的简单迭代法。
3、收敛性与收敛阶设迭代过程()1k k x x ϕ+=收敛于方程()x x ϕ=的根x *,如果当k →∞时迭代误差k e x x **=-满足渐进关系式1k pk e C e +→常数0C ≠,则称该迭代过程是p 阶收敛的。
特别地,()11p C =<时称为线性收,1p >时称为超线性收敛,2p =时称为平方收敛。
定理4:对于迭代过程()1k k x x ϕ+=及正整数p ,如果()p x ϕ在所求根x *的临近连续,并且()()()()10,p x x x ϕϕϕ-***'''==== ()()0p x ϕ*≠,则该迭代过程在点x *附近是p 阶收敛的。
四、实验内容第一题:1、编写一般迭代法的M 文件程序。
2、分别调用两个程序得出结果。
第二题:1、编写牛顿迭代法的M 文件。
2、对等价方程分别取不同的初值0x ,调用牛顿迭代法求解。
第三题:1、分别调用简单迭代法和牛顿迭代法求解。
第一题:一般迭代法的M 文件:function [x_star,it] =iterate(~,~,~,~)%%求方程根的一般迭代法,调用方法为%%[x_star,it]=iterate(phi,x,ep,it_max);%%其中philosophy(x)为迭代函数;x为初始点;%%ep为精度要求,缺省值为1e-5;%%it_max为最大迭代次数,缺省值为100,x_star为得到的解;%%it为所需的迭代次数.ifnargin<4;it_max=100;endifnargin<3ep=1e-5;endk=1;whilek<=it_maxx1=feval(phi,x);if abs(x1-x)<ep break;endx=x1;k=k+1;endx_star=x1;it=k;方案一:>> phi=@(x)(((x+1)/2)^(1/3))phi =@(x)(((x+1)/2)^(1/3))>> [x_star,it]=iterate(phi,0)x_star =1.0000it =8方案二:>> phi=@(x)(2*x^3-1)phi =@(x)(2*x^3-1)>> [x_star,it]=iterate(phi,0)x_star =-Infit =101第二题:牛顿迭代法的M文件:function [x_star,it] =Newton(fun,x,ep,it_max)%%求方程根的Newton法,调用方法为%%[x_star,it]=Newton(fun,x,ep,it_max),%%其中fun(x)为迭代函数,提供函数值和导数值;x为初始点;%%ep为精度要求,缺省值1e-5;%%it_max为最大迭代次数,缺省值为100;%%x_star为得到的解;it为求解所需的迭代次数.ifnargin<4it_max=100;endifnargin<3ep=1e-5;endk=1;whilek<=it_max[f,dotf]=feval(fun,x);if abs(dotf)<1e-10error('%求根失败,求根函数的导数为0.');endx1=x-f/dotf;if abs(x1-x)<ep break;endx=x1;k=k+1;endx_star=x1;it=k;外部函数:function[f,dotf]=fun(x)f=x^3-x-1;dotf=3*x^2-1;x=1.5方案一:取>> [x_star,it]=Newton(@fun,1.5)x_star =1.3247it =4x=0方案二:取>> [x_star,it]=Newton(@fun,0)x_star =1.3247it =21第三题:牛顿法:外部函数:function[f,dotf]=fun(x)f=x^3-sin(x)-12*x+1;dotf=3*x^2-cos(x)-12;(1)调用牛顿迭代公式:>> [x_star,it]=Newton(@fun,0)x_star =0.0770it =3(2)简单迭代法:>> [x_star,it]=iterate(phi,0)x_star =NaNit =101五、实验结果1、方案一:>> phi=@(x)(((x+1)/2)^(1/3)) phi =@(x)(((x+1)/2)^(1/3))>> [x_star,it]=iterate(phi,0)x_star =1.0000it =8方案二:>> phi=@(x)(2*x^3-1)phi =@(x)(2*x^3-1)>> [x_star,it]=iterate(phi,0)x_star =-Infit =101x=1.52、方案一:取>> [x_star,it]=Newton(@fun,1.5) x_star =1.3247it =4x=0方案二:取>> [x_star,it]=Newton(@fun,0) x_star =1.3247it =213、(1)调用牛顿迭代公式:>> [x_star,it]=Newton(@fun,0)x_star =0.0770it =3(2)简单迭代法:>> [x_star,it]=iterate(phi,0)x_star =NaNit =101六、实验结果分析与小结1、通过这次实习,让我对非线性方程求解的各种迭代法有了更深的了解,之前在复习迭代法时对牛顿迭代法不是很清楚,当自己编程去解决问题时就会有不一样的感受和理解,比如初值对牛顿迭代法的影响,上课只是知道会有很大影响,但看到实验结果才看出来原来引起的误差确实很大。
不过牛顿迭代法的思想不太难,迭代的方法比较简单易懂,这次在编写程序又用到了外部函数,外部函数和内部函数不是很清楚,经过查资料,看别人写的程序,明白了好多。
2、这次实习虽然方法简单,但是编写程序不是很会,很多编程时用的函数之前从来没见过,所以自己没办法解决,查了别人是如何写的,然后自己模仿人家写下来,编写函数程序还是挺难的,很多函数很少用到,接触也不多,不是很清楚怎么来编写,如何调用函数来运行,程序编写出来有问题也不知道问题出在哪里,有调用不出来的。
希望通过以后的学习,包括借鉴人家写的,自己学会去编写程序,了解更多。