public Matrix <double> Calculate(Matrix <double> a, Matrix <double> n) { int order = 28; Matrix <double> U = new MatrixDouble(a.Col, a.Row); Matrix <double> S = new MatrixDouble(a.Col, a.Row); U = U.Unity(); S = S.Unity(); U = U * 20.98637; var Inv = (a - U).Inverse(); var At = (a + U) * Inv; var N = n * Globals.MMPA_a28[0]; var dx = 100.0 / (order + 1.0); ExpStatusChangedEvent?.Invoke((int)(dx)); for (int i = 1; i <= order; i++) { S = At * S; N = N + S * n * Globals.MMPA_a28[i]; ExpStatusChangedEvent?.Invoke((int)((i + 1) * dx)); } N.RemoveMinuses(); return(N); }
public Matrix <double> InverseOld() { Matrix <double> X = new MatrixDouble(Col, Row); Matrix <double> E = new MatrixDouble(Col, Row); E = E.Unity(); double kf; int RANG = Row; var Temp = Clone(); for (int p = 0; p < RANG; p++) { for (int i = p + 1; i < RANG; i++) { if (Temp.Arr[p, p] == 0.0) { kf = 0; } else { kf = -Temp.Arr[i, p] / Temp.Arr[p, p]; } for (int j = 0; j < RANG; j++) { E.Arr[i, j] = E.Arr[i, j] + kf * E.Arr[p, j]; if (j >= p) { Temp.Arr[i, j] = Temp.Arr[i, j] + kf * Temp.Arr[p, j]; } } } } for (int k = 0; k < RANG; k++) { X.Arr[RANG - 1, k] = E.Arr[RANG - 1, k] / Temp.Arr[RANG - 1, RANG - 1]; for (int i = RANG - 2; i >= 0; i--) { double sum = 0.0; for (int j = i + 1; j < RANG; j++) { sum = sum + X.Arr[j, k] * Temp.Arr[i, j]; } X.Arr[i, k] = (E.Arr[i, k] - sum) / Temp.Arr[i, i]; } } return(X); }
public override Matrix <double> Pow(int p) { Matrix <double> result = new MatrixDouble(Col, Row); result = result.Unity(); if (p == 0) { } else if (p == 1) { result = Clone(); } else { result = Clone(); for (int i = 1; i < p; i++) { result = result * this; } } return(result); }