Beispiel #1
0
        public void Solve(int maxIterations, double tolerance)
        {
            int iLagr = x.Length;

            iterations = 0;
            //matrixCalculator.Projectr(r, w);
            //matrixCalculator.Precondition(w, z);
            //matrixCalculator.Projectz(z, y);
            if (r.Norm > 1e-25)
            {
                matrixCalculator.Precondition(r, z);

                errors.Clear();
                for (currentIteration = 0; currentIteration < maxIterations; currentIteration++)
                {
                    search.CalculateSearchVector(this);
                    matrixCalculator.MultiplyWithMatrix(p, q);
                    double a    = search.CalculateGradient(this);
                    double detz = 0;
                    //Parallel.For(0, iLagr, i =>
                    for (int i = 0; i < iLagr; i++)
                    {
                        r[i] -= a * q[i];
                        x[i] += a * p[i];
                        detz += r[i] * r[i];
                    }
                    ;
                    errors.Add(Math.Sqrt(detz) / detf);
                    if (errors[currentIteration] < tolerance)
                    {
                        break;
                    }

                    //matrixCalculator.Projectr(r, w);
                    //matrixCalculator.Precondition(w, z);
                    //matrixCalculator.Projectz(z, y);
                    matrixCalculator.Precondition(r, z);
                }
                iterations = currentIteration;
            }

            //StreamWriter sw = File.CreateText(@"iterationsPCG.txt");
            //for (int i = 0; i < errors.Count; i++)
            //    sw.WriteLine(errors[i].ToString());
            //sw.Close();

            StreamWriter sw = File.AppendText(String.Format(@"iterationsPCG-{0}.txt", Process.GetCurrentProcess().Id));

            sw.WriteLine(iterations.ToString());
            sw.Close();
        }
Beispiel #2
0
 public void Precondition(IVector <double> vIn, IVector <double> vOut)
 {
     matrixCalculator.Precondition(vIn, vOut);
     //for (int i = 0; i < vIn.Length; i++) vOut[i] = diagonalPreconditioner[i] * vIn[i];
 }