コード例 #1
0
ファイル: Mmpa.cs プロジェクト: Nurzat-89/NuclearReaction
        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);
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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);
        }