非線性方程組的數值解法:區間二分法/迭代法/牛頓法/單絃點法/雙弦點法

 //1.區間二分法
#include <iostream.h>
#include <math.h>
void main()
{  float f(float x);
   float a=3,b=4,y1,y2,y0;
   do{y1=f(a);
      y2=f(b);
   y0=f((a+b)/2);
   if(y0==0) cout<<"x="<<(a+b)/2<<endl;
      else if(y1*y0<0) b=(a+b)/2;
      else if(y2*y0<0) a=(a+b)/2;
     }while(fabs(b-a)>0.001);
   cout<<"x="<<(a+b)/2<<endl;
}  
float f(float x)
{ float y;
  y=x*x*x-2*x*x-4*x-7;
  return y;
}

****************************************************
//2迭代法
#include <iostream.h>
#include <math.h>
double f(double x);
main()
{
  double x0=1.0,x;
  x=f(x0);
  cout<<"x0="<<x0<<endl<<"f(x0)="<<x<<endl;
  do
  {
   x=f(x);
   if(x>0.00001)break;//爲什麼加了這條語句就才行。不加就是死循環呢?
  }while(x>0.00001);//這個不是有個條件了嗎???
  cout<<"x="<<x<<endl;
  return 0;
}
double f(double x)
{double y;
 y=pow((x+0.2),0.2);
 return y;
}
 
爲什麼x0的初值不一樣,答案也不一樣??????
************************************************
//3.牛頓法
#include <iostream.h>
#include <math.h>
void main()
{  float f(float x);
   float f1(float x);
   float x0=2.0,x1;
   int k=1;
   do
   {   //cout<<f(x0)<<"--"<<f1(x0)<<endl;
    if(f1(x0)==0)  {cout<<"奇異"<<endl;break;}
       else x1=x0-f(x0)/f1(x0);
       if(fabs(x1-x0)<0.0001) {cout<<"x="<<x1<<endl;break;}
    else x0=x1;k++;
   }while(k<5); 
}
float f(float x)
{   float y;
 y=x*x*x-3*x-1;
 return y;
}
float f1(float x)
{   float y;
 y=3*x*x-3;
 return y;
}
 
***************************************
//單絃點法
#include <iostream.h>
#include <math.h>
void main()
{ float f(float x);
  float f1(float x);
  float x0=1.5,x1=1,x2,y,y1,y2;
  int k=1;
  y=f(x0);y1=f(x1);
  cout<<"f(x0)="<<y<<"  "<<"f(x1)="<<y1<<endl;
  for(;k<10;k++)
  {  x2=x1-f(x1)*(x1-x0)/(f(x1)-f(x0));
     y2=f(x2);
     if(f(x2)==0) {cout<<"x="<<x2<<endl;break;}
     else {y1=y2;x1=x2;}
  }
  cout<<"x="<<x2<<endl;
}
float f(float x)
{float y;
 y=x*x*x-2*x*x+10*x-2;
 return y;
}
//雙弦點法
#include <iostream.h>
#include <math.h>
void main()
{ float f(float x);
  float xpoint(float x0,float x1);
  float x0=1.5,x1=1,x2,y,y1,y2;
  int k=1;
  y=f(x0);y1=f(x1);
  cout<<"f(x0)="<<y<<"  "<<"f(x1)="<<y1<<endl;
  for(;k<10;k++)
  {  x2=xpoint(x0,x1);
     y2=f(x2);
     if(fabs(f(x2))<0.000001) {cout<<"x="<<x2<<endl;break;}
     else
  {
      y=y1;y1=y2;
   x0=x1;x1=x2;
  }
  }
}
float f(float x)
{float y;
 y=x*x*x-2*x*x+10*x-2;
 return y;
}
float xpoint(float x0,float x1)
{float y;
 y=x1-f(x1)*(x1-x0)/(f(x1)-f(x0));
 return y;
}

 


本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/cinderellajoan/archive/2008/12/20/3561050.aspx

發佈了30 篇原創文章 · 獲贊 0 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章