16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル
"数値積分 << シンプソン >>"
この発言に対し以下のコメントが寄せられています
#00348 はんばあぐ さん RE:数値積分用Unit
#00352 Fermion さん RE:数値積分用Unit(2)
■説明
閉区間 [ a, b ] においての定積分の近似値をシンプソンの公式を用
いて求めます。
[シンプソンの公式]
b
S = ∫ f(X) dX
a
h m m-1
= −{ f(a) + 4Σf(X2i-1) + 2Σf(X2i) + f(b) }
3 i=1 i=1
(b−a)
h= ──── Xi = a + ih ( i = 1, 2, ..., 2m - 1 )
2m ,
積分区間を 2m の小区間に分け、放物線で近似して求めます。
Form1 に Edit1 〜 Edit3, Button1 を適当に配置して下さい。
Edit1 : a の値を入力します。
Edit2 : b の値を入力します。
Edit3 : 定積分の近似値が表示されます。
なお、被積分関数は、function F( X : Extended ): Extended; 部分
で定義して下さい。下記例では、
1
f(X) = ──────
1 + X^2
となっています。( m = 100 で計算させています。)
■注意点
例外発生に対する処理は省略してあります。
■サンプルコード
//=====================================================================
implementation
{$R *.DFM}
type
TIntegrand = function( X : Extended ): Extended;
function F( X : Extended ): Extended;
begin
Result := 1 / ( 1 + X * X ); //被積分関数をここに定義して下さい
end;
function SimpIntegral( Integrand : TIntegrand;
const a, b : Extended; const m : Integer ) : Extended;
var
h, S1, S2, X : Extended;
i : Integer;
begin
Result := 0; //エラー処理は適当に
if not Assigned( Integrand ) then Exit; //変更して下さい。
h := ( B - A ) / ( 2 * m );
S1 := 0;
S2 := 0;
X := A;
for i := 1 to m - 1 do
begin
X := X + h;
S1 := S1 + Integrand( X );
X := X + h;
S2 := S2 + Integrand( X );
end;
S1 := S1 + Integrand( X + h );
Result := ( Integrand( A ) + 4.0 * S1 + 2.0 * S2 + Integrand( B ) )
* h / 3.0;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
A, B : Extended;
begin
A := StrToFloat( Edit1.Text );
B := StrToFloat( Edit2.Text );
Edit3.Text := FloatToStr( SimpIntegral( F, A, B, 100 ) );
end;
//=====================================================================
97/11/27(木) 18:02 Fermion(KHF03264)
Original document by Fermion 氏 ID:(KHF03264)
ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。
Copyright 1996-2002 Delphi Users' Forum
|