数值分析 迭代法 二分法和迭代法原理
- 格式:ppt
- 大小:517.50 KB
- 文档页数:19


二分法和牛顿迭代法求解非线性方程的比较及应用
摘要:本文基于计算机matlab和c语言编程去分析两者的计算复杂性,并深入探讨了两种方法的优缺点。最后,通过将两种方法结合起来解决非线性方程的求解问题,取得了显著地效果。同时,这也再次证明了方法组合解决问题的高效性。
关键词:二分法;牛顿迭代法;非线性方程
中图分类号:o242 文献标志码:b 文章编号:1674-9324(2013)25-0139-01
求解方程的近似根,一般需要解决两个问题:
1.根的隔离。即找出有根区域,使得在一些小区间中方程只有一根(或一对共轭复根)以便获取各根的较粗糙的近似值。
2.近似根的精确化。即用求根的数值方法,使求得的近似根逐步精确化,直到获得一定精度的近似根。
一、二分法和牛顿迭代法的基本思想
1.二分法。一般地,对于函数f(x),如果存在实数c,当x=c时,若f(c)=0,那么把x=c叫做函数f(x)的零点。解方程即要求f(x)的所有零点。假定f(x)在区间(x,y)上连续,先找到a、b属于区间(x,y),使f(a),f(b)异号,说明在区间(a,b)内一定有零点,然后求[f(a+b)/2],现在假设f(a)0,a=a,从①开始继续使用中点函数值判断。如果[f(a+b)/2]>0,则在区间(a,(a+b)/2)内有零点,注:(a+b)/2<=b,从①开始继续使用中点函数值判断。这样就可以不断接近零点。通过每次把f(x)的零点所在小区间收缩一半的方法,使区间的两个端点逐步迫近函数的零点,以求得零点的近似值,这种方法叫做二分法。从以上可以看出,每次运算后,区间长度减少一半,是线形收敛。另外,二分法不能计算复根和重根。
2.牛顿迭代法。设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) *f’’(x0)/2!+…取其线性部分,作为非线性方程f(x)=0的近似方程,即泰勒展开的前两项,则有f(x0)+f’(x0)(x-x0)=0设f’(x0)≠0则其解为x1=x0-f(x0)/f’(x0)这样,得到牛顿法的一个迭代序列:x(n+1)=x(n)-f(x(n))/f’(x(n)),记为:{x(n)}。此时,当n趋于无穷大时,x(n)就会逐渐逼近f(x)=0的根。
§3 牛顿迭代法Newton Iteration
————切线法
牛顿迭代法是最著名的方程求根方法。已经通过各种方式把它推广到解其他更为困难的非线性问题。
【例如】非线性方程组、非线性积分方程和非线性微分方程。
虽然牛顿法对于给定的问题不一定总是最好的方法,但它的简单形式和快的收敛速度常常使得解非线性问题的人优先考虑它。
迭代一般理论告诉我们,构造好的迭代函数可使收敛速度提高。然而迭代函数的构造方法又各不相同,方法多样。牛顿法是受几何直观启发,给出构造迭代函数的一条重要途径。
牛顿迭代的基本思想:方程f(x)=0的根,几何意义是曲线y=f(x)与ox轴y=0的交点。求曲线与y=0的交点没有普遍的公式,但直接与0x轴的交点容易计算。用直线近似曲线y=f(x),从而用直线方程的根逐步代替f(x)=0的根。即把非线性方程逐步线性化。
方法:设xk是f(x)=0的一个近似根,把f(x)在xk处作一阶Taylor展开,得到
))(()()(kkkxxxfxfxf (19)
设)(kxf≠0,由于
0)())(()(xfxxxfxfkkk
所以求得解记为1kx,有 牛顿迭代公式: )()(1kkkkxfxfxx (20)
按牛顿迭代计算称为牛顿迭代法。
牛顿法的几何意义:选初值xk以后,过))(,(kkxfxp点,作曲线y=f(x)的切线,其切线方程为))(()()(kkkxxxfxfxf (21)
切线与ox轴的交点,为1kx,则
)(/)(1kkkkxfxfxx
(22)
牛顿迭代法也称为切线法。
迭代法的收敛性:如果取)(/)()(kkxfxfxxg,则有x=g(x),从而牛顿迭代公式就是
)(1kkxgx
课题三 解线性方程组的迭代法
实验目标:
分别采用Jacobi迭代法,Gauss-Seidel迭代法和SOR迭代法求解线性方程组。
Jocabi迭代法:
#include
#include
using namespace std;
int i,j,k; //计数器
int M = 2000;
int Array(double ***Arr, int n){
double **p;
int i;
p=(double **)malloc(n*sizeof(double *));
if(!p)return 0;
for(i=0;i
{
p[i]=(double *)malloc(n*sizeof(double));
if(!p[i])return 0;
}
*Arr=p;
return 1;
}
void main()
{
double eps ;
cout<<"默认最多迭代次数为2000次"<
cin>>eps;
double **matrix;
int n;
cout<<"矩阵大小为:";
cin>>n;
double *X;
X= new double[n];
double *Y;
Y= new double[n];
double *G;
G= new double[n];
for(i=0;i
}
if(!Array(&matrix,n))
cout<<"内存分配失败!";
else
cout<<"请输入矩阵:"<
for( i=0;i
for( j=0;j
cin>>matrix[i][j];
}
}
cout<<"请输入右端项:"<
double *B;
B = new double[n];
for(i=0;i
cin>>B[i];
}
for (i = 0 ;i< n;i++)
{
数值分析实验报告
姓名 学号 日期
实验项目 解非线性方程组的Newton迭代法 指导教师
一、上机实验的问题和要求(需求分析):
掌握求解非线性方程方程组的Newton迭代法编程运算
二、程序设计的基本思想,原理和算法描述:
使用Newton迭代法求解非线性方程组122212230450xxxx,容许误差选为1.0E-5,给出初值分别选取为(1.5,1.0),(2.0,2.0),(1000,1000)时迭代步数,并分析迭代步数之间差别的原因.
算法的描述:
1 . 定义函数newton,自变量为x向量,输出结果为方程的解和迭代次数
2 .采用while循环带入迭代公式实现反复迭代。
3 . 以误差选为1.0E-5,即510为终止循环的条件。
三、主要程序代码或命令:
function x=newton(x0)
error=1.0;
k=0;
x=x0;
while error>1.0e-5
d=dfun(x);
f=fun(x);
y=x-inv(d)*f;
error=norm(y-x);
x=y;
k=k+1;
end
x
k
%%
function f=fun(x)
f1=x(1)+2*x(2)-3; f2=4*x(1)^2+x(2)^2-5;
f=[f1; f2];
%%
function df=dfun(x)
df=[1,2;8*x(1),2*x(2)];
四、调试和运行程序过程中产生的问题及采取的措施:
开始输入时,输入的行向量,结果出错,经分析矩阵的算法规则,后改为列向量,结果正确。
五、运行输出结果及分析:
结果:初值分别选取为(1.5,1.0),(2.0,2.0),(1000,1000)时,方程组的解的结果相同,但是迭代步数分别为5、5、15。
分析:说明当初值选取在精确值附近时,迭代步数较少;而距离精确值较远时,迭代步数较多。