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

📄 utests.cpp

📁 C++ Math Lib. C++ Builder must use.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//---------------------------------------------------------------------------
// N.V.Shokhirev
// created: 20040726
// modified: 20050809
//---------------------------------------------------------------------------
#pragma hdrstop

#include "uTests.h"
#include "DynLinAlg.h"
#include "MatUtils.h"
#include "complex.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)

double GetValue(FArr1D& v, int i)
{
  return v(i);
};

void SetValue(FArr1D& v, int i, double x)
{
  v(i) = x;
};

container::container(int n):v(n),m(n,n) { };

AnsiString MachepsTest()
{
  AnsiString ss = ">Macheps = ";
  real eps1, meps, eps = 1.0;
//  while ((1.0+eps)> 1.0){ meps = eps; eps /= 2.0; };
  do {meps = eps; eps /= 2.0; eps1 = eps + 1.0;} while (eps1 > 1.0);
  AnsiString s = meps;
  ss += s;

  eps = 1.0;
  do {meps = eps; eps /= 2.0;} while (eps > 0.0);
  s = meps;
  ss += "\n>MinDoube = ";
  ss += s;

  eps = 1.0;
  meps = 2097152.0;
  do {meps /= 2.0; eps /= 2.0;} while (eps > 0.0);
  s = meps;
  ss += "\n>SafeMinDoube = ";  // 1048576*MinDoube
  ss += s;
  return ss;
};

AnsiString Lim1DTest()
{
  AnsiString s = "", ss = "Lim1D Test";
  bool fail = false;

  Lim1D lim1;
  if (lim1.D1() != 1 || lim1.L1() != 1 || lim1.H1() != 1 ) {
    fail = true;   s += " Default Constr  |";
  };
  lim1.SetL1(0);
  if (lim1.D1() != 1 || lim1.L1() != 0 || lim1.H1() != 0 ) {
    fail = true;   s += " SetL1(0)  |";
  };
  Lim1D lim2(5);
  if (lim2.D1() != 5 || lim2.L1() != 1 || lim2.H1() != 5 ) {
    fail = true;   s += " 1-based Constr  |";
  };
  Lim1D lim3(-2,2);
  if (lim3.D1() != 5 || lim3.L1() != -2 || lim3.H1() != 2 ) {
    fail = true;   s += " General Constr  |";
  };
  if (lim3.eq(lim2) ) { fail = true;   s += " eq must fail  |";  };

  lim2.SetL1(-2);
  if (!lim3.eq(lim2) ) { fail = true;   s += " eq must not fail  |"; };

  if (fail) ss += " FAIL:" + s;
  else ss += " - OK";
  return ss;
};

AnsiString Lim2DTest()
{
  AnsiString s = "", ss = "Lim2D Test";
  bool fail = false;

  Lim2D lim1;
  if (lim1.D1() != 1 || lim1.L1() != 1 || lim1.H1() != 1 ||
      lim1.D2() != 1 || lim1.L2() != 1 || lim1.H2() != 1) {
    fail = true;   s += " Default Constr  |";
  };
  Lim2D lim2(3,4);
  if (lim2.D1() != 3 || lim2.L1() != 1 || lim2.H1() != 3 ||
      lim2.D2() != 4 || lim2.L2() != 1 || lim2.H2() != 4 ) {
    fail = true;   s += " 1-based Constr  |";
  };
  Lim2D lim3(-1,1,0,3);
  if (lim3.D1() != 3 || lim3.L1() != -1 || lim3.H1() != 1 ||
      lim3.D2() != 4 || lim3.L2() !=  0 || lim3.H2() != 3) {
    fail = true;   s += " General Constr  |";
  };
  lim2.SetL1(-1);
  lim2.SetL2(0);
  if (lim2.D1() != 3 || lim2.L1() != -1 || lim2.H1() != 1 ||
      lim2.D2() != 4 || lim2.L2() !=  0 || lim2.H2() != 3) {
    fail = true;   s += " SetL1(-1), SetL2(0) |";
  };

  if (fail) ss += " FAIL:" + s;
  else ss += " - OK";
  return ss;
};

