用弦截法求一元三次方程的根x^3-5x^2+16x-80=0 ;帶注釋!


//用弦截法求一元三次方程的根x^3-5x^2+16x-80=0
#include<stdio.h>
#include<math.h>
 float f(float x) //定義子函數f(x) = x^3-5x^2+16x-80,當f(x) →0時,則x即為所求的實數根;
 {
     float y;
     y=((x-5.0)*x+16.0)*x-80.0;
     return(y);          //返回f(x)的值
 }
 
  float xpoint( float x1,float x2)//定義子函數xpoint,求出弦與x軸的交點的x0值;
  {
      float x0;
      x0=(x1*f(x2)-x2*f(x1))/(f(x2)-f(x1));   //計算弦與x軸交點x0位置的值
      return(x0);                      //返回x0位置的值
  }
 
  float root(float x1,float x2) //定義子函數root,求近似實根
   {
       float x0;                 
       do      //關鍵循環步驟,未達到條件前一直do循環運算;
       {
         x0=xpoint(x1,x2);  //此處調用上面的子函數xpoint(x1,x2),得到弦與x軸交點位置x0的值
         if(f(x0)*f(x1)>0)  //此處調用子函數f(x),得到x軸x0位置的f(x0)值,得到x1位置的f(x1)值,如果f(x0)*f(x1)>0,即同符號的話;
              x1=x0;           //將x0賦值 →x1,則下次繼續循環運算的區間為x0(x1)-x2
      else              //否則,如果f(x0)*f(x1)<0,即異號的話;
           x2=x0;          //將x0賦值 →x2 ,則下次繼續循環運算的區間為x1-x0(x2)
       }
       while(fabs(f(x0))>=1e-6);//當型循環判斷條件,1e-6為取值精度,f(x0)接近於0,即接近於x軸相交,如運算無結果可能循環次數太多,可減少冪的次數再試。
       return(x0);         //返回x0位置的值
   }
    
    main() //主函數
{
    float x1,x2,x0;
    do
    {
     printf("請輸入預估的實根區間的兩個數值x1,x2:\n");
     scanf("%f,%f",&x1,&x2); //輸入兩個數x1,x2
     }
     while (f(x1)*f(x2)==0);//當循環運算到f(x1)*f(x2)>=0時(0是必要條件參數),即f(x1)、f(x2)同符號,且任一個接近於0時,意味着與x軸接近相交,此時存在一個方程實根。
     x0=root(x1,x2);        //此處x0即為方程實根;
     printf("其中的一個方程實根為:%.4f",x0);
 }
 

舉個例子:x1=-10,x2=10,運算結果為:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM