public void Compute_Success()
        {
            //Arrange
            //Устанавливаем сетку 3x3 с единичными начальными и граничными условиями
            //1 0 1
            //1 0 1
            //1 1 1
            var net = new MathNet2(2, 2, 1, 1);

            //Начальные и граничные условия условия
            for (var i = 0; i <= net.Width; i++)
            {
                net.Set(i, 0, 1);
                net.Set(0, i, 1);
                net.Set(net.Width, i, 1);
            }

            double Func(double x, double t) => x + t * 10;

            var method = new ExplicitMethod(Func);

            //Act
            method.Compute(net);

            //Assert
            Assert.Equal(2, net.Get(1, 1));
            Assert.Equal(11, net.Get(1, 2));
        }
 public void Compute(MathNet2 net)
 {
     //Вычисляем по слоям по времени
     for (var j = 0; j < net.Height; j++)
     {
         var approximation    = net.GetRow(j);
         var newtonIsComplete = false;
         while (!newtonIsComplete)
         {
             //Получаем новое преближение с помощью метода ньютона
             var nextAproximation = GetNextApproximation(net, approximation, j);
             //Вычисление ошибки
             var error = nextAproximation
                         .Zip(approximation, (e1, e2) => Math.Abs(e1 - e2))
                         .Max();
             newtonIsComplete = error < NewtonEpsilon;
             approximation    = nextAproximation;
         }
         //Подставляем преближение в сетку с результатом
         for (var i = 1; i < net.Width; i++)
         {
             net.Set(i, j + 1, approximation[i]);
         }
     }
 }
예제 #3
0
 public override void Compute(MathNet2 net)
 {
     for (var j = 1; j <= net.Height; j++)
     {
         var tdmaResult = ComputeTriagonalMatrix(net, j);
         for (var i = 1; i < net.Width; i++)
         {
             net.Set(i, j, tdmaResult[i]);
         }
     }
 }
        public override void Compute(MathNet2 net)
        {
            for (var j = 1; j <= net.Height; j++)
            {
                for (var i = 1; i < net.Width; i++)
                {
                    var x     = net.H * i;
                    var t     = net.D * (j - 1);
                    var value = net.Get(i, j - 1) + net.D *
                                ((net.Get(i + 1, j - 1) - 2 * net.Get(i, j - 1) + net.Get(i - 1, j - 1))
                                 / (net.H * net.H) + Function(x, t));

                    net.Set(i, j, value);
                }
            }
        }