예제 #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
        private void grad(IElementalAccessMatrix dy, IElementalAccessVector x)
        {
            IElementalAccessVector y0 = new DenseVector(x.Length);
            IElementalAccessVector y  = new DenseVector(x.Length);

            model(y0, x);
            for (int i = 0; i < x.Length; i++)
            {
                x.AddValue(i, 0.000001);
                model(y, x);
                for (int j = 0; j < x.Length; j++)
                {
                    dy.SetValue(j, i, (y.GetValue(j) - y0.GetValue(j)) / 0.000001);
                }
                x.AddValue(i, -0.000001);
            }
        }