97 lines
2.8 KiB
MQL5
97 lines
2.8 KiB
MQL5
|
//+------------------------------------------------------------------+
|
||
|
//| EnvError.mq5 |
|
||
|
//| Copyright 2021, MetaQuotes Ltd. |
|
||
|
//| https://www.mql5.com |
|
||
|
//+------------------------------------------------------------------+
|
||
|
#include "Matrix.mqh"
|
||
|
|
||
|
//+------------------------------------------------------------------+
|
||
|
//| Script program start function |
|
||
|
//+------------------------------------------------------------------+
|
||
|
void OnStart()
|
||
|
{
|
||
|
// make sure matrix inversion works without errors
|
||
|
Print("Test matrix inversion (should pass)");
|
||
|
double a[9] =
|
||
|
{
|
||
|
1, 2, 3,
|
||
|
4, 5, 6,
|
||
|
7, 8, 0,
|
||
|
};
|
||
|
|
||
|
ResetLastError();
|
||
|
MatrixSquare mA(a); // assign data to source matrix
|
||
|
Print("Input");
|
||
|
mA.print();
|
||
|
MatrixSquare mAinv(3);
|
||
|
mAinv = !mA; // invert it and store in new matrix
|
||
|
Print("Result");
|
||
|
mAinv.print();
|
||
|
|
||
|
Print("Check inverted by multiplication");
|
||
|
MatrixSquare test(3); // check inversion via multiplication
|
||
|
test = mA * mAinv;
|
||
|
test.print(); // get identity matrix
|
||
|
|
||
|
Print(EnumToString(Matrix::lastError())); // ok
|
||
|
|
||
|
// try invert another matrix
|
||
|
Print("Test matrix inversion (should fail)");
|
||
|
double b[9] =
|
||
|
{
|
||
|
-22, -7, 17,
|
||
|
-21, 15, 9,
|
||
|
-34,-31, 33
|
||
|
};
|
||
|
|
||
|
MatrixSquare mB(b);
|
||
|
Print("Input");
|
||
|
mB.print();
|
||
|
ResetLastError();
|
||
|
Print("Result");
|
||
|
(!mB).print();
|
||
|
Print(EnumToString(Matrix::lastError())); // singular
|
||
|
|
||
|
Print("Empty matrix creation");
|
||
|
MatrixSquare m0(0);
|
||
|
Print(EnumToString(Matrix::lastError()));
|
||
|
|
||
|
Print("'Rectangular' square matrix creation");
|
||
|
MatrixSquare r12(1, 2);
|
||
|
Print(EnumToString(Matrix::lastError()));
|
||
|
}
|
||
|
//+------------------------------------------------------------------+
|
||
|
/*
|
||
|
example output
|
||
|
|
||
|
Test matrix inversion (should pass)
|
||
|
Input
|
||
|
1.00000 2.00000 3.00000
|
||
|
4.00000 5.00000 6.00000
|
||
|
7.00000 8.00000 0.00000
|
||
|
Result
|
||
|
-1.77778 0.88889 -0.11111
|
||
|
1.55556 -0.77778 0.22222
|
||
|
-0.11111 0.22222 -0.11111
|
||
|
Check inverted by multiplication
|
||
|
1.00000 +0.00000 0.00000
|
||
|
-0.00000 1.00000 +0.00000
|
||
|
0.00000 0.00000 1.00000
|
||
|
ERR_USER_MATRIX_OK
|
||
|
Test matrix inversion (should fail)
|
||
|
Input
|
||
|
-22.00000 -7.00000 17.00000
|
||
|
-21.00000 15.00000 9.00000
|
||
|
-34.00000 -31.00000 33.00000
|
||
|
Result
|
||
|
0.0 0.0 0.0
|
||
|
0.0 0.0 0.0
|
||
|
0.0 0.0 0.0
|
||
|
ERR_USER_MATRIX_SINGULAR
|
||
|
Empty matrix creation
|
||
|
ERR_USER_MATRIX_EMPTY
|
||
|
'Rectangular' square matrix creation
|
||
|
ERR_USER_MATRIX_NOT_SQUARE
|
||
|
*/
|
||
|
//+------------------------------------------------------------------+
|