16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル
"RE^3:数値積分用Unit"
この発言は #00351 Fermion さんのRE^2:数値積分用Unit に対するコメントです
Fermion さん、こんにちは。
まさしくその通りです.素晴らしい(^o^).
計算がとっても速くなりました.ありがとうございますm(_ _)m.
Fermionさんの数値積分用Unit(2)で事足りているのですが,私のを修正し
たのも一応載せておきます.
●コメント
変数の代入の仕方がFerimonさんのと若干違い,紛らわしくてごめんなさい.
使い方は,以前のものと同じです.
-----------------------------------------------------------
unit UnitIntegral;
interface
type
TFunction = function(x: Double) : Double; // 関数型の宣言
TIntegral = class // class型の宣言 台形近似
private // privete宣言
Fa: Double; // 定義域 下
Fb: Double; // 定義域 上
Fn: Integer; // 定義域をn等分
Ff: TFunction; // 関数型のインスタンス
function Calculate: Double; virtual;// 計算部分
public // public宣言
constructor Create(a,b: Double; n: Integer; f: TFunction);
function Show: Double; //結果の表示
end;
TLGIntegral = class(TIntegral) //ルジャンドル・ガウス
private
function Calculate: Double; override;//計算部分
public
constructor Create(a,b: Double; f: TFunction); //4点
end;
TSimpIntegral = class(TIntegral)//シンプソン
private
function Calculate: Double; override;//計算部分
end;
implementation
//####################################################台形近似
constructor TIntegral.Create(a,b: Double; n: Integer; f: TFunction);
begin
Fa := a; // fieldに代入
Fb := b;
Ff := f;
Fn := n;
end;
function TIntegral.Calculate : Double; // 台形近似計算
var
i: Integer;
S,
x,xdelta: Double;
begin
S:=0;
// xの増分幅xdeltaを求める
xdelta := ( Fb - Fa )/Fn;
For i:= 1 to Fn - 1 Do // 面積計算
begin
x := Fa + xdelta*i;
S := S + Ff(x);
end;
S := S + ( Ff(Fa) + Ff(Fb) )/2.0;
Result := S * xdelta;
end;
function TIntegral.Show: Double; // 計算結果を表示
begin
Result := Calculate;
end;
//####################################################ルジャンドル・ガウ
ス
constructor TLGIntegral.Create(a,b: Double; f: TFunction);
begin
Fa := a;
Fb := b;
Ff := f;
end;
function TLGIntegral.Calculate: Double;
const
T : array[ 1..4 ] of Double = ( -0.861136, // T1
-0.339981, // T2
0.339981, // T3
0.861136 );// T4
C : array[ 1..4 ] of Double = ( 0.347855, // C1
0.652145, // C2
0.652145, // C3
0.347855 );// C4
var
BmA, ApB, SIGMA, X : Double;
i : Integer;
begin
BmA := ( Fb - Fa ) / 2.0;
ApB := ( Fa + Fb ) / 2.0;
SIGMA := 0;
for i := 1 to 4 do
begin
X := ApB + BmA * T[i];
SIGMA := SIGMA + C[i] * Ff( X );
end;
Result := BmA * SIGMA;
end;
//####################################################シンプソン
function TSimpIntegral.Calculate: Double;
var
h, S1, S2, X : Double;
i : Integer;
begin
h := ( Fb - Fa ) / ( 2 * Fn );
S1 := 0;
S2 := 0;
X := Fa;
for i := 1 to Fn - 1 do
begin
X := X + h;
S1 := S1 + Ff( X );
X := X + h;
S2 := S2 + Ff( X );
end;
S1 := S1 + Ff( X + h );
Result := ( Ff( Fa ) + 4.0 * S1 + 2.0 * S2 + Ff( Fb ) )
* h / 3.0;
end;
end.
------------------------------------------------------------------------
_/_/_/ 98/01/21(水) pm 01:26 _/_/_/
_/_/_/ はんばあぐ(BZQ00131@niftyserve.or.jp) _/_/_/
_/_/_/ 杉真理 Fan Club "Dream Land" 会員番号 296 _/_/_/
Original document by はんばあぐ 氏 ID:(BZQ00131)
ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。
Copyright 1996-2002 Delphi Users' Forum
|