お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





FDelphi FAQ
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル

"数値積分 << ルジャンドル・ガウス >>"





■説明
 閉区間 [ a, b ] においての定積分の近似値をルジャンドル・ガウス
の公式を用いて求めます。

 [ルジャンドル・ガウスの公式]                                  

          b           b − a   n                                
   S = ∫ f(X) dX = ──── Σ Ci f(Xi)                       
         a              2     i=1                               
                                                                
            a + b      b − a                                  
      Xi = ──── + ──── Ti  ( i = 1, 2, 3, ..., n )     
              2           2                                     


    Ci, Ti の値は数表になっていて4点公式の場合には、         

   T1 = -0.861136           C1 = 0.347855                    
      T2 = -0.339981           C2 = 0.652145                    
      T3 =  0.339981           C3 = 0.652145                    
      T4 =  0.861136           C4 = 0.347855                    

 となっています。不等間隔分点でありますが、精度が良いです。
 Form1 に Edit1 〜 Edit3, Button1 を適当に配置して下さい。

      Edit1 : a の値を入力します。
      Edit2 : b の値を入力します。
      Edit3 : 定積分の近似値が表示されます。

 なお、被積分関数は、function F( X : Extended ): Extended; 部分
で定義して下さい。下記例では、

                  1     
     f(X) = ──────
        1 + X^2  

 となっています。

■注意点
 例外発生に対する処理は省略してあります。

■サンプルコード
//=====================================================================
implementation

{$R *.DFM}

type
  TIntegrand = function( X : Extended ): Extended;

function F( X : Extended ): Extended;
begin
  Result := 1 / ( 1 + X * X );   //被積分関数をここに定義して下さい
end;

function LGIntegral( Integrand : TIntegrand;
                                   const a, b : Extended ) : Extended;
const
  T : array[ 1..4 ] of Extended = ( -0.861136,  // T1
                                    -0.339981,  // T2
                                     0.339981,  // T3
                                     0.861136 );// T4
  C : array[ 1..4 ] of Extended = (  0.347855,  // C1
                                     0.652145,  // C2
                                     0.652145,  // C3
                                     0.347855 );// C4
var
  BmA, ApB, SIGMA, X : Extended;
  i : Integer;
begin
  Result := 0;                            //エラー処理は適当に
  if not Assigned( Integrand ) then Exit; //変更して下さい。
  BmA := ( B - A ) / 2.0;
  ApB := ( A + B ) / 2.0;
  SIGMA := 0;
  for i := 1 to 4 do
    begin
      X := ApB + BmA * T[i];
      SIGMA := SIGMA + C[i] * Integrand( X );
    end;
  Result := BmA * SIGMA;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  A, B : Extended;
begin
  A := StrToFloat( Edit1.Text );
  B := StrToFloat( Edit2.Text );
  Edit3.Text := FloatToStr( LGIntegral( F, A, B ) );
end;
//=====================================================================

                                     97/11/27(木) 17:30 Fermion(KHF03264)

Original document by Fermion         氏 ID:(KHF03264)


ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。

Copyright 1996-2002 Delphi Users' Forum