
Hello all,
Following advice on other threads, I am using iterative methods in order to solve a sparse system of equations. The matrix is 40000X40000. If I set the iteration limit to 10000 then I am able to get a solution value, however the resulting residual is highly
off from 0. When I increase the iteration limit to 15000 or more, I get "Iterative solver experience numerical break down" error, and process is terminated. I was wondering if this is a common issue and if there is something  an earlier check I
can do to prevent this.
I have already tried with other solvers : TFQMR, GpBiCg ,MlkBiCgStab I get the same error..
Also I expremented with solver Preconditioners. In that case I get NaN's as solution, regardless of iteration no.
/// Given SparseMatrix A, and DenseVector rhs:
MathNet.Numerics.Control.DisableParallelization = true;
BiCgStab solver = new BiCgStab();
// Choose stop criterias
var stopCriterias = new List<IIterationStopCriterium>()
{
new ResidualStopCriterium(1e8),
new IterationCountStopCriterium(15000),
new DivergenceStopCriterium(),
new FailureStopCriterium()
};
solver.SetIterator(new Iterator(stopCriterias));
var solution = solver.Solve(A, rhs);
bool success = false;
foreach (var item in stopCriterias)
{
if (item.StopLevel == StopLevel.Convergence)
{
success = true;
break;
}
}
var residual = A* solution  rhs;
Thanks in advance,
Ahmet



Can you save the matrix + rhs and upload a zipped version?
Use the MathNet.Numerics.LinearAlgebra.Double.IO namespace or the following code (assuming it's a real valued matrix)
public void Save(SparseMatrix matrix, string filename)
{
var nfi = CultureInfo.InvariantCulture.NumberFormat;
int i, j, k, n = matrix.NonZerosCount;
double value;
var storage = matrix.IndexedEnumerator();
using (var writer = new StreamWriter(filename))
{
// Write header 1 (format)
writer.WriteLine("%%MatrixMarket matrix coordinate real general");
// Write header 2 (size)
writer.WriteLine("{0} {1} {2}", matrix.RowCount, matrix.ColumnCount, n);
string iformat = "{0," + (matrix.RowCount.ToString().Length + 1) + "}";
string dformat = "e10";
string sformat = "{0,20}";
// Write entries
foreach (var entry in storage)
{
i = entry.Item1;
j = entry.Item2;
value = entry.Item3;
writer.Write(iformat, i);
writer.Write(iformat, j);
writer.Write(sformat, value.ToString(dformat, nfi));
writer.WriteLine();
}
}
}

