⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 newton.txt

📁 实现了牛顿数值算法。
💻 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 + -