示例#1
0
        public void solveModel()
        {
            int n = 5;
            IElementalAccessMatrix A = new SparseRowMatrix(n, n, 5);
            IElementalAccessVector b = new DenseVector(n), x = new DenseVector(n);

            x.SetValue(0, 0.1);
            x.SetValue(1, 0.2);
            x.SetValue(2, 0.3);
            x.SetValue(3, 0.4);
            x.SetValue(4, 0.5);
            b = new DenseVector(x.Length);

            for (int it = 0; it < 100; it++)
            {
                model(b, x);
                grad(A, x);
                IElementalAccessVector dx     = new DenseVector(n);
                ILinearSolver          solver = new BiCGSolver();
                IPreconditioner        M      = new IdentityPreconditioner();
                DefaultLinearIteration iter   = new DefaultLinearIteration();
                iter.SetParameters(1e-10, 1e-50, 1e+5, 1000000);
                double[] ans = solve(A, b, dx, solver, M, iter);
                for (int i = 0; i < x.Length; i++)
                {
                    x.AddValue(i, -0.2 * dx.GetValue(i));
                }
                int iii = 1;
            }
        }
示例#2
0
            public static DenseVector getSolution(
                SparseMatrix matrixA,
                DenseVector vectorB,
                double omega,
                double epsilon
                )
            {
                DenseVector xc = new DenseVector();
                DenseVector xp;

                for (double i = 0; i < vectorB.Count; i++)
                {
                    xc.AddValue(i);
                }

                int    k      = 0;
                double deltaX = 0;

                do
                {
                    xp     = xc;
                    xc     = calculateNextVector(xp, matrixA, vectorB, omega);
                    deltaX = calculNorma(xc, xp);
                    k++;
                } while (deltaX >= epsilon && k <= 10000 && deltaX < Math.Pow(10, 8));

                if (deltaX < epsilon)
                {
                    return(xc);
                }
                else
                {
                    return(null);
                }
            }
示例#3
0
            public static DenseVector calculateNextVector(DenseVector oldVector, SparseMatrix matrixA, DenseVector vectorB, double omega)
            {
                DenseVector newVector = new DenseVector();
                int         n         = matrixA.Elements.Count;
                int         i         = 0;

                while (i != n)
                {
                    double sum1   = 0;
                    double sum2   = 0;
                    var    aii    = matrixA.Elements[i].FirstOrDefault(e => e.Column == i);
                    double oldXki = oldVector.Values[i];
                    double bi     = vectorB.Values[i];

                    matrixA.Elements[i].ForEach(melem =>
                    {
                        if (melem.Column < i)
                        {
                            sum1 += newVector.Values[melem.Column] * melem.Value;
                        }
                        else
                        {
                            sum2 += oldVector.Values[melem.Column] * melem.Value;
                        }
                    });
                    newVector.AddValue(oldXki + omega / aii.Value * (bi - sum1 - sum2));
                    i++;
                }
                return(newVector);
            }
示例#4
0
            public static DenseVector scalarMultiplication(SparseMatrix matrix, DenseVector vector)
            {
                DenseVector resultVector = new DenseVector();

                for (int i = 0; i < vector.Count; i++)
                {
                    var celula = 0D;
                    foreach (var element in matrix.Elements[i])
                    {
                        celula += vector.Values[element.Column] * element.Value;
                    }
                    if (celula != 0)
                    {
                        resultVector.AddValue(celula);
                    }
                }
                return(resultVector);
            }