3
interface //#################################################################### ■
16
//type //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【型】
18
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【レコード】
20
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【クラス】
22
//const //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【定数】
24
//var //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【変数】
26
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【ルーチン】
28
function Legendre( const X_:Single; const N_:Cardinal ) :Single; overload;
29
function Legendre( const X_:Double; const N_:Cardinal ) :Double; overload;
31
function Chebyshev1( const X_:Single; const N_:Cardinal ) :Single; overload;
32
function Chebyshev1( const X_:Double; const N_:Cardinal ) :Double; overload;
34
function SumLegendre( const X_:Single; const Ws_:array of Single ) :Single; overload;
35
function SumLegendre( const X_:Double; const Ws_:array of Double ) :Double; overload;
37
function SumChebyshev1( const X_:Single; const Ws_:array of Single ) :Single; overload;
38
function SumChebyshev1( const X_:Double; const Ws_:array of Double ) :Double; overload;
40
function Poly( const X_:Single; const Ks_:TSingle2D ) :Single; overload;
41
function Poly( const X_:Double; const Ks_:TDouble2D ) :Double; overload;
43
function Poly( const X_:Single; const Ks_:TSingle3D ) :Single; overload;
44
function Poly( const X_:Double; const Ks_:TDouble3D ) :Double; overload;
46
function Poly( const X_:Single; const Ks_:TSingle4D ) :Single; overload;
47
function Poly( const X_:Double; const Ks_:TDouble4D ) :Double; overload;
49
function Poly( const X_:Single; const Ks_:TSingle5D ) :Single; overload;
50
function Poly( const X_:Double; const Ks_:TDouble5D ) :Double; overload;
52
function Poly( const X_:Single; const Ks_:TSingleND ) :Single; overload;
53
function Poly( const X_:Double; const Ks_:TDoubleND ) :Double; overload;
55
function FitPoly( const P_:TSingle4D ) :TSingle4D; overload;
56
function FitPoly( const P_:TDouble4D ) :TDouble4D; overload;
58
function FitPoly( const P_:TSingle5D ) :TSingle5D; overload;
59
function FitPoly( const P_:TDouble5D ) :TDouble5D; overload;
61
procedure RandPoly( out Ks_:TSingle4D ); overload;
62
procedure RandPoly( out Ks_:TDouble4D ); overload;
64
procedure RandPoly( out Ks_:TSingle5D ); overload;
65
procedure RandPoly( out Ks_:TDouble5D ); overload;
67
implementation //############################################################### ■
69
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【レコード】
71
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【クラス】
73
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【ルーチン】
75
function Legendre( const X_:Single; const N_:Cardinal ) :Single;
80
if N_ = 0 then Result := 1
89
P2 := ( ( 2 * I - 1 ) * X_ * P1 - ( I - 1 ) * P0 ) / I;
96
function Legendre( const X_:Double; const N_:Cardinal ) :Double;
101
if N_ = 0 then Result := 1
110
P2 := ( ( 2 * I - 1 ) * X_ * P1 - ( I - 1 ) * P0 ) / I;
117
//------------------------------------------------------------------------------
119
function Chebyshev1( const X_:Single; const N_:Cardinal ) :Single;
124
if N_ = 0 then Result := 1
133
T2 := 2 * X_ * T1 - T0;
140
function Chebyshev1( const X_:Double; const N_:Cardinal ) :Double;
145
if N_ = 0 then Result := 1
154
T2 := 2 * X_ * T1 - T0;
161
//------------------------------------------------------------------------------
163
function SumLegendre( const X_:Single; const Ws_:array of Single ) :Single;
177
Result := Result + Ws_[ 1 ] * P2;
183
P2 := ( ( 2 * I - 1 ) * X_ * P1 - ( I - 1 ) * P0 ) / I;
185
Result := Result + Ws_[ I ] * P2;
190
function SumLegendre( const X_:Double; const Ws_:array of Double ) :Double;
204
Result := Result + Ws_[ 1 ] * P2;
210
P2 := ( ( 2 * I - 1 ) * X_ * P1 - ( I - 1 ) * P0 ) / I;
212
Result := Result + Ws_[ I ] * P2;
217
//------------------------------------------------------------------------------
219
function SumChebyshev1( const X_:Single; const Ws_:array of Single ) :Single;
233
Result := Result + Ws_[ 1 ] * P2;
239
P2 := 2 * X_ * P1 - P0;
241
Result := Result + Ws_[ I ] * P2;
246
function SumChebyshev1( const X_:Double; const Ws_:array of Double ) :Double;
260
Result := Result + Ws_[ 1 ] * P2;
266
P2 := 2 * X_ * P1 - P0;
268
Result := Result + Ws_[ I ] * P2;
273
//------------------------------------------------------------------------------
275
function Poly( const X_:Single; const Ks_:TSingle2D ) :Single;
277
with Ks_ do Result := _2 * X_ + _1;
280
function Poly( const X_:Double; const Ks_:TDouble2D ) :Double;
282
with Ks_ do Result := _2 * X_ + _1;
285
//------------------------------------------------------------------------------
287
function Poly( const X_:Single; const Ks_:TSingle3D ) :Single;
289
with Ks_ do Result := ( _3 * X_ + _2 ) * X_ + _1;
292
function Poly( const X_:Double; const Ks_:TDouble3D ) :Double;
294
with Ks_ do Result := ( _3 * X_ + _2 ) * X_ + _1;
297
//------------------------------------------------------------------------------
299
function Poly( const X_:Single; const Ks_:TSingle4D ) :Single;
301
with Ks_ do Result := ( ( _4 * X_ + _3 ) * X_ + _2 ) * X_ + _1;
304
function Poly( const X_:Double; const Ks_:TDouble4D ) :Double;
306
with Ks_ do Result := ( ( _4 * X_ + _3 ) * X_ + _2 ) * X_ + _1;
309
//------------------------------------------------------------------------------
311
function Poly( const X_:Single; const Ks_:TSingle5D ) :Single;
313
with Ks_ do Result := ( ( ( _5 * X_ + _4 ) * X_ + _3 ) * X_ + _2 ) * X_ + _1;
316
function Poly( const X_:Double; const Ks_:TDouble5D ) :Double;
318
with Ks_ do Result := ( ( ( _5 * X_ + _4 ) * X_ + _3 ) * X_ + _2 ) * X_ + _1;
321
//------------------------------------------------------------------------------
323
function Poly( const X_:Single; const Ks_:TSingleND ) :Single;
327
Result := Ks_[ Ks_.DimN-1 ];
329
for I := Ks_.DimN-2 downto 0 do Result := Result * X_ + Ks_[ I ];
332
function Poly( const X_:Double; const Ks_:TDoubleND ) :Double;
336
Result := Ks_[ Ks_.DimN-1 ];
338
for I := Ks_.DimN-2 downto 0 do Result := Result * X_ + Ks_[ I ];
341
//------------------------------------------------------------------------------
343
function FitPoly( const P_:TSingle4D ) :TSingle4D;
345
M :TSingleM3 = ( _11:+09 ; _12:-09/2; _13:+01 ;
346
_21:-45/2; _22:+18 ; _23:-09/2;
347
_31:+27/2; _32:-27/2; _33:+09/2; );
369
function FitPoly( const P_:TDouble4D ) :TDouble4D;
371
M :TDoubleM3 = ( _11:+09 ; _12:-09/2; _13:+01 ;
372
_21:-45/2; _22:+18 ; _23:-09/2;
373
_31:+27/2; _32:-27/2; _33:+09/2; );
395
//------------------------------------------------------------------------------
397
function FitPoly( const P_:TSingle5D ) :TSingle5D;
399
M :TSingleM4 = ( _11:+016 ; _12:-012 ; _13:+016/3; _14:-001 ;
400
_21:-208/3; _22:+076 ; _23:-112/3; _24:+022/3;
401
_31:+096 ; _32:-128 ; _33:+224/3; _34:-016 ;
402
_41:-128/3; _42:+064 ; _43:-128/3; _44:+032/3; );
426
function FitPoly( const P_:TDouble5D ) :TDouble5D;
428
M :TDoubleM4 = ( _11:+016 ; _12:-012 ; _13:+016/3; _14:-001 ;
429
_21:-208/3; _22:+076 ; _23:-112/3; _24:+022/3;
430
_31:+096 ; _32:-128 ; _33:+224/3; _34:-016 ;
431
_41:-128/3; _42:+064 ; _43:-128/3; _44:+032/3; );
455
//------------------------------------------------------------------------------
457
procedure RandPoly( out Ks_:TSingle4D );
459
Ws :array [ 0..3 ] of Single;
462
Ws[ 0 ] := 2 * Random - 1;
463
Ws[ 1 ] := 2 * Random - 1;
464
Ws[ 2 ] := 2 * Random - 1;
465
Ws[ 3 ] := 2 * Random - 1;
469
_1 := SumChebyshev1( 0/3, Ws );
470
_2 := SumChebyshev1( 1/3, Ws );
471
_3 := SumChebyshev1( 2/3, Ws );
472
_4 := SumChebyshev1( 3/3, Ws );
475
Ks_ := FitPoly( Ps / 2 );
478
procedure RandPoly( out Ks_:TDouble4D );
480
Ws :array [ 0..3 ] of Double;
483
Ws[ 0 ] := 2 * Random - 1;
484
Ws[ 1 ] := 2 * Random - 1;
485
Ws[ 2 ] := 2 * Random - 1;
486
Ws[ 3 ] := 2 * Random - 1;
490
_1 := SumChebyshev1( 0/3, Ws );
491
_2 := SumChebyshev1( 1/3, Ws );
492
_3 := SumChebyshev1( 2/3, Ws );
493
_4 := SumChebyshev1( 3/3, Ws );
496
Ks_ := FitPoly( Ps / 2 );
499
//------------------------------------------------------------------------------
501
procedure RandPoly( out Ks_:TSingle5D );
503
Ws :array [ 0..4 ] of Single;
506
Ws[ 0 ] := 2 * Random - 1;
507
Ws[ 1 ] := 2 * Random - 1;
508
Ws[ 2 ] := 2 * Random - 1;
509
Ws[ 3 ] := 2 * Random - 1;
510
Ws[ 4 ] := 2 * Random - 1;
514
_1 := SumChebyshev1( 0/4, Ws );
515
_2 := SumChebyshev1( 1/4, Ws );
516
_3 := SumChebyshev1( 2/4, Ws );
517
_4 := SumChebyshev1( 3/4, Ws );
518
_5 := SumChebyshev1( 4/4, Ws );
521
Ks_ := FitPoly( Ps / Roo2(5) );
524
procedure RandPoly( out Ks_:TDouble5D );
526
Ws :array [ 0..4 ] of Double;
529
Ws[ 0 ] := 2 * Random - 1;
530
Ws[ 1 ] := 2 * Random - 1;
531
Ws[ 2 ] := 2 * Random - 1;
532
Ws[ 3 ] := 2 * Random - 1;
533
Ws[ 4 ] := 2 * Random - 1;
537
_1 := SumChebyshev1( 0/4, Ws );
538
_2 := SumChebyshev1( 1/4, Ws );
539
_3 := SumChebyshev1( 2/4, Ws );
540
_4 := SumChebyshev1( 3/4, Ws );
541
_5 := SumChebyshev1( 4/4, Ws );
544
Ks_ := FitPoly( Ps / Roo2(5) );
547
//############################################################################## □
549
initialization //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ 初期化
551
finalization //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ 最終化
553
end. //######################################################################### ■