AnsiString FArr1DTest()
{
  AnsiString s = "", ss = "FArr1D Test";
  bool fail = false;
  double x1, x2;
  int n = 5;

  FArr1D a1(n);
  FArr1D a2(n);
  FArr1D arr1(n);
  FArr1D arr2(n);

  RandArr(arr1,-1.0,1.0);
  RandArr(arr2,-1.0,1.0);

  x1 = arr1 * arr2;
  x2 = Dot(arr1, arr2);
  if ( ! Equal(x1, x2) ) { fail = true;   s += " Dot product |"; };

  arr1(2) = 4.44;
  arr2 = arr1;
  if ( ! Equal(arr1, arr2) ) { fail = true;   s += " Assignment |"; };

  arr1.swap1(2,4);
  double temp = arr2(2);
  arr2(2) = arr2(4);
  arr2(4) = temp;
  if ( ! Equal(arr1, arr2) ) { fail = true;   s += " Swap |"; };

  a1.fill(0.0);
  a2 = arr2 - arr1;
  if ( ! Equal(a1, a2) ) { fail = true;   s += " Subtraction |"; };

  MultArr(arr2, 1.2345);
  a1 = 1.2345*arr1;
  if (! Equal(a1, arr2) ) { fail = true;  s += " Const * FArr1D |"; };
  a1 = arr1*1.2345;
  if (! Equal(a1, arr2) ) { fail = true;  s += " FArr1D * Const |"; };

  a1 = arr1 + arr2;
  a2 = 2.2345 * arr1;
  if ( ! Equal(a1, a2) ) { fail = true;   s += " Addition |"; };

  if (fail) ss += " FAIL:" + s;
  else ss += " - OK";
  return ss;
};

AnsiString FArr1DTest2()
{
  AnsiString s = "", ss = "FArr1D Test2";
  bool fail = false;
  double x1, x2;
  int idx;
  FArr1D a(-4 , 3);
  x1 = -4.0;
  for (int i = a.L1(); i <= a.H1(); i++)
  {
    a(i) = x1;
    x1 += 1.0;
  };

  x1 = a.minval(idx);
  if ( ! Equal(x1, -4.0) ) { fail = true;   s += " minval |"; };
  if ( idx != -4 ) { fail = true;   s += " minval ixd |"; };

  x1 = a.maxval(idx);
  if ( ! Equal(x1, 3.0) ) { fail = true;   s += " maxval |"; };
  if ( idx != 3 ) { fail = true;   s += " maxval ixd |"; };

  x1 = a.maxabs(idx);
  if ( ! Equal(x1, 4.0) ) { fail = true;   s += " maxabs |"; };
  if ( idx != -4 ) { fail = true;   s += " maxabs ixd |"; };

  a.minmax(x1, x2, true);
  if ( ! Equal(x1,-4.0) ) { fail = true;   s += " minmax min |"; };
  if ( ! Equal(x2, 3.0) ) { fail = true;   s += " minmax max |"; };

  if (fail) ss += " FAIL:" + s;
  else ss += " - OK";
  return ss;
};

AnsiString FArr1DTest3()
{
  AnsiString s = "", ss = "FArr1D Test3";
  bool fail = false;
  bool cyclic = true;
  double x1, x2;
  int i, L, H, D, j;
  FArr1D a(-4 , 3);

  RandArr(a,-10.0,10.0);

  for (int i = a.L1(); i <= a.H1(); i++)
  {
    x1 = extend(a, i, cyclic);
    j = cycle(i, a.L1(), a.H1(), a.D1());
    x2 = a(j);
    if ( ! Equal(x1, x2) ) { fail = true;   s += " cyclic |"; };
  };

  cyclic = false;
  for (int i = -5; i <= 5; i++)
  {
    x1 = extend(a, i, cyclic);
    if ( (i < a.L1()) || (a.H1() < i) )
      x2 = 0.0;
    else
      x2 = a(i);
    if ( ! Equal(x1, x2) ) { fail = true;   s += " zero |"; };
  };

  x1 = extend0(a, -4, cyclic);  x2 = a(-4);
  if ( ! Equal(x1, x2) ) { fail = true;   s += " zero0-1 |"; };
  x1 = extend0(a,  3, cyclic);  x2 = a(3);
  if ( ! Equal(x1, x2) ) { fail = true;   s += " zero0-2 |"; };
  x1 = extend0(a,  0, cyclic);  x2 = a(0);
  if ( ! Equal(x1, x2) ) { fail = true;   s += " zero0-3 |"; };
  x1 = extend0(a, -6, cyclic);  x2 = 0.0;
  if ( ! Equal(x1, x2) ) { fail = true;   s += " zero0-4 |"; };
  x1 = extend0(a,  4, cyclic);  x2 = 0.0;
  if ( ! Equal(x1, x2) ) { fail = true;   s += " zero0-5 |"; };

  cyclic = true;

  x1 = extend0(a, -4, cyclic);  x2 = a(3);
  if ( ! Equal(x1, x2) ) { fail = true;   s += " cyclic0-1 |"; };
  x1 = extend0(a,  3, cyclic);  x2 = a(3);
  if ( ! Equal(x1, x2) ) { fail = true;   s += " cyclic0-2 |"; };
  x1 = extend0(a,  0, cyclic);  x2 = a(0);
  if ( ! Equal(x1, x2) ) { fail = true;   s += " cyclic0-3 |"; };
  x1 = extend0(a, -5, cyclic);  x2 = a(2);
  if ( ! Equal(x1, x2) ) { fail = true;   s += " cyclic0-4 |"; };
  x1 = extend0(a,  4, cyclic);  x2 = a(-3);
  if ( ! Equal(x1, x2) ) { fail = true;   s += " cyclic0-5 |"; };
  x1 = extend0(a, -3, cyclic);  x2 = a(-3);
  if ( ! Equal(x1, x2) ) { fail = true;   s += " cyclic0-6 |"; };

  if (fail) ss += " FAIL:" + s;
  else ss += " - OK";
  return ss;
};

