Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Решение задачи Коши на с#

Максим Лео Знаток (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;
}
Дополнен 7 месяцев назад
Голосование за лучший ответ
Jurijus Zaksas Искусственный Интеллект (445813) 7 месяцев назад
Сопри где-нибудь готовый рабочий метод Ньютона, твоя реализация мне что-то не очень нравится. Сложноватенько как-то все.
Похожие вопросы