|
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
|