程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> C語言基礎知識 >> 實用算法(基礎算法-遞推法-02)

實用算法(基礎算法-遞推法-02)

編輯:C語言基礎知識

  
  
  順推法
      倒推法的逆過程就是順推法,即由邊界條件出發,通過遞推關系式推出後項值,再由後項值按遞推關系式推出再後項值......,依次遞推,直至從問題初始陳述向前推進到這個問題的解為止。
      實數數列:一個實數數列共有N項,已知
              ai=(ai-1-ai+1)/2+d,   (1<i<N)(N<60)
      鍵盤輸入N,d,a1,an,m,輸出am
      輸入數據均不需判錯。
  算法分析:
      分析該題,對公式:
          Ai=(Ai-1-Ai+1)/2+d         (1<i<N)     (n<60)
      作一翻推敲,探討其數字變換規律。不然的話會無從下手。
      令 X=A2   s2[i]=(pi,Qi,Ri)表示Ai=PiX+QiD+RiA1
      我們可以根據
          Ai=Ai-2-2Ai-1+2D
            =PiX+QiD+RiA1
      推出公式
          PiX+QiD+RiA1=(Pi-2-2Pi-1)X+(Qi-2-2Qi-1+2)D+(Ri-2-2Ri-1)A1
      比較等號兩端X,D和A1的系數項,可得
          Pi=Pi-2-2Pi-1
          Qi=Qi-2-2Qi-1+2
          Ri=Ri-2-2Ri-1
      加上兩個邊界條件
          P1=0    Q1=0    R1=1    (A1=A1)
          P2=1    Q2=0    R2=0    (A2=A2)
      根據Pi、Qi、Ri的遞推式,可以計算出
          S2[1]=(0,0,1);
          S2[3]=(-2,2,1);
          S2[4]=(5,-2,-2);
          S2[5]=(-12,8,5);
          ...................
          S2[i]=(Pi,Qi,Ri);
          ...................
          S2[N]=(PN,QN,RN);
      有了上述基礎,AM便不難求得。有兩種方法:
      1、由於AN、A1和PN、QN、RN已知,因此可以先根據公式:
          A2=AN-QND-RNA1/PN
      求出A2。然後將A2代入公式
          A3=A1-2A2+2D
      求出A3。然後將A3代入公式
          A4=A2-2A3+2D
      求出A4。然後將A4代入公式
      ............................
      求出Ai-1。然後將Ai-1代入公式
          Ai=Ai-2-2Ai-1+2D
      求出Ai。依此類推,直至遞推至AM為止。
      上述算法的缺陷是由於A2是兩數相除的結果,而除數PN遞增,因此精度誤差在所難免,以後的遞推過程又不斷地將誤差擴大,以至當M超過40時,求出的AM明顯徧離正確值。顯然這種方法簡單但不可靠。
      2、我們令A2=A2,A3=X,由S3[i]=(Pi,Qi,Ri)表示Ai=PiX+QiD+RiA2  (i>=2) 可計算出:
          S3[2]=(0,0,1)=S2[1];
          S3[3]=(1,0,0)=S2[2];
          S3[4]=(-2,2,1)=S2[3];
          S3[5]=(5,-2-2)=S2[4];
          ......................
          S3[i]=(..........)=S2[i-1];
          .....................
          S3[N]=(..........)=S2[N-1];
      再令A3=A3,A4=X,由S4[i]=(pi,Qi,Ri)表示Ai=PiX+QiD+RiA3   (i>=3) 可計算得出:
          S4[3]=(0,0,1)=S3[2]=S2[1];
          S4[4]=(1,0,0)=S3[3]=S2[2];
          S4[5]=(-22,1)=S3[4]=S2[3];
          ..........................
          S4[i]=(...........)=S3[i-1]=S2[i-2];
          .......................
          S4[N]=(...........)=S3[N-1]=S2[N-2];
       依此類推,我們可以發現一個有趣的式子:
          AN=PN-i+2*Ai+QN-i+2*D+RN-i+2*Ai-1,  即
          Ai=(AN-QN-i+2*D-RN-i+2*Ai-1)/PN-i+2
      我們從已知量A1和AN出發,依據上述公式順序遞推A2、A3、...、AM.由於PN-i+2遞減,因此最後得出的AM要比第一種算法趨於精確。
  程序代碼如下:
  program ND1P4;
  const
      maxn    =60;
  var
      n,m,i    :integer;
      d        :real;
      list     :array[1..maxn] of real;        {list[i]-------對應ai}
      s        :array[1..maxn,1..3] of real;   {s[i,1]--------對應Pi}
                                               {s[i,2]--------對應Qi}
                                               {s[i,3]--------對應Ri}
  procedure init;
      begin
          write('n m d =');
       
  
 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved