Пример #1
0
        public void mprove(VecDoub b, VecDoub x)
        {
            int     i, j;
            VecDoub r = new VecDoub(n);

            for (i = 0; i < n; i++)
            {
                double sdp = -b[i];
                for (j = 0; j < n; j++)
                {
                    sdp += (double)aref[i][j] * (double)x[j];
                }
                r[i] = sdp;
            }
            solve(r, r);
            for (i = 0; i < n; i++)
            {
                x[i] -= r[i];
            }
        }
Пример #2
0
        public void solve(VecDoub b, VecDoub x)
        {
            int    i, ii = 0, ip, j;
            double sum;

            if (b.size() != n || x.size() != n)
            {
                throw new Exception("LUdcmp::solve bad sizes");
            }
            for (i = 0; i < n; i++)
            {
                x[i] = b[i];
            }
            for (i = 0; i < n; i++)
            {
                ip    = indx[i];
                sum   = x[ip];
                x[ip] = x[i];
                if (ii != 0)
                {
                    for (j = ii - 1; j < i; j++)
                    {
                        sum -= lu[i][j] * x[j];
                    }
                }
                else if (sum != 0.0)
                {
                    ii = i + 1;
                }
                x[i] = sum;
            }
            for (i = n - 1; i >= 0; i--)
            {
                sum = x[i];
                for (j = i + 1; j < n; j++)
                {
                    sum -= lu[i][j] * x[j];
                }
                x[i] = sum / lu[i][i];
            }
        }
Пример #3
0
        public void solve(MatDoub b, MatDoub x)
        {
            int i, j, m = b.ncols();

            if (b.nrows() != n || x.nrows() != n || b.ncols() != x.ncols())
            {
                throw new Exception("LUdcmp::solve bad sizes");
            }
            VecDoub xx = new VecDoub(n);

            for (j = 0; j < m; j++)
            {
                for (i = 0; i < n; i++)
                {
                    xx[i] = b[i][j];
                }
                solve(xx, xx);
                for (i = 0; i < n; i++)
                {
                    x[i][j] = xx[i];
                }
            }
        }
Пример #4
0
 public static void SWAP(VecDoub aVec, int a, VecDoub bVec, int b)
 {
     double dum = aVec[a]; aVec[a] = bVec[b]; bVec[b] = dum;
 }
Пример #5
0
        public LUdcmp(MatDoub a)
        {
            n    = (a.nrows());
            lu   = (a);
            aref = (a);
            indx = new VecInt(n);
            const double TINY = 1.0e-40;
            int          i, imax = int.MinValue, j, k;
            double       big, temp;
            VecDoub      vv = new VecDoub(n);

            d = 1.0;

            for (i = 0; i < n; i++)
            {
                big = 0.0;
                for (j = 0; j < n; j++)
                {
                    if ((temp = Math.Abs(lu[i][j])) > big)
                    {
                        big = temp;
                    }
                }
                if (big == 0.0)
                {
                    throw new Exception("Singular matrix in LUdcmp");
                }
                vv[i] = 1.0 / big;
            }
            for (k = 0; k < n; k++)
            {
                big = 0.0;
                for (i = k; i < n; i++)
                {
                    temp = vv[i] * Math.Abs(lu[i][k]);
                    if (temp > big)
                    {
                        big  = temp;
                        imax = i;
                    }
                }
                if (k != imax)
                {
                    for (j = 0; j < n; j++)
                    {
                        temp        = lu[imax][j];
                        lu[imax][j] = lu[k][j];
                        lu[k][j]    = temp;
                    }
                    d        = -d;
                    vv[imax] = vv[k];
                }
                indx[k] = imax;
                if (lu[k][k] == 0.0)
                {
                    lu[k][k] = TINY;
                }
                for (i = k + 1; i < n; i++)
                {
                    temp = lu[i][k] /= lu[k][k];
                    for (j = k + 1; j < n; j++)
                    {
                        lu[i][j] -= temp * lu[k][j];
                    }
                }
            }
        }