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