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