双点割线法解非线性方程

1 题目:

双点割线法解非线性方程。

2 算法原理:

见《计算方法教程(第2版)》,凌永祥,陈明奎。西安交通大学出版社。2005年4月第二版。第199页到第200页。

3 代码:

以C语言编写,编译执行环境为VC++6.0。

//---------------------MyCFile.c------------------ /* File name: MyCFile.c Comments: This file contains a simple sample program. */ //改进的双点割线法_函数形式 //---------------------Include Files------------- #include <stdio.h> #include <math.h> //-----------------end Include Files------------- double SECANT(double x0, double x1, double eps1, double eps2, int Nmax, double (*funcpstr)(double));//该函数用割线法求f(x)=0的根。x0, x1 //是初始近似,eps1是自变量的相对误差界,eps2是函数值的误差界, //Nmax是最大迭代次数,funcpstr是指向f(x)的函数指针。返回值即为 //f(x)=0的解。 double func_sec(double x)//f(x)函数 { return (x + exp(x) - 2); } int main() { printf("方程的解为x = %.7lf/n", SECANT(0, 1, 0.0000001, 0.0000001, 10, func_sec)); return(0); } double SECANT(double x0, double x1, double eps1, double eps2, int Nmax, double (*funcpstr)(double)) { double f0, f1, f, x, s; int k; f0 = (*funcpstr)(x0); f1 = (*funcpstr)(x1); //使|f1| < |f0| if( fabs(f1) > fabs(f0) ) { x = x1; f = f1; x1 = x0; f1 = f0; x0 = x; f0 = f; } //割线法进行迭代 for(k = 0; k < Nmax; k++) { //|f1| < eps2,输出x1作为结果 if(fabs(f1) < eps2) return x1; //利用割线法迭代公式进行迭代 s = f1 / f0; x = x1 - ( (x0 - x1) * s ) / (1 - s); //test 输出每次迭代结果 // printf("x[%d] = %lf/n", k+2, x); f = (*funcpstr)(x); //|x1-x| < eps*|x|,输出x作为结果 if( fabs(x1-x) < eps1 * fabs(x) ) return x; //重新确定f0,f1,x0,x1值 if(fabs(f) > fabs(f1)) { x0 = x; f0 = f; } else { x0 = x1; f0 = f1; x1 = x; f1 = f; } } //输出Nmax次仍不收敛 printf("输出%d次仍不收敛/n", Nmax); return 0; } //------------------end MyCFile.c-----------------

4 输出结果:

方程的解为 x = 0.4428544

Press any key to continue

本程序是采用上述参考书中第198页例题5.5.

你可能感兴趣的:(算法,File,语言,include,交通,出版)