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