牛顿迭代法、双点割线法及改进的双点割线法的比较

牛顿迭代法、双点割线法及改进的双点割线法的比较

1 题目:

wps_clip_image-71=0的根。

2 算法组织:

2.1 牛顿迭代法

算法原理见《计算方法教程(第2版)》,凌永祥、陈明奎编著,西安交通大学出版社,2005年4月第2版,第194至第195页。

代码:(C代码,运行环境为VC++6.0)

//牛顿迭代法解非线性方程

//---------------------Include Files-------------

#include

#include

//-----------------end Include Files-------------

#define M 10//迭代次数

double f(double x);//f(x)函数

double df(double x);//f(x)的导数

int main()

{

double x[100];

int i = 1;

x[0] = 1;

for(; i < M; i++)

{

x[i] = x[i-1] - f(x[i-1]) / df(x[i-1]);

printf("x[%d] = %.7lf/n", i, x[i]);

}

return(0);

}

double f(double x)

{

return  (pow(x,3)-4);

}

double df(double x)

{

return (3*pow(x,2));

}

2.2 双点割线法

算法原理见《计算方法教程(第2版)》,凌永祥、陈明奎编著,西安交通大学出版社,2005年4月第2版,第197至第199页。

代码:(C代码,运行环境为VC++6.0)

//双点割线法

//---------------------Include Files-------------

#include

#include

//-----------------end Include Files-------------

#define M 10//迭代次数

double f(double x);//f(x)函数

int main()

{

double x[100];

int i = 1;

double s = 0;

x[0] = 0;

x[1] = 1.0;

for(; i < M; i++)

{

s = f(x[i]) / f(x[i-1]);

x[i+1] = x[i] + s * ( x[i] - x[i-1] ) / ( 1 - s );//(5-11c)式

printf("x[%d] = %.7lf/n", i+1, x[i+1]);

}

return(0);

}

double f(double x)

{

return  (pow(x,3)-4);

}

2.3 改进的双点割线法

改进之处主要在2.2部分的代码中加了一个条件判断,算法原理见《计算方法教程(第2版)》,凌永祥、陈明奎编著,西安交通大学出版社,2005年4月第2版,第199页SECANT1算法。

代码:(C代码,运行环境为VC++6.0)

//改进的双点割线法

//---------------------Include Files-------------

#include

#include

//-----------------end Include Files-------------

#define M 10//迭代次数

double f(double x);//f(x)函数

int main()

{

int i = 1;

double s = 0;

double f0, f1, x0, x1, f_temp, x_temp;

x0 = 1.0;

x1 = 2.0;

f0 = f(x0);

f1 = f(x1);

if(fabs(f1) > fabs(f0))//改进的地方

{

x_temp = x0;

x0 = x1;

x1 = x_temp;

x_temp = f0;

f0 = f1;

f1 = x_temp;

}

for(; i < M; i++)

{

s = f1/ f0;

x_temp = x1 - s * ( x0 - x1 ) / ( 1 - s );//(5-11c)式

printf("x[%d] = %.7lf/n", i+1, x_temp);

f_temp = f(x_temp);

if(fabs(f_temp)>fabs(f1))//改进的地方

{

x0 = x_temp;

f0 = f_temp;

}

else

{

x0 = x1;

f0 = f1;

x1 = x_temp;

f1 = f_temp;

}

}

return(0);

}

double f(double x)

{

return (pow(x,3)-4);

}

3 计算结果与分析:

3.1 计算结果:

Newton迭代法计算 =0的解,取x0 = 1.0

x[1] = 2.0000000

x[2] = 1.6666667

x[3] = 1.5911111

x[4] = 1.5874097

x[5] = 1.5874011

x[6] = 1.5874011

x[7] = 1.5874011

x[8] = 1.5874011

x[9] = 1.5874011

Press any key to continue

Newton迭代法计算 =0的解,取x0 = 2.0

x[1] = 1.6666667

x[2] = 1.5911111

x[3] = 1.5874097

x[4] = 1.5874011

x[5] = 1.5874011

x[6] = 1.5874011

x[7] = 1.5874011

x[8] = 1.5874011

x[9] = 1.5874011

Press any key to continue

用双点割线法计算 =0的解:取x0 = 1.0, x1 = 2.0

x[2] = 1.4285714

x[3] = 1.5504587

x[4] = 1.5914243

x[5] = 1.5873061

x[6] = 1.5874008

x[7] = 1.5874011

x[8] = 1.5874011

x[9] = 1.5874011

x[10] = 1.5874011

Press any key to continue

用改进后的双点割线法(加上|f1|>|f0|的判断条件)计算 wps_clip_image-3065=0的解:取x0 = 1.0, x1 = 2.0

x[2] = 1.4285714

x[3] = 1.6712329

x[4] = 1.5787586

x[5] = 1.5869588

x[6] = 1.5874035

x[7] = 1.5874011

x[8] = 1.5874011

x[9] = 1.5874011

x[10] = 1.5874011

Press any key to continue

3.2 结果分析

wps_clip_image-3322,f(1) < 0, f(2) > 0, 所以(1, 2)间必有f(x) = 0的解。

wps_clip_image-3451

在牛顿迭代法中,取x0 = 1.0,不满足这个条件,但牛顿迭代仍收敛。说明第212页的定理5.4中并不能包含所有的牛顿迭代收敛情况,即,满足定理 5.4的牛顿迭代必定收敛,但不满足定理5.4的牛顿迭代并不一定不收敛,也可能收敛。

另外,发现取x0 = 2.0时,满足wps_clip_image-3669,即满足定理5.4,收敛速度比取x0 = 1.0时要快。

改进的双点割线法并没有比普通双点割线法的收敛速度快。

你可能感兴趣的:(牛顿迭代法、双点割线法及改进的双点割线法的比较)