信息与计算科学实习.docx
《信息与计算科学实习.docx》由会员分享,可在线阅读,更多相关《信息与计算科学实习.docx(7页珍藏版)》请在冰豆网上搜索。
信息与计算科学实习
信息与计算科学实习
题目:
用牛顿法求非线性方程
专业:
信息与计算科学
班级:
050801班
姓名:
学号:
指导教师:
年11月
摘要
随着科学技术的飞速发展和计算机的广泛应用,现代科学已呈现出理论科学、实验科学和计算科学三足鼎立的局面。
作为计算科学的重要手段和工具。
通常求解一个问题可能会有多种算法可供选择。
要使计算机能完成人们预定的工作,首先必须为如何完成预定的工作设计一个算法,然后再根据算法编写程序。
计算机程序要对问题的每个对象和处理规则给出正确详尽的描述,其中程序的数据结构和变量用来描述问题的对象,程序结构、函数和语句用来描述问题的算法。
算法数据结构是程序的两个重要方面。
牛顿迭代法是以微分为基础的,微分就是用直线来代替曲线,由于曲线不规则,那么我们来研究直线代替曲线后,剩下的差值是不是高阶无穷小,如果是高阶无穷小,那么这个差值就可以扔到不管了,只用直线就可以了,这就是微分的意义。
牛顿法是牛顿在17世纪提出的一种求解方程f(x)=0.多数方程不存在求根公式,从而求精确根非常困难,甚至不可能,从而寻找方程的近似根就显得特别重要。
牛顿迭代法是取x0之后,在这个基础上,找到比x0更接近的方程的跟,一步一步迭代,从而找到更接近方程根的近似跟。
方法使用函数f(x)的泰勒级数的前面几项来寻找方程f(x)=0的根。
牛顿迭代法是求方程根的重要方法之一,其最大优点是在方程f(x)=0的单根附近具有平方收敛,而且该法还可以用来求方程的重根、复根。
另外该方法广泛用于计算机编程中。
算法是问题求解过程的精确描述,一个算法由有限条可完全机械地执行的、有确定结果的指令组成。
指令正确地描述了要完成的任务和它们被执行的顺序。
计算机按算法指令所描述的顺序执行算法的指令能在有限的步骤内终止,或终止于给出问题的解,或终止于指出问题对此输入数据无解
牛顿迭代算法运用与各个领域,它的的实现推动了科学界的进步,其算法的开发实现数字系统的基本的算法和逻辑电路的实现其算法并运用于当代所有的各类处理器、寄存器和算术协处理器中。
关键字:
牛顿迭代法非线性方程matlab
一.牛顿迭代法简介
1.1牛顿迭代法的概述
牛顿迭代法(Newton'smethod)又称为牛顿-拉夫逊方法(Newton-Raphsonmethod),它是牛顿在17世纪提出的一种在实数域和复数域上近似求解方程的方法。
多数方程不存在求根公式,因此求精确根非常困难,甚至不可能,从而寻找方程的近似根就显得特别重要。
方法使用函数f(x)的泰勒级数的前面几项来寻找方程f(x)=0的根。
设r是f(x)=0的根,选取x0作为r初始近似值,过点(x0,f(x0))做曲线y=f(x)的切线L,L的方程为y=f(x0)f'(x0)(x-x0),求出L与x轴交点的横坐标x1=x0-f(x0)/f'(x0),称x1为r的一次近似值。
过点(x1,f(x1))做曲线y=f(x)的切线,并求该切线与x轴的横坐标x2=x1-f(x1)/f'(x1),称x2为r的二次近似值。
重复以上过程,得r的近似值序列,其中x(n+1)=x(n)-f(x(n))/f'(x(n)),称为r的n+1次近似值,上式称为牛顿迭代公式。
解非线性方程f(x)=0的牛顿法是把非线性方程线性化的一种近似方法。
把f(x)在x0点附近展开成泰勒级数f(x)=f(x0)+(x-x0)f'(x0)+(x-x0)^2*f''(x0)/2!
+…取其线性部分,作为非线性方程f(x)=0的近似方程,即泰勒展开的前两项,则有f(x0)+f'(x0)(x-x0)=f(x)=0设f'(x0)≠0则其解为x1=x0-f(x0)/f'(x0)这样,得到牛顿法的一个迭代序列:
x(n+1)=x(n)-f(x(n))/f'(x(n))。
1.2牛顿迭代法的优点
迭代法是求方程近似根的一个重要方法,也是计算方法中的一种基本方法,它的算法简单,是用于求方程或方程组近似根的一种常用的算法设计方法。
牛顿迭代法是求方程根的重要方法之一,其最大优点是在方程f(x)=0的单根附近具有平方收敛,而且该法还可以用来求方程的重根、复根。
牛顿法是方程求根的一个有力方法,常常能快速求出其他方法求不出或者难以求出的解。
假定有一个函数y=f(x),方程f(x)=0在x=r处有一个根,对于此根,先估计一个初始值Xo(可以是猜测的)。
得到一个更好的估计值X1。
为此f(X)=Xo处作该曲线的切线,并将其延长与x轴相交。
切线与x轴的交点通常很接近r,我们用它作为下一个估计值X1,求出X1后,用X1代替Xo。
重复上述过程,在x=X1处作曲线的另一条切线,并将其延长至与x轴相交,用切线的x轴截距作为下一个近似值X2……这样继续下去,所得出的这个x轴截距的序列通常迅速接近根r。
二.牛顿迭代法的分析
2.1牛顿迭代法的思想
一、确定迭代变量。
在可以用迭代算法解决的问题中,至少存在一个直接或间接地不断由旧值递推出新值的变量,这个变量就是迭代变量。
二、建立迭代关系式。
所谓迭代关系式,指如何从变量的前一个值推出其下一个值的公式(或关系)。
迭代关系式的建立是解决迭代问题的关键,通常可以使用递推或倒推的方法来完成。
三、对迭代过程进行控制。
在什么时候结束迭代过程?
这是编写迭代程序必须考虑的问题。
不能让迭代过程无休止地重复执行下去。
迭代过程的控制通常可分为两种情况:
一种是所需的迭代次数是个确定的值,可以计算出来;另一种是所需的迭代次数无法确定。
对于前一种情况,可以构建一个固定次数的循环来实现对迭代过程的控制;对于后一种情况,需要进一步分析出用来结束迭代过程的条件。
多数情况下是得不到一般数学方法所需的函数表达式,或难以找到原函数。
线性方程组的求解更是让人望而生畏,往往因为计算机工作量太大而无法实施。
对这些问题,都可以利用数值方法来求解,在计算机中实现的数值方法也称为数值算法。
牛顿迭代法是数值分析中一个重要的计算方法和思想。
迭代法的主要功能:
计算方程时可以比较快速。
在工程实践中,有许多问题往往归结为求一元非线性方程的实根、求函数的定积分、求线性方程组的解等。
而即使对于求一元方程实根这类问题,也只有在少数简单的情况下,才可以用传统的方法得到根的数学表达式。
对于需要计算定积分的问题,便的计算出来结果但并不影响计算出来结果的精确度,运用于多种工业设计和数学设计方面。
牛顿迭代法用到导数f'(x),但有时求导困难,如果导数用差商(y2-y1)/(x2-x1)逼近,便是一种快速的截弦法。
取两个x值作试探,判断f(x)是否副近于0,如果f(x)不理想,用经过(x1,y1)、(x2,y2)的直线(截弦)代替f(x)求根,近似根x外推=x1-(x2-x1)*y1/(y2-y1),此x靠性会更好些。
求根过程:
是叠代过程,即由(x1,x2)→f(x1)、f(x2)、f(x中)或f(x外推)→(X1,X2),大写X1,X2就是下一轮计算的小写x1,x2,二分法、截弦法、牛顿迭代法计算公式不同,一个用中值外推,后二者用直线外推,二者用直线外推,但它们计算过程几乎相同,具体程序详见本源代码。
对截弦法而言,x1,y1是起点,x2,y2直的控制点,,x1,y1是起点,x2,y2直的控制点,x2不能与x1相等,否则直线画不出来,但x1与x2应尽量靠近,远了作出的直线准确度下降。
在求根过程中会用到牛顿迭代伪代码:
牛顿迭代法伪代码:
x1=-2,y1=f(x1)
x2=-2,y2=f(x2)
while(){//循环
x=x1-(x2-x1)*y1/(y2-y1),y=f(x)
如果|x-x2|<0.01或y为0则跳出循环
x1=x2,y1=y2
x2=x,y2=y
2.2牛顿迭代法的要求
牛顿迭代法方法简单,每次迭代都是简单的重复运算,易于编制程序;与求解线性方程的精确法相比,简单迭代法对于字长位数较少的计算机更为适用,它可以用增加迭代次数来弥补字长位数少的不足.初值可以任取,因而中间结果偶然错误不影响最后结果的获得。
缺点:
迭代速度较慢。
一、确定迭代变量。
在可以用迭代算法解决的问题中,至少存在一个直接或间接地不断由旧值递推出新值的变量,这个变量就是迭代变量。
二、建立迭代关系式。
所谓迭代关系式,指如何从变量的前一个值推出其下一个值的公式(或关系)。
迭代关系式的建立是解决迭代问题的关键,通常可以使用递推或倒推的方法来完成。
三、对迭代过程进行控制。
在什么时候结束迭代过程?
这是编写迭代程序必须考虑的问题。
不能让迭代过程无休止地重复执行下去。
迭代过程的控制通常可分为两种情况:
一种是所需的迭代次数是个确定的值,可以计算出来;另一种是所需的迭代次数无法确定。
对于前一种情况,可以构建一个固定次数的循环来实现对迭代过程的控制;对于后一种情况,需要进一步分析出用来结束迭代过程的条件。
3.用MATLAB解非线性方程的程序清单
clc;
clear;
%%原函数sin(x),cos(x),log(x),log2(x),log10(x),exp(x),
fun=@funs;%初始函数在文件funs.m文件中更改。
%x=[0.1,0.1,-0.1]';
x=[0.1,0.1,-0.1]';
%fun=funs(x0);
N=30;%设置最大迭代次数
ep=1e-2;%设置迭代精度
%index=1表明迭代成功,index=0表明迭代失败
index=0;k=0;
fprintf('%2d%12.9f%12.9f%12.9f\n',k,x)
%fprintf('%2d%12.9f%12.9f\n',k,x)
k=k+1;
[f,J]=feval(fun,x);
%f
y0=f;
hk=inv(J);
x=x-hk*f;
deltax=-hk*f;
%deltay=0;
%deltax=-hk*f;
fprintf('%2d%12.9f%12.9f%12.9f\n',k,x)
%fprintf('%2d%12.9f%12.9f\n',k,x)
%%disp(hk);
%fprintf('%12.9f%12.9f%12.9f\n',hk)
whilek<=N
[f,J]=feval(fun,x);
%deltax=x-inv(J)*f;
%f
%y0
deltay=f-y0;
y0=f;
hk=hk+((deltax-hk*deltay)*deltax'*hk)/(deltax'*hk*deltay);
x=x-hk*f;
deltax=-hk*y0;
k=k+1;
fprintf('%2d%12.9f%12.9f%12.9f%12.9f\n',k,x,norm(inv(J)*f,2))
%fprintf('%2d%12.9f%12.9f%12.9f\n',k,x,norm(inv(J)*f,2))
end
x;
k;
总结
科学计算中,经常会遇到求解高次代数方程或超越方程问题,我们把这些方程统称为非线性方程。
在非线性方程中,除了二次、三次
四次代数方程外,求解其他的方程不但没有一般的公式,而且若只
据方程本身来判别是否有根及根的个数是很困难的。
因此,我们需
寻求非线性方程根的比较精确的近似解。
但是如果我们直接用在大
数学中学习的几种传统的方法求解不仅难度较大而且需要做大量繁杂的计算,在利用MATLAB数学软件,通过牛顿迭代法求解思路,
写出对应的MATLAB程序来求解。
研究结果表明利用MATLAB
学软件可以省略大量繁杂的计算,并使求解的精确度大大提高,从本次实习中我进一步深入了解牛顿迭代法和MATLAB