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 double[] GetNextApproximation(MathNet2 net, double[] approximation, int j)
        {
            //Коэфиценты для построения матрицы
            double a, b;

            a = b = -net.D / (2 * net.H * net.H);
            var t = net.D * j;

            //Подготавливаем трехдиагональную матрицу c правыми частями
            var n      = net.Width - 1;
            var matrix = new double[n, n];
            var values = new double[n];


            for (var i = 0; i < n; i++)
            {
                //Заполняем матрицу
                if (i > 0)
                {
                    matrix[i - 1, i] = a;
                }
                matrix[i, i] = _differenceFunctionDerivative(approximation[i]) + net.D / (net.H * net.H);
                if (i < n - 1)
                {
                    matrix[i + 1, i] = b;
                }

                //Заполняем правую часть
                var x = i * net.H;
                values[i] = -(_differenceFunction(approximation[i])
                              - _differenceFunction(net.Get(i, j))
                              - _differenceFunctionDerivative(approximation[i]) * approximation[i]
                              - net.D * _heterogeniousFunction(x, t))
                            + net.D / (2 * net.H * net.H) * (approximation[i + 2] - 2 * approximation[i + 1] + approximation[i]);
            }

            //Коректируем с помощью граничных условий
            values[0]     -= net.Get(0, j);
            values[n - 1] -= net.Get(net.Width, j);
            var tdma = AlgoritmContext.Current.TridiagonalMatrixAlgoritm(matrix, values);
            //Заполняем граничные условия
            var result = new double[net.Width + 1];

            result[0] = net.Get(0, j);
            for (var i = 1; i < tdma.Length; i++)
            {
                result[i] = tdma[i];
            }
            result[net.Width] = net.Get(net.Width, j);
            return(result);
        }
        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);
                }
            }
        }
예제 #4
0
        public double[] ComputeTriagonalMatrix(MathNet2 net, int j)
        {
            //Коэфиценты для построения матрицы
            double a, b, c;

            a = b = net.D;
            c = -(net.H * net.H + 2 * net.D);
            var t = net.D * (j - 1);

            //Подготавливаем трехдиагональную матрицу c правыми частями
            var n      = net.Width - 1;
            var matrix = new double[n, n];
            var values = new double[n];

            for (var i = 0; i < n; i++)
            {
                //Заполняем матрицу
                if (i > 0)
                {
                    matrix[i - 1, i] = a;
                }
                matrix[i, i] = c;
                if (i < n - 1)
                {
                    matrix[i + 1, i] = b;
                }

                //Заполняем правую часть
                var x = (i + 1) * net.H;
                values[i] = -((Function(x, t) * net.D + net.Get(i + 1, j - 1)) * net.H * net.H);
            }

            //Коректируем с помощью граничных условий
            values[0]     -= net.Get(0, j) * a;
            values[n - 1] -= net.Get(net.Width, j) * a;
            var tdma = AlgoritmContext.Current.TridiagonalMatrixAlgoritm(matrix, values);
            //Заполняем граничные условия
            var result = new double[net.Width + 1];

            result[0] = net.Get(0, j);
            for (var i = 0; i < tdma.Length; i++)
            {
                result[i + 1] = tdma[i];
            }
            result[net.Width] = net.Get(net.Width, j);
            return(result);
        }