⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 testhermiteunit.pas

📁 maths lib with source
💻 PAS
字号:
unit testhermiteunit;
interface
uses Math, Ap, Sysutils, hermite;

function TestHermiteCalculate(Silent : Boolean):Boolean;
function testhermiteunit_test_silent():Boolean;
function testhermiteunit_test():Boolean;

implementation

function TestHermiteCalculate(Silent : Boolean):Boolean;
var
    Err : Double;
    SumErr : Double;
    CErr : Double;
    Threshold : Double;
    N : Integer;
    MaxN : Integer;
    I : Integer;
    J : Integer;
    Pass : Integer;
    C : TReal1DArray;
    X : Double;
    V : Double;
    WasErrors : Boolean;
begin
    Err := 0;
    SumErr := 0;
    CErr := 0;
    Threshold := 1.0E-9;
    WasErrors := False;
    
    //
    // Testing Hermite polynomials
    //
    N := 0;
    Err := Max(Err, AbsReal(HermiteCalculate(N, 1)-1));
    N := 1;
    Err := Max(Err, AbsReal(HermiteCalculate(N, 1)-2));
    N := 2;
    Err := Max(Err, AbsReal(HermiteCalculate(N, 1)-2));
    N := 3;
    Err := Max(Err, AbsReal(HermiteCalculate(N, 1)+4));
    N := 4;
    Err := Max(Err, AbsReal(HermiteCalculate(N, 1)+20));
    N := 5;
    Err := Max(Err, AbsReal(HermiteCalculate(N, 1)+8));
    N := 6;
    Err := Max(Err, AbsReal(HermiteCalculate(N, 1)-184));
    N := 7;
    Err := Max(Err, AbsReal(HermiteCalculate(N, 1)-464));
    N := 11;
    Err := Max(Err, AbsReal(HermiteCalculate(N, 1)-230848));
    N := 12;
    Err := Max(Err, AbsReal(HermiteCalculate(N, 1)-280768));
    
    //
    // Testing Clenshaw summation
    //
    MaxN := 10;
    SetLength(C, MaxN+1);
    Pass:=1;
    while Pass<=10 do
    begin
        X := 2*RandomReal-1;
        V := 0;
        N:=0;
        while N<=MaxN do
        begin
            C[N] := 2*RandomReal-1;
            V := V+HermiteCalculate(N, X)*C[N];
            SumErr := Max(SumErr, AbsReal(V-HermiteSum(C, N, X)));
            Inc(N);
        end;
        Inc(Pass);
    end;
    
    //
    // Testing coefficients
    //
    HermiteCoefficients(0, C);
    CErr := Max(CErr, AbsReal(C[0]-1));
    HermiteCoefficients(1, C);
    CErr := Max(CErr, AbsReal(C[0]-0));
    CErr := Max(CErr, AbsReal(C[1]-2));
    HermiteCoefficients(2, C);
    CErr := Max(CErr, AbsReal(C[0]+2));
    CErr := Max(CErr, AbsReal(C[1]-0));
    CErr := Max(CErr, AbsReal(C[2]-4));
    HermiteCoefficients(3, C);
    CErr := Max(CErr, AbsReal(C[0]-0));
    CErr := Max(CErr, AbsReal(C[1]+12));
    CErr := Max(CErr, AbsReal(C[2]-0));
    CErr := Max(CErr, AbsReal(C[3]-8));
    HermiteCoefficients(4, C);
    CErr := Max(CErr, AbsReal(C[0]-12));
    CErr := Max(CErr, AbsReal(C[1]-0));
    CErr := Max(CErr, AbsReal(C[2]+48));
    CErr := Max(CErr, AbsReal(C[3]-0));
    CErr := Max(CErr, AbsReal(C[4]-16));
    HermiteCoefficients(5, C);
    CErr := Max(CErr, AbsReal(C[0]-0));
    CErr := Max(CErr, AbsReal(C[1]-120));
    CErr := Max(CErr, AbsReal(C[2]-0));
    CErr := Max(CErr, AbsReal(C[3]+160));
    CErr := Max(CErr, AbsReal(C[4]-0));
    CErr := Max(CErr, AbsReal(C[5]-32));
    HermiteCoefficients(6, C);
    CErr := Max(CErr, AbsReal(C[0]+120));
    CErr := Max(CErr, AbsReal(C[1]-0));
    CErr := Max(CErr, AbsReal(C[2]-720));
    CErr := Max(CErr, AbsReal(C[3]-0));
    CErr := Max(CErr, AbsReal(C[4]+480));
    CErr := Max(CErr, AbsReal(C[5]-0));
    CErr := Max(CErr, AbsReal(C[6]-64));
    
    //
    // Reporting
    //
    WasErrors := (Err>Threshold) or (SumErr>Threshold) or (CErr>Threshold);
    if  not Silent then
    begin
        Write(Format('TESTING CALCULATION OF THE HERMITE POLYNOMIALS'#13#10'',[]));
        Write(Format('Max error                                 %5.3e'#13#10'',[
            Err]));
        Write(Format('Summation error                           %5.3e'#13#10'',[
            SumErr]));
        Write(Format('Coefficients error                        %5.3e'#13#10'',[
            CErr]));
        Write(Format('Threshold                                 %5.3e'#13#10'',[
            Threshold]));
        if  not WasErrors then
        begin
            Write(Format('TEST PASSED'#13#10'',[]));
        end
        else
        begin
            Write(Format('TEST FAILED'#13#10'',[]));
        end;
    end;
    Result :=  not WasErrors;
end;


(*************************************************************************
Silent unit test
*************************************************************************)
function testhermiteunit_test_silent():Boolean;
begin
    Result := TestHermiteCalculate(True);
end;


(*************************************************************************
Unit test
*************************************************************************)
function testhermiteunit_test():Boolean;
begin
    Result := TestHermiteCalculate(False);
end;


end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -