求=0的根。
算法原理见《计算方法教程(第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版)》,凌永祥、陈明奎编著,西安交通大学出版社,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.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);
}
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|的判断条件)计算 =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
,f(1) < 0, f(2) > 0, 所以(1, 2)间必有f(x) = 0的解。
,
在牛顿迭代法中,取x0 = 1.0,不满足这个条件,但牛顿迭代仍收敛。说明第212页的定理5.4中并不能包含所有的牛顿迭代收敛情况,即,满足定理 5.4的牛顿迭代必定收敛,但不满足定理5.4的牛顿迭代并不一定不收敛,也可能收敛。
另外,发现取x0 = 2.0时,满足,即满足定理5.4,收敛速度比取x0 = 1.0时要快。
改进的双点割线法并没有比普通双点割线法的收敛速度快。