お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





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