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; } }
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); } }