Как и в предыдущей статье, в этой нет изложения теоретических основ представленных алгоритмов, но, при необходимости информацию легко можно найти в любой книге о численных методах, например - Е. А. Волков "Численные методы". Особое внимание нужно уделить вопросам выбора узлов и шага интегрирования, обеспечения требуемой точности вычислений, а также применимости и целесообразности выбора того или другого метода.
В качестве интегрируемой функции возьмем в этот раз такую:
Функция Функция_2(х,у)
Возврат Окр(Pow(х,2) + Pow(у,2),16);
КонецФункции
Так будет выглядеть вызов расчетных функций и начальные условия:
Процедура ВыполнитьРасчет()
Число_шагов = 500;
Х_нач = 1;
Х_кон = 1.2;
У_нач = 4;
Сообщить("Метод Эйлера (1-ый пор.тчн.) = " + РассчитатьЭйлера(Х_нач, Х_кон, У_нач, Число_шагов));
Сообщить("Метод Эйлера усовершенств. (2-ой пор.тчн.) = " + РассчитатьЭйлераУсовершенствованный(Х_нач, Х_кон, У_нач, Число_шагов));
Сообщить("Метод Эйлера-Коши (2-ой пор.тчн.) = " + РассчитатьЭйлераКоши(Х_нач, Х_кон, У_нач, Число_шагов));
Сообщить("Метод Рунге-Кутта (4-ый пор.тчн.) = " + РассчитатьРунгеКутта(Х_нач, Х_кон, У_нач, Число_шагов));
КонецПроцедуры
Таким образом, имеется функция F(x;y)=x^2 + y^2, начальные условия (1;4), где x пробегает значения от 1 до 1,2. Требуется численно решить задачу Коши ОДУ. Число шагов - 500.
1) Метод Эйлера (первого порядка точности):
Функция РассчитатьЭйлера(Х_нач, Х_кон, У_нач, Число_шагов)
h = (Х_кон-Х_нач)/Число_шагов;
x = Х_нач;
y = У_нач;
Для й=0 По Число_шагов-1 Цикл
y = y + h*Функция_2(x,y);
x = x + h;
КонецЦикла;
Возврат y;
КонецФункции
2) Метод Эйлера улучшенный (второго порядка точности):
Функция РассчитатьЭйлераУсовершенствованный(Х_нач, Х_кон, У_нач, Число_шагов)
h = (Х_кон-Х_нач)/Число_шагов;
x = Х_нач;
y = У_нач;
Для й=0 По Число_шагов-1 Цикл
yрр = y + 0.5*h*Функция_2(x,y);
y = y + h*(Функция_2(x+0.5*h,yрр));
x = x + h;
КонецЦикла;
Возврат y;
КонецФункции
3) Метод Эйлера-Коши (второго порядка точности):
Функция РассчитатьЭйлераКоши(Х_нач, Х_кон, У_нач, Число_шагов)
h = (Х_кон-Х_нач)/Число_шагов;
x = Х_нач;
y = У_нач;
Для й=0 По Число_шагов-1 Цикл
yp = y + h*Функция_2(x,y);
y = y + 0.5*h*(Функция_2(x,y) + Функция_2(x+h,yp));
x = x + h;
КонецЦикла;
Возврат y;
КонецФункции
4) Метод Рунге-Кутта (четвёртого порядка точности):
Функция РассчитатьРунгеКутта(Х_нач, Х_кон, У_нач, Число_шагов)
h = (Х_кон-Х_нач)/Число_шагов;
х = Х_нач;
у = У_нач;
Для й=0 По Число_шагов-1 Цикл
К0 = Функция_2(х, у);
К1 = Функция_2(х + 0.5*h, у + 0.5*h*К0);
К2 = Функция_2(х + 0.5*h, у + 0.5*h*К1);
К3 = Функция_2(х + h, у + h*К2);
у = у + h*(К0 + 2*К1 + 2*К2 + К3)/6;
х = х + h;
КонецЦикла;
Возврат у;
КонецФункции
Результат вычислений:
Метод Эйлера (1-ый пор.тчн.) = 22,18596991825004379496
Метод Эйлера усовершенств. (2-ой пор.тчн.) = 22,52108073259233371164
Метод Эйлера-Коши (2-ой пор.тчн.) = 22,5214513039223151306
Метод Рунге-Кутта (4-ый пор.тчн.) = 22,522188708188403111466666666666666666666666665999999992