#include "stdio.h"
#include "conio.h"
#include "math.h"
#include "stdlib.h"
#define Et 1e-3 /* 下山因子下界 */
#define E1 1e-3 /* 根的误差限 */
#define E2 1e-3 /* 残量精度 */
double f(double x) { return x*x*x - x - 1;} /* f(x)的表达式 */
double f1(double x) { return 3*x*x - 1;} /* f(x)的导数 */
void main()
{
int b;
double f(double);
double f1(double);
void errormess(int); /* 根据计算结果,输出判断情况 */
double x0;
int Newton(double(*)(double),double(*)(double),double &x0);
x0 = 0.6;
b = Newton(f,f1,x0);
if( b = 1 ) printf("\n\nThe root of is x=%f\n\n",x0);
else errormess(b);
}
int Newton( double(*f)(double), double(*f1)(double), double &x0 )
{
int k = 0;
double t = 1.0;
double xk;
printf("k\t\t t\t\t xk\t\t f(xk)\n");
printf("--------------------------------------------------------------------------------");
printf("%d\t\t\t\t%f\t%f\t\t\t",k,x0,f(x0));
xk = x0 - t*( f(x0)/f1(x0) );
k = k+1;
printf("%d\t\t\%f\t%f\t%f", k , t , xk , f(xk) );
while( ( fabs( f(xk) ) > fabs( f(x0) ) ) && ( fabs( f(xk) ) > E2 ) )
{
printf(" 不满足下山条件");
if( t >= Et ) t = t/2 ;
xk = x0 - t*( f(x0) / f1(x0) );
printf("\t%d\t\t%f\t%f\t%f",k,t,xk,f(xk));
}
printf(" 下山成功");
if( (fabs( f(xk) ) < fabs( f(x0) )) && ( fabs( f(xk) ) > E2 ) )
{
t = 1.0 ;
do
{
k++;
x0 = xk;
xk = x0 - t*( f(x0) / f1(x0) );
printf("\t\t%d\t\t%f\t%f\t%f",k,t,xk,f(xk));
printf(" 下山成功");
}while( fabs( xk - x0 ) > E1 );
}
x0 = xk ;
return 1;
}
void errormess(int b)
{
char *mess;
switch(b)
{
case
-1:mess = "f(x)的导数为0!";break;
case
-2:mess = "下山因子已越界,下山处理失败";break;
default:
mess = "其他类型错误!";
}
printf("the method has failed ! because %s",mess);
}