AnsiString FArr2DTest()
{
  AnsiString s = "", ss = "FArr2D Test";
  bool fail = false;
  double x1, x2;
  int n = 3, m = 4;

  FArr2D a1(n,m);
  FArr2D a2(n,m);
  FArr2D arr1(n,m);
  FArr2D arr2(n,m);

  RandArr(arr1,-1.0,1.0);
  RandArr(arr2,-1.0,1.0);

  arr2 = arr1;
  if ( ! Equal(arr1, arr2) ) { fail = true;   s += " Assignment |"; };

  a1.fill(0.0);
  a2 = arr2 - arr1;
  if ( ! Equal(a1, a2) ) { fail = true;   s += " Subtraction |"; };

  MultArr(arr2, 1.2345);
  a1 = 1.2345*arr1;
  a2 = arr2 - a1;
  if (! Equal(a1, arr2) ) { fail = true;  s += " Const * FArr2D |"; };
  a1 = arr1*1.2345;
  if (! Equal(a1, arr2) ) { fail = true;  s += " FArr2D * Const |"; };

  a1 = arr1 + arr2;
  a2 = 2.2345 * arr1;
  if ( ! Equal(a1, a2) ) { fail = true;   s += " Addition |"; };


  if (fail) ss += " FAIL:" + s;
  else ss += " - OK";
  return ss;
};

AnsiString FArr2DTestSwap()
{
  AnsiString s = "", ss = "FArr2D Test Swap";
  bool fail = false;
  double t;
  int n = 5, m = 6;

  FArr2D a1(n,m);
  FArr2D a2(n,m);

  RandArr(a1,-1.0,1.0);

  a2 = a1;

  a1.swap1(2,4);
  for (int k = a2.L2(); k<= a2.H2(); k++)
  {
    t = a2(2,k);
    a2(2,k) = a2(4,k);
    a2(4,k) =t;
  };
  if ( ! Equal(a1, a2) ) { fail = true;   s += " swap1 |"; };

  a1.swap2(2,4);
  for (int k = a2.L1(); k<= a2.H1(); k++)
  {
    t = a2(k,2);
    a2(k,2) = a2(k,4);
    a2(k,4) =t;
  };
  if ( ! Equal(a1, a2) ) { fail = true;   s += " swap2 |"; };

  if (fail) ss += " FAIL:" + s;
  else ss += " - OK";
  return ss;
};

AnsiString FArr1D2DTest()
{
  AnsiString s = "", ss = "FArr1D2D Test";
  bool fail = false;
  int i1, i2, n = 3, m = 4;

  FArr2D a1(n,m);
  FArr1D v1(m);
  FArr1D v2(n);
  FArr1D u2(n);

  RandArr(a1,-1.0,1.0);
  RandArr(v1,-1.0,1.0);
  u2 = a1 * v1;
  v2 = MxV(a1, v1);
  if (! Equal(u2, v2) ) { fail = true;  s += " FArr2D * FArr1D |"; };

  FArr2D a2(m,n);
  FArr2D b1(n,n);
  FArr2D b2(n,n);

⌨️ 快捷键说明

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