2013年3月3日 星期日

the bisection method 二分逼近法 例子1

例子 1:
use the bisection method to find $p_3$ for $f(x)=x^3+4x^2-10$ on $[1,2]$.

首先說明其有根:
因為函數 $f$ 在 $[1,2]$ 連續,且 $f(1)f(2)<0$,由 IVT 可知函數 $f$ 在 $[1,2]$ 中有根。

接者尋找 $p_3$ :

1. $a_1=1$, $b_1=2$,  則 $p_1=\frac{1}{2}(1+2)=\frac{3}{2}$.

2. $a_2=1$, $b_2=p_1=\frac{3}{2}$,  則 $p_2=\frac{5}{4}$.

3. $a_3=p_2=\frac{5}{4}$, $b_3=\frac{3}{2}$,  則 $p_3=\frac{1}{2}(\frac{5}{4}+\frac{3}{2})$.
 
000

using c language:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>       /**/
  4. float f(float u);
  5. int sig(float v);
  6. int main(void)
  7. { 
  8.     int i=0,N=10000;
  9.     float a=1.0,b=2.0,p=1.5,FA=0.0,FP=0.0;
  10.     float TOL=0.0000001;
  11.    
  12.     printf("n   an          bn              pn             f(pn)\n");
  13.     /*Step1*/
  14.     i=1;
  15.     FA=f(a);
  16.    
  17.     /*Step2*/
  18.     while(i<=N)
  19.     {    /*Step3*/
  20.          p=a+(b-a)/2;
  21.          FP=f(p);
  22.         
  23.     printf("%2d    %.9f    %.9f    %.9f    %+.9f\n",i,a,b,p,f(p));    
  24.         
  25.          /*Step4*/
  26.          if(FP==0 || (b-a)/2<TOL)
  27.          {printf("n=%d, p=%+f\n",i,p);break;}
  28.         
  29.          /*Step5*/
  30.          i=i+1;
  31.         
  32.          /*Step6*/
  33.          if(sig(FA)*sig(FP)>0){a=p;FA=FP;}
  34.          else b=p;
  35.          }
  36.     printf("method failed after N=%d iterations.",N);
  37.    
  38.  
  39.    
  40. system("PAUSE");
  41. return 0;       
  42.    }
  43.   
  44.   
  45. float f(float u)
  46. {
  47.       return u*u*u+4*u*u-10;
  48.       }
  49.      
  50. int sig(float u)
  51. {   
  52.      if(u>0){return 1;}
  53.      else if(u<0){return -1;}
  54.      else 0; 
  55.      }

其執行結果:

當 $n=3$, 則 $p_3=1.375$.

 
example1

沒有留言:

張貼留言