📄 newton.txt
字号:
#include<iostream.h>
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
double diff(double(*)(double),double); /*中心差商法求导数,dy/dx=(f(x2)-f(x1))/(2*Deltax)*/
double fun(double); /*要求导的目标函数*/
double tangent(double(*)(double),double); //切线法
void main()
{
double x,x0;
cout<<"please input the initial point,x0=";
cin>>x0;
cout<<endl;
x=tangent(fun,x0);
cout<<"A root of equation is "<<x<<endl;
}
//函数实现
double fun(double x)
{return pow(x,3)+1.1*pow(x,2)+0.9*x-1.4;}//目标函数
double diff(double(*f)(double),double x)
{
const double epsilon=1.0e-6;
double x1,x2,Deltax=1,y[2],Accurate;
int i;
x1=x-Deltax;
x2=x+Deltax;
for(i=0;i<2;i++)
{
if(Deltax!=0)
{
y[i]=(f(x2)-f(x1))/(2*Deltax);
}
else
{
printf("Error,devided by zero!The devided number Deltax=0!");
exit(1);
}
Deltax=0.5*Deltax;
x1=x-Deltax;
x2=x+Deltax;
}
/*采用函数值下降量准则,或者采用函数值下降量的相对准则,以保证精度*/
if(y[0]!=0)
Accurate=fabs((y[1]-y[0])/y[0]);
else
Accurate=fabs(y[1]-y[0]);
while(Accurate>epsilon)
{
y[0]=y[1];
if(Deltax!=0)
{
y[1]=(f(x2)-f(x1))/(2*Deltax);
}
else
{
printf("Error,devided by zero!The devided number Deltax=0!");
exit(1);
}
if(y[0]!=0) Accurate=fabs((y[1]-y[0])/y[0]);
else Accurate=fabs(y[1]-y[0]);
Deltax=0.5*Deltax;
x1=x-Deltax;
x2=x+Deltax;
}
return y[1];
}
double tangent(double(*f)(double),double x0)
{
const double eps=1.0e-6;
double x1,x2,s,v;
x1=x0;
s=f(x1);
v=diff(f,x1);
x2=x1-s/v;
while(fabs(x2-x1)>eps)
{
x1=x2;
s=f(x1);
v=diff(*f,x1);
x2=x1-s/v;
}
return x2;
}
typedef double (*f)( double x ); // 定义一个单变量函数指针,作为
// Newton迭代的参数输入的类型
double f1( double x ) // 要求解的函数
{
return cos(x);
}
double f11( double x ) // 要求解的函数的一阶导数函数
{
return -sin(x)-1;
}
double Newton( f f1,f f2,double x0,double e ) // 通用Newton迭代子程序
{
double x1,x2;
x1 = x2 = x0;
do{
x1 = x2;
x2 = x1 - f1( x1 ) / f2( x1 );
}while( fabs( x2 - x1 ) > e );
return( (x1+x2)*0.5 );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -