private static double[,] GetBoundaryMatrix(BoundaryInput input, int count) { double h = (input.b - input.a) / count; int N = count - 1; double Alpha(int i) => i == N ? -input.d2 : 1 - (input.p(i * h) * h) / 2.0; double Beta(int i) => i == 0 ? h * input.c1 - input.c2 : i == N ? h * input.d1 + input.d2 : input.q(i * h) * h * h - 2; double Gamma(int i) => i == 0 ? input.c2 : 1 + input.p(i * h) * h / 2.0; double Phi(int i) => i == 0 ? h * input.c : i == N ? h * input.d : input.f(i * h) * h * h; var outputMatrix = new double[count, count + 1]; for (int i = 0; i < count; i++) { if (i != 0) { outputMatrix[i, i - 1] = Alpha(i); } outputMatrix[i, i] = Beta(i); if (i != N) { outputMatrix[i, i + 1] = Gamma(i); } outputMatrix[i, count] = Phi(i); } return(outputMatrix); }
/// <summary> /// Решает краевую задачу с заданными параметрами /// </summary> /// <param name="input">Структура, представляющая входные параметры</param> /// <param name="count">Количество значений</param> public static double[] GetBoundaryValue(BoundaryInput input, int count) { var boundaryMatrix = GetBoundaryMatrix(input, count); var outputArray = Sweep.SweepMatrix(boundaryMatrix); return(outputArray); }