Максим Лео
Знаток
(366),
на голосовании
6 месяцев назад
У меня работает явный метод эйлера, но с неявным проблемки. В SolveImplicitEuler на n=2 что-то ломается, то ли зацикливается while в FindNextValue, то ли еще что-то. У меня скорее всего что-то с условиями. В чем проблема?
static List SolveImplicitEuler(Func f, double u0, double T, int N) { double tau = T / N; List u_values = new List(); double u = u0; u_values.Add(u); Console.WriteLine("N: " + N);
for (int n = 1; n <= N; n++) { Console.WriteLine("n: " + n); double t = n * tau; u = FindNextValue(u, t, tau, f); Console.WriteLine("u_next: " + u); u_values.Add(u); } return u_values; }
// Решение неявного уравнения для определения следующего значения u static double FindNextValue(double u_n, double t_n, double tau, Func f) { double u_next = u_n; // Начальное приближение double epsilon = 1e-6; // Точность решения
// Метод Ньютона while (true) { double f_value = f(u_next, t_n + tau); // Вычисляем значение функции правой части double f_derivative = (f(u_next + epsilon, t_n + tau) - f_value) / epsilon; // Приближенное значение производной
double u_next_new = u_n + tau * f_value; // Новое приближенное значение u u_next_new -= (u_next_new - u_next - tau * f_value) / (1 - tau * f_derivative); // Коррекция приближенного значения с учетом производной double delta = Math.Abs(u_next_new - u_next); // Разница между новым и предыдущим значением u
if (delta < epsilon) // Если разница достаточно мала, завершаем итерации break;
u_next = u_next_new; // Обновляем приближенное значение u для следующей итерации } return u_next; }