
- •Тема 4. Численное дифференцирование и интегрирование
- •1. Основные формулы численного дифференцирования
- •Контрольные вопросы и задания
- •6. Y(z) вычисляется по следующему алгоритму:
- •8. Y(z) вычисляется по следующему алгоритму:
- •2. Простые формулы численного интегрирования
- •3. Составные формулы численного интегрирования
- •3. Метод дробления шага. Правило Рунге
- •4. Тестовые примеры для программ численного интегрирования
- •Контрольные вопросы и задания
- •1. Классификация численных методов решения дифференциальных уравнений
- •Результаты расчетов примера 5.3
- •2. Вычислительные формулы численных методов 4-го порядка точности
- •Метод Адамса-Башфорта-Моултона. Это 4-х шаговый метод типа “прогноз-коррекция”. При вычислении используется формула метода Адамса-Башфорта. Коррекция производится по формуле Моултона
- •Методы 4-го порядка точности. Результаты расчетов примера 5.3
- •3. Системы дифференциальных уравнений
- •4. Программная реализация методов решения оду
- •Текст программы
- •5.4.2. Тестовые примеры для программ решения дифференциальных уравнений
- •Контрольные вопросы и задания
4. Программная реализация методов решения оду
5.4.1. Пример программы решения системы ОДУ. Дана система из двух обыкновенных дифференциальных уравнений (5.15). Для описания принципа построения программы ее решения приведем текст программы ее численного решения модифицированным методом Эйлера. Все другие методы, в частности, 4-го порядка отличаются только количеством обращений к процедуре расчета правых частей уравнений и формулами получения результатов (прогнозируемого и окончательного).
(5.15)
Текст программы
Uses Crt;
const k = 2; { Число уравнений }
type mX = array[1..k] of real;
var x, x0, xN, h : real;
y, f1, f2, yPR : mX;
j, i, N : integer;
function fAnal(x:real):real; { Аналитическое решение (чо не вставить, если есть)}
begin fAnal := 2*x – 0.5*exp(x);
end;
procedure fun(x:real; y:mX; var f:mX); { Правые части системы }
begin f[1] := –y[2] + x*x;
f[2] := y[1] + exp(x);
end;
begin ClrScr;
x0:= 0; xN:= 1; y[1]:= –0.5; y[2]:= –1.5; h:= 0.1;
N:= round( (xN – x0) / h ); { Число точек решения}
x := x0;
writeln(x:10:5, y[1]:12:5, y[2]:10:5, fAnal(x):20:5);
for i := 1 to N do
begin
fun(x, y, f1);
for j:=1 to k do yPR[j]:= y[j] + h*f1[j]; { Прогноз }
fun(x+h, yPR, f2);
for j:=1 to k do y[j]:=y[j]+0.5*h*( f1[j]+f2[j]); { Результат }
x := x0 + i*h;
writeln(x:10:5,y[1]:12:5,y[2]:10:5,fAnal(x):20:5);
readln;
end;
end.
Таблица 5.2 |
|||
Решение системы (5.15) |
|||
x |
y1 |
y2 |
y_Aналит |
0.00000 0.10000 0.20000 0.30000 0.40000 0.50000 0.60000 0.70000 0.80000 0.90000 1.00000 |
-0.50000 -0.35200 -0.20954 -0.07321 0.05634 0.17839 0.29215 0.39676 0.49124 0.57453 0.64545 |
-1.50000 -1.43724 -1.34888 -1.23432 -1.09294 -0.92401 -0.72676 -0.50032 -0.24373 0.04407 0.36425 |
-0.50000 -0.35259 -0.21070 -0.07493 0.05409 0.17564 0.28894 0.39312 0.48723 0.57020 0.64086 |
При переходе на другой метод в строке {Прогноз} записываются формулы вычисления всех прогнозируемых точек (по Адамсу-Башфорту или Рунге-Кутте), а в строках {Результат} – итоговая квадратурная формула для вычисления уi+1 с учетом полученного прогноза. Результаты расчетов приведены в таблице 5.2.
5.4.2. Тестовые примеры для программ решения дифференциальных уравнений
1. Решим уравнение 2-го порядка
,
x[
– 1, 2 ]; h = 0.375.
(5.16)
Данное уравнение имеет аналитическое решение у(х) = х(х2 – 1), которое является многочленом 3-й степени, а значит, методы 4-го порядка точности должны давать истинное решение. Следовательно, независимо от применяемого метода, численное решение должно в точности совпасть с аналитическим.
Преобразуем уравнение (5.16) в систему уравнений 1-го порядка с помощью замены переменных:
.
(5.17)
Начальная точка задана, следующие три точки найдем методом Рунге-Кутты 4-го порядка. Последующие точки – методами Адамса-Башфорта и Адамса-Моултона 4-го порядка (для краткости назовем их методами Адамса, т.к. для данной задачи их результаты совпадают). Функции правых частей системы (5.17) будут иметь вид:
f1 (x, z1, z2) = z2;
f2 (x, z1, z2) = 6 x.
Таблица 5.3 |
||||||
Вычисление начальных точек методом Рунге-Кутты |
||||||
x |
y f1 |
y’ f2 |
k11 k12 |
k21 k22 |
k31 k32 |
k41 k42 |
–1 |
0 2 |
2 –6 |
0.75000 –2.25000 |
0.32813 –1.82813 |
0.40723 –1.82813 |
0.06445 –1.40625 |
–0.625 |
0.38086 0.17188 |
0.17188 –3.75000 |
0.06445 –1.40625 |
–0.19922 –0.98438 |
–0.12012 –0.98438 |
–0.30469 –0.56205 |
–0.250 |
0.23438 –0.81250 |
–0.81250 –1.5000 |
–0.30469 –0.56250 |
–0.41016 –0.14063 |
–0.33105 –0.14063 |
–0.35742 0.28125 |
0.125 |
–0.12305 –0.95313 |
–0.95313 0.75000 |
|
|
|
|
Таблица 5.4 |
||
Методы Адамса |
||
x |
y |
y’ |
0.500 |
– 0.37500 |
– 0.25000 |
0.875 |
– 0.20508 |
1.29688 |
1.250 |
0.70313 |
3.68750 |
1.625 |
2.66602 |
6.92188 |
2.000 |
6.00000 |
11.00000 |
Результаты расчетов приведены в таблицах 5.3, 5.4.
2. Решим уравнение 2-го порядка
,
.
(5.18)
Данная задача имеет аналитическое решение у = – ln(cos(x)), которое можно использовать при тестировании программ.
Преобразуем уравнение (5.18) в систему уравнений 1-го порядка:
.
(5.19)
Таблица 5.5 |
||||||
Вычисление начальных точек методом Рунге-Кутты |
||||||
x |
y f1 |
y’ f2 |
k11 k12 |
k21 k22 |
k31 k32 |
k41 k42 |
0.78540 |
0.34657 1.00000 |
1.00000 2.00000 |
0.10472 0.20944 |
0.11569 0.23389 |
0.11697 0.23389 |
0.12921 0.26441 |
0.89012 |
0.46311 1.23490 |
1.23490 2 2.52497 |
0.12932 0.26441 |
0.14316 0.30310 |
0.14519 0.30310 |
0.16106 0.35303 |
0.99484 |
0.60763 1.53988 |
1.53988 3.37118 |
|
|
|
|
1.09956 |
0.78967 1.96265 |
1.96265 4.85184 |
|
|
|
|
Таблица 5.6 |
|||||
Метод Адамса-Башфорта |
|||||
x |
y |
у’ |
х |
y |
y’ |
1.20428 |
1.02434 |
2.58824 |
1.41372 |
1.80705 |
5.88182 |
1.30900 |
1.34033 |
3.65292 |
|
|
|
Таблица 5.7 |
|||||
Метод Адамса- Моултона |
|||||
x |
yпрогн |
у’прогн |
укорр |
у’корр |
уаналит |
1.20428 |
1.02434 |
2.58824 |
1.02581 |
2.60813 |
1.02620 |
1.30900 |
1.34657 |
3.67281 |
1.35016 |
3.74874 |
1.35163 |
1.41372 |
1.83475 |
5.97764 |
1.84735 |
6.44233 |
1.85512 |
В таблицах 5.5 – 5.7 приведены результаты применения численных методов Рунге-Кутты, Адамса-Башфорта и Адамса-Башфорта-Моултона при фиксированном шаге h = /30 0.1047.
С помощью правила Рунге-Ромберга подберем значение h, обеспечивающего достижение заданной точности . Для этого пересчитаем решение системы (5.18) методом Адамса-Башфорта с половинным шагом h = /60. Максимальное расхождение между yh и yh/2 получим в последней точке интервала. Имеем yh =1.807045, yh/2 =1.8450669. Отсюда =0.002535. Полагая = 0.0001, приходим к выводу, что точность не достигнута. Повторим дробление шага. Результаты приведены в таблице 5.8.
Таблица 5.8 |
|||
Применение правила Рунге- Ромберга |
|||
h |
yh |
yh/2 |
|
/30 |
1.8070453 |
1.8450669 |
0.002535 |
/60 |
1.8450669 |
1.8538140 |
0.000583 |
/120 |
1.8538140 |
1.8549938 |
0.000079 |
Таким образом, требуемая точность достигается при h = /120 0.02618. Окончательное решение задачи (5.18) методом Адамса-Башфорта в сочетании с методом Рунге-Кутты приведено в следующей таблице:
Таблица 5.9 |
|||
Решение задачи (5.18) |
|||
x |
у |
у’ |
Аналитическое решение – у |
0.89012 |
0.4631143 |
1.23489 |
0.4631178 |
0.99484 |
0.6076269 |
1.53984 |
0.6079320 |
1.09956 |
0.7896605 |
1.96251 |
0.7898790 |
1.20428 |
1.0261351 |
2.60475 |
1.0261950 |
1.30900 |
1.3514021 |
3.73048 |
1.3516261 |
1.41372 |
1.8538140 |
6.30000 |
1.8551181 |