📄 牛顿下山法.cpp
字号:
#include<stdio.h>
#include<conio.h>
#include<math.h>
#include<stdlib.h>
#define Et 1e-3 //下山因子下界
#define E1 1e-3 //根的误差限
#define E2 1e-6 //残量精度
double f(double x)
{
return x*x*x-x-1;
}
double f1(double x)
{
return 3*x*x-1;
}
void errormess(int b)
{
char *mess;
switch(b)
{
case
-1:mess="f(xi)的导数的为零";
break;
case
-2:mess="下山因子已越界,下山处理失败";
break;
default :
mess="其它类型错误!";
}
printf("the method has failed !because %s",mess);
}
int Newton (double &x0)
{
double x1;
double t;
int flag=1;
int count=0;
x1=x0;t=0;//
printf("k t xk f(xk)\n");
printf("%d %f %f %f",count,t,x1,f(x1));
do
{
x0=x1;
t=2.0;
count++;
do
{
printf("\n");
t=t/2.0;
if(fabs(f(x1))<E2)
break;
if(t<Et)
flag=-2;
if(f1(x1)!=0)
x1=x0-t*f(x0)/f1(x0);
else flag=-1;
printf("%d %f %f %f",count,t,x1,f(x1));
}while(fabs(f(x0))<=fabs(f(x1))&&flag==1);
printf(" 下山成功");
}while(fabs(x0-x1)>=E1&&flag==1&&fabs(f(x1))>=E2);
x0=x1;
return flag;
}
void main()
{
int b;
double x0=0.6;
b=Newton(x0);
if(b==1)
printf("\nThe root of it x=%f\n",x0);
else errormess(b);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -