- •Министерство образования республики беларусь
- •Содержание
- •Общие положения
- •Индивидуальные задания задание 1 Методы решения нелинейных уравнений
- •Рекомендации по решению нелинейных уравнений
- •Задание 2 Аппроксимация табулированных функций методом наименьших квадратов
- •Рекомендации по вычислению коэффициентов аппроксимирующего полинома
- •Задание 3 Методы численного интегрирования и дифференцирования функций
- •Рекомендации по решению задачи численного интегрирования и дифференцирования
- •Задание 4 Решение дифференциальных уравнений
- •Рекомендации по решению обыкновенных дифференциальных уравнений методом Рунге-Кутта
- •Методом Рунге-Кутта четвертого порядка
- •Требования к курсовой работе Содержание курсовой работы
- •Правила оформления курсовой работы
- •Подготовка к защите и защита курсовой работы
- •Список рекомендуемой литературы
- •Приложение а
- •Приложение в
Задание 4 Решение дифференциальных уравнений
Разработать алгоритм решения дифференциального уравнения вида методом Рунге-Кутта. Варианты функцийпредставлены в таблице 1 на стр. 5-6 и должны быть сформулированы по правилу
Граничные условия выбрать с учетом формул:
, ,
где n - вариант задания. Уравнение решается на отрезке при разбиении его наk равных частей. Точность вычислений Создать блок-схему алгоритма.
Создать программу на языке Pascal (Delphi), реализующую разработанный алгоритм. Программа должна вычислять таблицу значений функции при трёх различных шагах разбиения. Один из них –k, два других выбрать самостоятельно.
С помощью программы исследовать влияние числа разбиений k на вид решения
Построить графики функции для трёх случаев (отличающихся количеством отрезков разбиения).
Решить задачу средствами MathCad (Excel).
Примечание: Результаты решения задачи с помощью программы и в среде MathCad (Excel) нужно представить в виде таблицы, содержащей полученные значения функции ; таблицы, содержащей значения интеграла для разных шагов разбиения.
Рекомендации по решению обыкновенных дифференциальных уравнений методом Рунге-Кутта
Блок-схема алгоритма простейшей реализации метода Рунге-Кутта представлена на рисунке 1. В блоке 2 осуществляется ввод концов отрезка [x0; xn], значение функции у0=у(х0) и количество промежутков разбиения n. Далее производится присваивание переменным хi и уi, хранящим текущее значение аргумента и функции, начальных значений и рассчитывается шаг h (блок 3). Затем эти значения выводятся. После этого в цикле с предусловием по методу Рунге-Кутта вычисляется значение функции и аргумента в следующей точке (блок 5), которые затем и выводятся (блок 7).
Замечание 1. Функция F(x,y) представляет правую часть обыкновенного дифференциального уравнения вида . Если уравнение имеет более высокий порядок, то прибегают к использованию метода понижения производной (см. литературу по численным методам).
Рисунок 12 – Блок-схема алгоритма решения ОДУ
Методом Рунге-Кутта четвертого порядка
Замечание 2. Если функция y(x) на каком-нибудь промежутке нарастает очень быстро, то имеет смысл доработать данный алгоритм, добавив в него проверку условия:
. (1)
При невыполнении этого условия, шаг нужно уменьшить вдвое, повторить вычисление слагаемых k1, k2, k3, k4 и повторить проверку условия (1) и т.д. Такая модификация метода позволит существенно увеличить его точность.
Замечание 3. Данный алгоритм не предусматривает ни оценки погрешности вычисляемых значений, ни погрешности метода в целом. Поэтому при необходимости такой оценки он должен быть доработан.
Ниже приведен текст программы на языке Паскаль, реализующей данный алгоритм для уравнения .
Program MRK;
var x0,xn,y0,h,x,y,k1,k2,k3,k4:real;
n,j:integer;
function F(x,y:real):real;
begin
F:=y*y+1/(2*x*x);
end;
begin
writeln('Введите концы отрезка x0, xn: ');
readln(x0,xn);
writeln('Введите начальное значени функции y0:');
readln(y0);
writeln('Введите число отрезков разбиения n: ');
readln(n);
h:=(xn-x0)/n;
writeln('Таблица значений функции');
writeln('------------------------');
writeln(' x | y(x) ');
writeln('------------------------');
writeln(x0:7:3,' | ',y0:7:5);
x:=x0; y:=y0;
for j:=1 to n do begin
{Приостанавливаем выполнение программы до нажатия клавиши Enter после вывода каждых 10 значений}
if j mod 10 = 0 then readln;
k1:=h*F(x,y);
k2:=h*F(x+h/2,y+k1/2);
k3:=h*F(x+h/2,y+k2/2);
k4:=h*F(x+h,y+k3);
y:=y+(k1+2*k2+2*k3+k4)/6;
x:=x+h;
writeln(x:7:3,' | ',y:7:5);
end;
readln;
end.
Замечание. Проверить результаты работы программы можно введя следующие данные: х0=1, хn=1.5, у0=0.9 и произвольное количество шагов n.
Оценить погрешность вычисления некоторого yn можно по приближенной формуле Рунге [21, c.334].