文档详情

数值分析上机实验报告20111023.doc

发布:2017-04-23约2.49万字共29页下载文档
文本预览下载声明
实验报告 yyhhit@163.com . PAGE 29. 实验报告一 题目: 非线性方程求解 摘要:非线性方程的解析解通常很难给出,因此线性方程的数值解法就尤为重要。本实验采用两种常见的求解方法二分法和Newton法及改进的Newton法。 前言:(目的和意义) 掌握二分法与Newton法的基本原理和应用。 数学原理: 对于一个非线性方程的数值解法很多。在此介绍两种最常见的方法:二分法和Newton法。 对于二分法,其数学实质就是说对于给定的待求解的方程f(x),其在[a,b]上连续,f(a)f(b)0,且f(x)在[a,b]内仅有一个实根x*,取区间中点c,若,则c恰为其根,否则根据f(a)f(c)0是否成立判断根在区间[a,c]和[c,b]中的哪一个,从而得出新区间,仍称为[a,b]。重复运行计算,直至满足精度为止。这就是二分法的计算思想。 Newton法通常预先要给出一个猜测初值x0,然后根据其迭代公式 产生逼近解x*的迭代数列{xk},这就是Newton法的思想。当x0接近x*时收敛很快,但是当x0选择不好时,可能会发散,因此初值的选取很重要。另外,若将该迭代公式改进为 其中r为要求的方程的根的重数,这就是改进的Newton法,当求解已知重数的方程的根时,在同种条件下其收敛速度要比Newton法快的多。 程序设计: 本实验采用Matlab的M文件编写。其function的程序如下所示: function rtn=bisection(fx,xa,xb,n,delta) % 二分法解方程 % fx是由方程转化的关于x的函数,有fx=0。 % xa 解区间上限 % xb 解区间下限 %解区间人为判断输入 % n 最多循环步数,防止死循环。 %delta 为允许误差 x=xa;fa=eval(fx); x=xb;fb=eval(fx); disp( [ n xa xb xc fc ]); for i=1:n xc=(xa+xb)/2;x=xc;fc=eval(fx); X=[i,xa,xb,xc,fc]; disp(X), if fc*fa0 xb=xc; else xa=xc; end if (xb-xa)delta,break,end end 将以上程序保存为bisection.m文件,存在matlab根目录下。 然后在matlab command window中输入format long,更改有效数字长度,再分别输入对应要求的函数: 1、f=sin(x)-x^2/2; bisection(f,1,2,20,0.5*10^(-5)) 最后得到所有运行结果,选取满足误差要求的结果为第18次迭代, n=18.00000000000000,xa=1.40441131591797, xb=1.40441894531250,xc= 1.40441513061523 ,fc=-0.00000037972051 2、f=x^3-x-1; bisection(f,1,1.5,20,0.5*10^(-5)) 最后得到所有运行结果,选取满足误差要求的结果为第17次迭代, n=17.00000000000000, xa=1.32471466064453, xb=1.32472229003906 xc=1.32471847534180, fc=0.00000220949485 Newton法及改进的Newton法源程序: clear %%%% 输入函数 f=input(请输入需要求解函数,s) %%%求解f(x)的导数 df=diff(f); %%%改进常数或重根数 miu=2; %%%初始值x0 x0=input(input initial value x0); k=0;%迭代次数 max=100;%最大迭代次数 R=eval(subs(f,x0,x));%求解f(x0),以确定初值x0时否就是解 while (abs(R)1e-8) x1=x0-miu*eval(subs(f,x0,x))/eval(subs(df,x0,x)); R=x1-x0; x0=x1; k=k+1; if (eval(subs(f,x0,x))1e-10); break end if kmax;%如果迭代次数大于给定值,认为迭代不收敛,重新输入初值 ss=input(maybe result is error,choose a new
显示全部
相似文档