CENTRALSOUTHUNIVERSITY数值分析实验报告非线性方程组的牛顿迭代法的应用一、问题背景非线性是实际问题中经常出现的,并且在科学与工程计算中的地位越来越重要,很多我们熟悉的线性模型都是在一定条件下由非线性问题简化的,为得到更符合实际的解答,往往需要直接研究非线性科学,它是21世纪科学技术发展的重要支柱,非线性问题的数学模型有无限维的如微分方程,也有有限维的。道遥咏计算机进行科学计算都要转化为非线性的单个方程或方程组的求解。从线性到非线性是一个质的变化,方程的性质有本质不同,求解方法也有很大差别。本文主要介绍的是非线性方程组的牛顿迭代法的数值解法。二、数学模型对于方程0xf,如果xf湿陷性函数,则它的求根是容易的。牛顿法实质上是一种线性化方法,其基本思想是将线性方程0xf逐步归结为某种线性方程来求解。设已知方程0xf有近似根kx(假定0'kxf),将函数xf在点kx展开,有kkkxxxfxfxf',于是方程0xf可近似地表示为0'kkkxxxfxf这是个线性方程,记其根为1kx,则1kx的计算公式kkkkxfxfxx'1,,1,0k这就是牛顿法。三、算法及流程对于非线性方程nnnnxLxxfMxLxxfxLxxff,,,,,,,,,21212211在kx处按照多元函数的泰勒展开,并取线性项得到0,,,,,,,,,1212111'21212211knknkkkkkknkknknkkknkkxxMxxxxxfxLxxfMxLxxfxLxxf其中nnnnnxfLxfMMxfKxfxf0111'这样便得到迭代公式:knkkknknkkkknkkkkknkkknkkxLxxfMxLxxfxLxxfxfxMxxxMxx,,,,,,,,,212122111'2111211这边是牛顿迭代法的算法过程,牛顿迭代法是工程上应用最多的一种非线性方程组的计算方程法。MATLAB编写的牛顿迭代法的基本程序如下:%牛顿迭代法计算非线性方程%输入x0为迭代初值%tol为误差容限,如果缺省,则默认为10的-10次方%data用来存放计算的中间数据便于计算收敛情况分析function[x,n,data]=new_ton(x0,tol)ifnargin==1tol=1e-10;endx1=x0-f1(x0)/df1(x0);n=1;%迭代过程while(norm(x1-x0)tol)x0=x1;x1=x0-f1(x0)/df1(x0);n=n+1;%data用来存放中间数据data(:,n)=x1;endx=x1;以文件名new_ton.m保存文件。四、计算结果与分析计算非线性方程组04405.02222yxyxx取初值为11yx。(1)先编写方程函数与方程的Jacobi矩阵函数。%牛顿迭代法的方程函数functionf=f1(x0)x=x0(1);y=x0(2);f1=x^2-2*x-y+0.5;f2=x^2+4*y^2-4;%最后方程函数以行向量输出f=[f1f2];以文件名f1.m保存。(2)打开editor编辑器输入以下语句并以文件名df1.m保存。functionf=df1(x0)x=x0(1);y=x0(2);f=[2*x-2-12*x8*y];(3)编写主函数,并以文件名new_main.m保存文件。%牛顿迭代法的主函数x0=[11];[x,n,data]=new_ton(x0);disp('计算结果为')xdisp('迭代次数为')n%抽取data中的第一个变量数据画出曲线subplot(2,1,1)plot(data(1,:)),title('x在迭代中的变化')%抽取data中的第二个变量数据画出其变化曲线subplot(2,1,2)plot(data(2,:)),title('y在迭代中的变化')(4)运行程序,在MATLAB命令窗口输入new_main,以enter键结束,输出为:计算结果为x=-0.2222145550694980.993808418603981迭代次数为n=16为了获得更为直观的迭代收敛信息,MATLAB方便的画出了函数图形,如下所示,其中第一幅图形为x的迭代情况,第二幅为y的迭代情况。从图中可以看出,迭代的前几次有一些震荡情况,但是随着迭代次数的增加,收敛效果还是很明显的。