Дифференциальным уравнением $$n$$-го порядка называется соотношение вида
$$H(t,x,x',x'',\dots,x^{(n)})=0.$$Решением дифференциального уравнения называется функция $$x(t)$$, которая обращает уравнение в тождество.
Системой дифференциальных уравнений $$n$$-го порядка называется система вида:
$$ \left\{ \begin{matrix} {x'}_1=f_1(t,x_1,x_2,\dots,x_n)\\ {x'}_2=f_2(t,x_1,x_2,\dots,x_n)\\ \hdotsfor{1}\\ {x'}_n=f_n(t,x_1,x_2,\dots,x_n) \end{matrix} \right.$$Системой линейных дифференциальных уравнений называется система вида:
$$\label{gl9:ref2} \left\{ \begin{matrix} \displaystyle {x'}_1=\sum _{j=1}^na_{1j}x_j+b_1\\ \displaystyle {x'}_2=\sum_{j=1}^na_{2j}x_j+b_2\\ \hdotsfor{1}\\ \displaystyle {x'}_n=\sum _{j=1}^na_{nj}x_j+b_n \end{matrix} \right.$$Решением системы называется вектор $$x(t)= \begin{pmatrix} x_1(t)\\x_2(t)\\\dots\\x_n(t) \end{pmatrix}$$, который обращает уравнения систем (9.2), (9.3) в тождества.
Каждое дифференциальное уравнение, так же, как и система, имеет бесконечное множество решений, которые отличаются друг от друга константами. Для однозначного определения решения необходимо определить дополнительные начальные или граничные условия. Количество таких условий должно совпадать с порядком дифференциального уравнения или системы. В зависимости от вида дополнительных условий в дифференциальных уравнениях различают:
Различают точные (аналитические) и приближённые (численные) методы решения дифференциальных уравнений. Большое количество уравнений может быть решено точно. Однако есть уравнения, а особенно системы уравнений, для которых нельзя записать точное решение. Но даже для уравнений с известным аналитическим решением очень часто необходимо вычислить числовое значение при определённых исходных данных. Поэтому широкое распространение получили численные методы решения обыкновенных дифференциальных уравнений.
(рис 9.1) Интегральная кривая, проходящая через точку M_0(_t0, x_0)
Численные методы решения дифференциального уравнения первого порядка будем рассматривать для следующей задачи Коши. Найти решение дифференциального уравнения
$$x'=f(x,t)$$удовлетворяющее начальному условию
$$x(t_0)=x_0$$иными словами, требуется найти интегральную кривую $$x = x(t)$$, проходящую через заданную точку $$M_0(t_0,x_0)$$ (рис. 9.1).
Для дифференциального уравнения $$n$$-го порядка
$$x^{(n)}=f(t,x,x^{'},x^{''},\dots,x^{(n-1)})$$задача Коши состоит в нахождении решения x = x(t), удовлетворяющего уравнению (9.6) и начальным условиям
$$x(t_0)=x_0,{x}^{'}(t_0)=x_0^{'},\dots,x^{(n-1)}(t_0)=x_0^{(n-1)}$$Рассмотрим основные численные методы решения задачи Коши.
При решении задачи Коши (9.4), (9.5) на интервале $$[t_0,t_n]$$, выбрав достаточно малый шаг $$h$$, построим систему равноотстоящих точек
$$t_i=t_0+ih,\quad i=0,1,\dots, n,\quad h=\frac{t_n-t_0}{n}$$Для вычисления значения функции в точке $$t_1$$ разложим функцию $$x = x(t)$$ в окрестности точки $$t_0$$ в ряд Тейлора [2]
$$x(t_1)=x(t_0+h)=x(t_0)+x'(t_0)h+x''(t_0)\frac{h^2}{2}+\dots$$При достаточном малом значении $$h$$ членами выше второго порядка можно пренебречь и с учётом $$x'(t_0)=f(x_{0,}t_0)$$ получим следующую формулу для вычисления приближённого значения функции $$x(t)$$ в точке $$t_1$$
$$x_1=x_0+hf(x_0,t_0)$$Рассматривая найденную точку $$(x_1,t_1)$$, как начальное условие задачи Коши запишем аналогичную формулу для нахождения значения функции $$x(t)$$ в точке $$t_2$$
$$x_2=x_1+hf(x_1,t_1).$$Повторяя этот процесс, сформируем последовательность значений $$x_i$$ в точках $$t_i$$ по формуле
$$x_{i+1}=x_i+hf(x_i,t_i),\quad i=0,1,\dots,n.$$Процесс нахождения значений функции $$x_i$$ в узловых точках $$t_i$$ по формуле (9.11) называется методом Эйлера. Геометрическая интерпретация метода Эйлера состоит в замене интегральной кривой $$x(t)$$ ломаной $$M_0,M_1,M_2,\dots,M_n$$ с вершинами $$M_i(x_i,y_i)$$. Звенья ломанной Эйлера $$M_iM_{i+1}$$ в каждой вершине $$M_i$$ имеют направление $$y_i=f(t_i,x_i)$$, совпадающее с направлением интегральной кривой $$x(t)$$ уравнения (9.4), проходящей через точку $$M_i$$ (рис. 9.2). Последовательность ломанных Эйлера при $$h\to 0$$ на достаточно малом отрезке $$[x_i,x_i+h]$$ стремится к искомой интегральной кривой.
(рис 9.2) Геометрическая интерпретация метода Эйлера
На каждом шаге решение $$x(t)$$ определяется с ошибкой за счёт отбрасывания членов ряда Тейлора выше первой степени, что в случае быстро меняющейся функции $$f (t, x)$$ может привести к быстрому накапливанию ошибки. В методе Эйлера следует выбирать достаточной малый шаг $$h$$.
Более точным методом решения задачи (9.4)–(9.5) является модифицированный метод Эйлера, при котором сначала вычисляют промежуточные значения [2]
$$t_p=t_i+\frac{h}{2},\ x_p=x_i+\frac{h}{2}f(x_i,t_i)$$после чего находят значение $$x_{i+1}$$ по формуле
$$x_{i+1}=x_i+hf(x_p,t_p),\quad i=0,1,\dots, n-1$$Рассмотренные выше методы Эйлера (как обычный, так и модифицированный) являются частными случаями явного метода Рунге-Кутта $$k$$-го порядка. В общем случае формула вычисления очередного приближения методом Рунге-Кутта имеет вид [2]:
$$x_{i+1}=x_i+h\varphi (t_i,x_i,h),\quad i=0,1,\dots, n-1$$Функция $$\varphi (t,x,h)$$ приближает отрезок ряда Тейлора до $$k$$-го порядка и не содержит частных производных $$f (t, x)$$ [2].
Метод Эйлера является методом Рунге-Кутта первого порядка (k = 1) и получается при $$\varphi (t,x,h) = f (t,x)$$.
Семейство методов Рунге-Кутта второго порядка имеет вид [2]
$$x_{i+1}=x_i+h\Biggl((1-\alpha )f(t_i,x_i)+\alpha f\left(t_i+ \frac{h}{2\alpha },x_i+\frac{h}{2\alpha}f(t_i,x_i)\right)\Biggr),\\ i=0,1,\dots, n-1$$Два наиболее известных среди методов Рунге-Кутта второго порядка [2] — это метод Хойна $$\alpha=\frac{1}{2}$$ и модифицированный метод Эйлера $$\alpha=1$$.
Подставив $$\alpha=\frac{1}{2}$$в формулу (9.15), получаем расчётную формулу метода Хойна [2]:
$$x_{i+1}=x_i+\frac{h}{2}\left(f(t_i,x_i)+f(t_i+h,x_i+hf(t_i,x_i))\right),\quad i=0,1,\dots, n-1$$Подставив $$\alpha=1$$ в формулу (9.15), получаем расчётную формулу уже рассмотренного выше модифицированного метода Эйлера
$$x_{i+1}=x_i+h\Biggl(f\left(t_i+\frac{h}{2},x_i+\frac{h}{2}f(t_i,x_i)\right)\Biggr),\quad i=0,1,\dots, n-1$$Наиболее известным является метод Рунге-Кутта четвёртого порядка, расчётные формулы которого можно записать в виде [2]:
$$\left\{ \begin{aligned} x_{i+1} =x_i+\Delta x_i,\quad i=1,\dots, n\\ \Delta x_i =\frac{h}{6}(K_1^i+2K_2^i+2K_3^i+K_4^i)\\ K_1^i =f(t_i,x_i)\\ K_2^i =f(t_i+\frac{h}{2},x_i+\frac{h}{2}K_1^i)\\ K_3^i =f(t_i+\frac{h}{2},x_i+\frac{h}{2}K_2^i)\\ K_4^i =f(t_i+h,x_i+hK_3^i) \end{aligned} \right.$$Одной из модификаций метода Рунге-Кутта является метод Кутта-Мерсона (или пятиэтапный метод Рунге-Кутта четвёртого порядка), который состоит в следующем [2].
Рассмотренные методы Рунге-Кутта относятся к классу одношаговых методов, в которых для вычисления значения в очередной точке $$x_{k+1}$$ нужно знать значение в предыдущей точке $$x_k$$.
Ещё один класс методов решения задачи Коши — многошаговые методы, в которых используются точки $$x_{k-3}, x_{k-2}, x_{k-1}, x_{k}$$ для вычисления $$x_{k+1}$$. В многошаговых методах первые четыре начальные точки $$(t_{0},x_{0}),(t_{1},x_{1}),(t_{2},x_{2}),(t_{3},x_{3})$$должны быть получены заранее любым из одношаговых методов (метод Эйлера, Рунге-Кутта и т.д.). Наиболее известными многошаговыми методами являются методы прогноза-коррекции Адамса и Милна.
Рассмотрим решение уравнения (9.1)–(9.2) на интервале $$[t_{i},t_{i+1}]$$. Будем считать, что решение в точках $$t_{0},t_{1},t_{2},\dots,t_{i}$$ уже найдено, и значения в этих точках будем использовать для нахождения значения $$x(t_{i+1})$$.
Проинтегрируем уравнение (9.1) на интервале $$[t_{i},t_{i+1}]$$ и получим соотношение [2]
$$x(t_{i+1})=x(t_{i})+\int _{t_{i}}^{t_{i+1}}f(t,x(t))\,dt$$При вычислении интеграла, входящего в (9.20), вместо функции $$f (t, x(t))$$ будем использовать интерполяционный полином Лагранжа,построенный по точкам $$(t_{i-3},x_{i-3}), (t_{i-2},x_{i-2}), (t_{i-1},x_{i-1}),(t_{i},x_{i})$$. Подставив полином Лагранжа в (9.20), получаем первое приближение (прогноз) $$\tilde{x}_{i+1}$$ для значения функции в точке $$t_{i+1}$$
$$\tilde {x}_{i+1}=x_{i}+\frac{h}{24}(-9f(t_{i-3},x_{i-3})+37f(t_{i-2},x_{i-2})-\\-59f(t_{i-1},x_{i-1})+55f(t_{i},x_{i}))$$Как только $$\tilde{x}_{i+1}$$ вычислено, его можно использовать. Следующий полином Лагранжа для функции f (t, x(t)) построим по точкам $$(t_{i-2},x_{i-2}),(t_{i-1},x_{i-1}),(t_{i},x_{i})$$ и новой точке $$(t_{i+1},\tilde{x}_{i+1})$$, после чего подставляем его в (9.20) и получаем второе приближение (корректор)
$$x_{i+1}=x_{i}+\frac{h}{24}(f(t_{i-2},x_{i-2})-5f(t_{i-1},x_{i-1})+\\+19f(t_{i},x_{i})+9f(t_{i+1},\tilde{x}_{i+1}))$$Таким образом, для вычисления значения $$x(t_{i+1})$$ методом Адамса необходимо последовательно применять формулы (9.21), (9.22) [2], а первые четыре точки можно получить методом Рунге-Кутта.
Отличие метода Милна от метода Адамса состоит в использовании в качест ве интерполяционного полинома Ньютона.
Подставив в (9.20) вместо функции $$f (t, x(t))$$ интерполяционный полином Ньютона, построенный по точкам $$(t_{k-3},x_{k-3}),(t_{k-2},x_{k-2}),(t_{k-1},x_{k-1}),(t_{k},x_{k})$$ получаем первое приближение — прогноз Милна $$\tilde {{x_{k+1}}}$$ для значения функции в точке $$t_{k+1}$$[2]
$$\tilde {x}_{k+1}=x_{k-3}+\frac{4h}{3}(2f(t_{k-2},x_{k-2})-f(t_{k-1},x_{k-1})+2f(t_{k},x_{k}))$$Следующий полином Ньютона для функции $$f (t, x(t))$$ построим по точкам $$(t_{k-2},x_{k-2}),(t_{k-1},x_{k-1}),(t_{k},x_{k})$$ и новой точке $$(t_{k+1},\tilde{x}_{k+1})$$, после чего подставляем его в (9.20) и получаем второе приближение — корректор Милна [2]
$$x_{k+1}=x_{k-1}+\frac{h}{3}(f(t_{k-1},x_{k-1})+4f(t_{k},x_{k})+f(t_{k+1},\tilde{x}_{k+1}))$$В методе Милна для вычисления значения $$x(t_{k+1})$$ необходимо последовательно применять формулы (9.23), (9.24), а первые четыре точки можно получить методом Рунге-Кутта.
Существует модифицированный метод Милна. В нём сначала вычисляется первое приближение по формуле (9.23), затем вычисляется управляющий параметр [2]
$$m_{k+1}=\tilde {x}_{k+1}+\frac{28}{29}(x_{k}-\tilde {x}_{k})$$После чего вычисляется значение второго приближения — корректор Милна по формуле
$$x_{k+1}=x_{k-1}+\frac{h}{3}(f(t_{k-1},x_{k-1})+4f(t_{k},x_{k})+f(t_{k+1},m_{k+1}))$$В модифицированном методе Милна первые четыре точки можно получить методом Рунге-Кутта, а для вычисления значения $$x(t_{k+1})$$ необходимо последовательно применять формулы (9.23), (9.25), (9.26).
Ниже приведены тексты функций, реализующие рассмотренные в п. 9.2 численные методы решения дифференциальных уравнений.
function[x, t]= eiler(a, b, n, x0) % Функция решения задачи Коши x'(t) = g(t, x) x(a) = x0 методом Эйлера. % n — количество отрезков, на которые разбивается интервал [a, b]. h=(b-a)/n; % Вычисление шага h. x(1)=x0; for i =1:n+1 % Формирование системы равноотстоящих узлов ti t(i)=a+(i-1)*h; end % Вычисление значений функции в узловых точках по формуле (9.11) for i =2:n+1 x(i)=x(i-1)+h*g(t(i-1),x(i-1)); end end
function[x, t]= eiler_m(a, b, n, x0) % Функция решения задачи Коши x'(t) = g(t, x)x(a) = x0 % модифицированным методом Эйлера. % n — количество отрезков, на которые разбивается интервал [a, b]. h=(b-a)/n;% Вычисление шага h. x(1)=x0; for i =1:n+1 % Формирование системы равноотстоящих узлов ti t(i)=a+(i-1)*h; end % Вычисление значений функции по формулам (9.13) — (9.14). for i =2:n+1 tp=t(i-1)+h/2; xp=x(i-1)+h/2*g(t(i-1), x(i-1)); x(i)=x(i-1)+h*g(tp, xp); end end
function[x, t]= runge_kut(a, b, n, x0) % Функция решения задачи Коши x'(t) = g(t, x) x(a) = x0 методом Рунге-Кутта % n — количество отрезков, на которые разбивается интервал [a, b]. h=(b-a)/n;% Вычисление шага h. x(1)=x0; for i =1:n+1 % Формирование системы равноотстоящих узлов ti t(i)=a+(i-1)*h; end % Вычисление значений функции формуле (9.16). for i =2:n+1 % Расчёт коэффициентов K1, K2, K3, K4 K1=g(t(i-1), x(i-1)); K2=g(t(i-1)+h/2, x(i-1)+h/2*K1); K3=g(t(i-1)+h/2, x(i-1)+h/2*K2); K4=g(t(i-1)+h, x(i-1)+h-K3); % Расчёт приращения delt delt=h/6*(K1+2*K2+2*K3+K4); x(i)=x(i-1)+delt; end end
function[x, t, j]=kut_merson(a, b, n, eps, x0) % Функция решения задачи Коши x'(t) = g(t, x)x(a) = x0 методом % Кутта-Мерсона на интервале интегрирования [a, b] c точностью eps, % n — количество отрезков, на которые вначале разбивается интервал [a, b]. h=(b-a)/n; % Вычисление шага h. x(1)=x0; t(1)=a; i=2; while(t(i-1)+h)<=b R=3*eps; while R>eps % Расчёт коэффициентов K1, K2, K3, K4, K5. K1=g(t(i-1), x(i-1)); K2=g(t(i-1)+h/3, x(i-1)+h/3*K1); K3=g(t(i-1)+h/3, x(i-1)+h/6*K1+h/6*K2); K4=g(t(i-1)+h/2, x(i-1)+h/8*K1+3*h/8*K2); K5=g(t(i-1)+h, x(i-1)+h/2*K1-3*h/2*K3+2*h*K4); % Вычисление сравниваемых значений x(i+1) X1=x(i-1)+h/2*(K1-3*K3+4*K4); X2=x(i-1)+h/6*(K1+4*K4+K5); % Вычисление оценочного коэффициента R. R=0.2*abs(X1-X2); % Сравнение оценочного коэффициента R с точностью eps. if R>eps h=h/2; else % Если оценочный коэффициент R меньше точности eps, % то происходит формирование очередной найденной точки и % переход к следующему этапу по i. t(i)=t(i-1)+h; x(i)=X2; i=i+1; % Если оценочный коэффициент R меньше eps/64, % то можно попробовать увеличить шаг. if R<= eps/64 if (t(i-1)+2*h)<=b h=2*h; end end end end end % В переменной j возвращается количество элементов в массивах x и t j=i-1 end
function[x, t]=adams(a, b, n, x0) % Функция решения задачи Коши x'(t) = g(t, x) x(a) = x0 методом Адамса % n — количество отрезков, на которые разбивается интервал [a, b]. h=(b-a)/n; % Вычисление шага h x(1)=x0; for i=1:n+1 % Формирование системы равноотстоящих узлов ti. t(i)=a+(i-1)*h; end % Вычисление значений функции в трёх узловых точках по формуле(9.16) for i =2:4 K1=g(t(i-1), x(i-1)); K2=g(t(i-1)+h/2, x(i-1)+h/2*K1); K3=g(t(i-1)+h/2, x(i-1)+h/2*K2); K4=g(t(i-1)+h, x(i-1)+h*K3); % Расчёт приращения delt delt=h/6*(K1+2*K2+2*K3+K4); x(i)=x(i-1)+delt; end for i =4:n % Вычисление значений в остальных точках методом Адамса % Вычисление прогноза xp=x(i)+h/24*(-9*g(t(i-3), x(i-3))+37*g(t(i-2), x(i-2)) -59*g(t(i-1), x(i-1))+55*g(t(i), x(i))); % Вычисление корректора x(i+1)=x(i)+h/24*(g(t(i-2), x(i-2))-5*g(t(i-1), x(i-1)) +19*g(t(i), x(i))+9*g(t(i+1), xp)); end end
function[x, t]= miln(a, b, n, x0) % Функция решения задачи Коши x'(t) = g(t, x) x(a) = x0 методом Милна % n — количество отрезков, на которые разбивается интервал [a, b]. h=(b-a)/n; % Вычисление шага h x(1)=x0; xp(1)=x(1); for i =1:n+1 % Формирование системы равноотстоящих узлов ti t(i)=a+(i-1)*h; end % Вычисление значений функции в трёх узловых точках по формуле (9.16) for i =2:4 K1=g(t(i-1), x(i-1)); K2=g(t(i-1)+h/2, x(i-1)+h/2*K1); K3=g(t(i-1)+h/2, x(i-1)+h/2*K2); K4=g(t(i-1)+h, x(i-1)+h*K3); % Расчёт приращения delt delt=h/6*(K1+2*K2+2*K3+K4); x(i)=x(i-1)+delt; xp(i)=x(i); end for i =4:n % Вычисление значений в остальных точках методом Адамса % Вычисление прогноза xp(i+1)=x(i-3)+4*h/3*(2*g(t(i-2), x(i-2))-g(t(i-1), x(i -1))+g(t(i), x(i))); % Вычисление управляющего параметра m=xp(i+1)+28/29*(x(i)-xp(i)); % Вычисление корректора. x(i+1)=x(i-1)+h/3*(g(t(i-1), x(i-1))+4*g(t(i), x(i))+g(t (i+1), m)); end end
Написать функцию модифицированного метода Милна авторы предоставляют читателю.
Рассмотрим использование приведённых выше функций на примере решения следующей задачи Коши.
Пример 9.1. Решить задачу Коши
$$\left\{ \begin{aligned} y'(x)=6y-13x^{3}-22x^{2}+17x-11+\sin (x);\\ y(0)=2. \end{aligned}$$Известно точное решение задачи 9.1:
$$y(x)=\frac{119}{296}e^{6x}+\frac{1}{24}(52x^{3}+114x^{2}-30x+39)-\frac{6\sin (x)}{37}-\frac{\cos (x)}{37}.$$В листинге 9.7 представлено решение уравнения методами:
% Точное решение function q= fi(x) q=119/296*exp(6*x)+1/24*(52*x.^3+114*x.^2-30*x+39)-6*sin(x )/37-cos(x)/37; end % Правая часть дифференциального уравнения. function y=g(t, x) y=6-x-13*t^3-22*t^2+17*t-11+sin(t); end % Функция решения задачи Коши модифицированным методом Эйлера. function[x, t]= eiler_m(a, b, n, x0) h=(b-a)/n; x(1)=x0; for i =1:n+1 t(i)=a+(i-1)*h; end for i =2:n+1 tp=t(i-1)+h/2; xp=x(i-1)+h/2*g(t(i-1), x(i-1)); x(i)=x(i-1)+h*g(tp, xp); end end % Функция решения задачи Коши методом Рунге-Кутта. function[x, t]=runge_kut(a, b, n, x0) h=(b-a)/n; x(1)=x0; for i =1:n+1 t(i)=a+(i-1)*h; end for i =2:n+1 K1=g(t(i-1), x(i-1)); K2=g(t(i-1)+h/2, x(i-1)+h/2*K1); K3=g(t(i-1)+h/2, x(i-1)+h/2*K2); K4=g(t(i-1)+h, x(i-1)+h*K3); delt=h/6*(K1+2*K2+2*K3+K4); x(i)=x(i-1)+delt; end end % Функция решения задачи Коши методом Кутта-Мерсона. function[x, t,j ]=kut_merson(a, b, n, eps, x0) h=(b-a)/n; x(1)=x0; t(1)=a; i=2; while(t(i-1)+h)<=b R=3*eps; while R>eps K1=g(t(i-1), x(i-1)); K2=g(t(i-1)+h/3, x(i-1)+h/3*K1); K3=g(t(i-1)+h/3, x(i-1)+h/6*K1+h/6*K2); K4=g(t(i-1)+h/2, x(i-1)+h/8*K1+3*h/8*K2); K5=g(t(i-1)+h, x(i-1)+h/2*K1-3*h/2*K3+2*h*K4); X1=x(i-1)+h/2*(K1-3*K3+4*K4); X2=x(i-1)+h/6*(K1+4*K4+K5); R=0.2*abs(X1-X2); if R>eps h=h/2; else t(i)=t(i-1)+h; x(i)=X2; i=i+1; if R<= eps/64 if (t(i-1)+2*h)<=b h=2*h; end end end end end j=i-1 end % Функция решения задачи Коши методом Милна. function[x, t]= miln(a, b, n, x0) h=(b-a)/n; x(1)=x0; xp(1)=x(1); for i =1:n+1 t(i)=a+(i-1)*h; end for i =2:4 K1=g(t(i-1), x(i-1)); K2=g(t(i-1)+h/2, x(i-1)+h/2*K1); K3=g(t(i-1)+h/2, x(i-1)+h/2*K2); K4=g(t(i-1)+h, x(i-1)+h*K3); delt=h/6*(K1+2*K2+2*K3+K4); x(i)=x(i-1)+delt; xp(i)=x(i); end for i =4:n xp(i+1)=x(i-3)+4*h/3*(2-g(t(i-2), x(i-2))-g(t(i-1), x(i -1))+g(t(i), x(i))); m=xp(i+1)+28/29*(x(i)-xp(i)); x(i+1)=x(i-1)+h/3*(g(t(i-1), x(i-1))+4*g(t(i), x(i))+g(t (i+1),m)); end end % Функция решения задачи Коши методом Адамса. function[x, t]=adams(a, b, n, x0) h=(b-a)/n; x(1)=x0; for i =1:n+1 t(i)=a+(i-1)*h; end for i =2:4 K1=g(t(i-1), x(i-1)); K2=g(t(i-1)+h/2, x(i-1)+h/2*K1); K3=g(t(i-1)+h/2, x(i-1)+h/2*K2); K4=g(t(i-1)+h, x(i-1)+h* K3); delt=h/6*(K1+2*K2+2*K3+K4); x(i)=x(i-1)+delt; end for i =4:n xp=x (i)+h/24*(-9*g(t(i-3), x(i-3))+37*g(t(i-2), x(i-2)) -59*g(t(i-1), x(i-1)) +55*g(t(i), x(i))); x(i+1)=x(i)+h/24*(g(t(i-2), x(i-2))-5*g(t(i-1), x(i-1)) +19*g(t(i), x(i))+9*g(t(i+1), xp)); end end % Решение дифференциального уравнения модифицированным методом Эйлера. [YE_M,XE_M]= eiler_m(0, 1, 10, 2); % Решение дифференциального уравнения методом Рунге-Кутта. [YR,XR]= runge_kut(0, 1, 10, 2); % Решение дифференциального уравнения методом Кутта-Мерсона. [YKM,XKM,KM]=kut_merson(0, 1, 5, 0.001, 2); % Решение дифференциального уравнения методом Адамса. [YA,XA]=adams(0, 1, 10, 2); % Решение дифференциального уравнения методом Милна. [YM,XM]= miln(0, 1, 10, 2); % Точное решение. x1 = 0:0.05:1; y1= fi(x1); % Построение графиков. plot(x1, y1, ’-g;exact solution;’,XE_M,YE_M, ’*b;eiler;’,XR,YR, ’ ob;runge-kutt;’,XA,YA, ’^b;adams;’,XM,YM, ’>b;miln;’); figure(); plot(x1, y1, ’-g;exact solution;’,XKM,YKM, ’<b;kut -merson;’); grid on;
(рис 9.3) Графики решения модифицированным методом Эйлера, методами Рунге-Кутта, Адамса, Милна и точного решения
На рис. 9.3–9.4 приведены графики решения задачи модифицированным методом Эйлера, методами Рунге-Кутта, Кутта-Мерсона, Адамса, Милна и точного решения. При обращении к функции $$kut_merson$$ в качестве $$n$$ передавалось число 5.
Функция выбирала оптимальный шаг на каждом из отрезков. Как видно из рисунка, шаг то увеличивается, то уменьшается. При решении уравнения методом Кутта-Мерсона невозможно гарантировать вычисление значения в заданных точках интервала. Однако после получения решения методом Кутта-Мерсона значение в любой точки можно вычислить, интерполируя полученную зависимость.
При решении данной задачи наиболее точными оказались методы Адамса, Рунге-Кутта и Кутта-Мерсона.
(рис 9.4) Графики решения методом Кутта-Мерсона и точного решения
Все рассмотренные методы решения дифференциальных уравнений применимы и для систем дифференциальных уравнений. Рассмотрим на примере метода Рунге-Кутта, как рассмотренные методы можно обобщить для систем.
Пусть дана система дифференциальных уравнений в матричном виде:
$$\left\{\begin{aligned}\frac{d\bar{x}}{dt}amp;=\bar{f}(t,\bar{x})\\ \bar{x}(t_{0})amp;=\bar{x}_{0} \quad(\text{начальное условие}), \end{aligned}$$ $$$\left\{\begin{aligned}\frac{d\bar{x}}{dt}amp;=\bar{f}(t,\bar{x})\\ \bar{x}(t_{0})amp;=\bar{x}_{0} \quad(\text{начальное условие}), \end{aligned}$\\ \mbox{где}\bar{x}=\left(\begin{matrix}x_{1}(t)\\x_{2}(t)\\\dots\\x_{n}(t)\end{matrix}\right),\bar{f}(t,\bar{x})=\left(\begin{matrix}f_{1}(t,x_{1},x_{2,}\dots,X_{n})\\f_{2}(t,x_{1},x_{2,}\dots,X_{n})\\\hdotsfor{1}\\f_{n}(t,x_{1},x_{2,}\dots,X_{n})\end{matrix}\right),\bar{x}_0=\left(\begin{matrix}x_{1}^{0}\\x_{2}^{0}\\\dots\\x_{n}^{0}\end{matrix}\right).$$Задавшись некоторым шагом $$h$$ и введя стандартные обозначения $$t_{i}=t_{0}+ih,x_{i}=x(t_{i}), \Delta x_{i}=x_{i+1}-x_{i}, i=1,2,\dots, n$$ получим формулы метода Рунге-Кутта для системы:
$$\left\{ \begin{aligned} \bar{x}_{i+1}=\bar{x}_i+\Delta \bar{x}_i,i=1,n\\ \Delta\bar{x}_{i}=\frac{h}{6}(\bar{K}_{1}^{i}+2\bar{K}_{2}^{i}+2\bar{K}_{3}^{i}+\bar{K}_{4}^{i})\\ \bar{K}_{1}^{i}=\bar{f}(t_{i},\bar{x}_{i})\\ \bar{K}_{2}^{i}=\bar{f}(t_{i}+\frac{h}{2},\bar{x}_{i}+\frac{h}{2}\bar{K}_{1}^{i})\\ \bar{K}_{3}^{i}=\bar{f}(t_{i}+\frac{h}{2},\bar{x}_{i}+\frac{h}{2}\bar{K}_{2}^{i})\\ \bar{K}_{4}^{i}=\bar{f}(t_{i}+h,\bar{x}_{i}+h\bar{K}_{3}^{i}) \end{aligned} \right.$$Наиболее часто используемыми в Octave функциями для решения дифференциальных уравнений являются:
Функции решают систему дифференциальных уравнений автоматически подбирая шаг для достижения необходимой точности. Входными параметрами этих функций являются:
Для определения параметров управления ходом решения дифференциальных уравнений используется функция odeset следующей структуры:
$$options = odeset('namepar_1',val_1, 'namepar_2',val_2, \dots, 'namepar_n',val_n);$$
Здесь
При решении дифференциальных уравнений необходимо определить следующие параметры:
Все функции возвращают:
Решим задачу 9.1 с использованием функций $$ode23, ode45$$. Текст программы с комментариями представлен в листинге 9.8.
% Точное решение системы.
function q= fi(x)
q=119/296-exp(6*x)+1/24*(52*x.^3+114*x.^2-30*x+39)-6*sin(x
)/37-cos(x)/37;
end
% Правая часть дифференциального уравнения.
function y=g(t, x)
y=6*x-13*t^3-22*t^2+17*t-11+sin(t);
end
% Определение параметров управления ходом решения уравнения.
% RelTol — относительная точность решения 1E-5,
% AbsTol — абсолютная точность решения 1E-5,
% InitialStep — начальное значение шага изменения переменной 0.025,
% MaxStep — максимальное значение шага изменения переменной 0.1.
par=odeset("RelTol", 1e-5, "AbsTol", 1e-5, ’InitialStep’
, 0.025, ’MaxStep’, 0.1);
% Решение дифференциального уравнения методом Рунге-Кутта 2–3 порядка.
[X23, Y23]= ode23 (@g, [0 0.25], 2, par);
% Определение параметров управления ходом решения уравнения.
% RelTol — относительная точность решения 1E-4,
% AbsTol — абсолютная точность решения 1E-4,
% InitialStep — начальное значение шага изменения переменной 0.005,
% MaxStep — максимальное значение шага изменения переменной 0.2.
par=odeset("RelTol", 1e-4, "AbsTol",1e-4, ’InitialStep’, 0.05, ’
MaxStep’, 0.2);
% Решение дифференциального уравнения методом Рунге-Кутта 4–5 порядка.
[X45, Y45]=ode45(@g, [0 0.25], 2, par);
% Точное решение
x1 = 0:0.05:0.25;
y1= fi(x1);
% График решения функцией ode23 и точного решения.
plot(x1, y1, ’-g;exact solution;’, X23, Y23, ’*b;ode23;’);
grid on;
figure();
% График решения функцией ode45 и точного решения.
plot(x1, y1, ’-g;exact solution;’, X45, Y45, ’*b;ode45;’);
grid on;
На рис. 9.5 представлено решение, найденное с помощью функции $$ode23$$ с точностью 1E-5 и точное решение. На рис. 9.6 представлено решение, найденное с помощью функции $$ode45$$ с точностью 1E-4 и точное решение.
Функции $$ode23$$ и $$ode45$$ позволяют найти решение с заданной точностью, однако, как и следовало ожидать, при использовании метода Рунге-Кутта более высокой точности шаг изменения переменной $$x$$ намного меньше.
Рассмотрим пример решения жёсткой системы дифференциальных уравнений. Напомним читателю определение жёсткой системы дифференциальных уравнений. Система дифференциальных уравнений $$n$$-го порядка
$$\frac{d{x}}{dt}={B}x$$называется жёсткой [2], если выполнены следующие условия:
(рис 9.5) Графики точного решения задачи 9.1 и решения, найденного с помощью функции ode23
(рис 9.6) Графики точного решения задачи 9.1 и решения, найденного с помощью функции ode45
Пример 9.2. Решить задачу Коши для жёсткой системы дифференциальных уравнений:
$$\left\{ \begin{aligned} \frac{dx}{dt}= \begin{pmatrix} 119.46 185.38 126.88 121.03\\ -10.395 -10.136 -3.636 8.577\\ -53.302 -85.932 -63.182 -54.211\\ -115.58 -181.75 -112.8 -199 \end{pmatrix} x,\\ {x}(0)=\begin{pmatrix}1\\1\\1\\1\end{pmatrix} \end{aligned} \right.$$Решение задачи с комментариями представлено в листинге 9.9, на рис. 9.7 можно увидеть график решения.
% Функция правой части жёсткой системы дифференциальных уравнений.
function dx=syst1(t, x)
B=[119.46 185.38 126.88 121.03; -10.395 -10.136 -3.636 8.577;
–53.302 –85.932 –63.182 –54.211;–115.58 –181.75 –112.8 –199];
dx=B-x;
end
% Определение параметров управления ходом решения жёсткой
% системы дифференциальных уравнений.
% RelTol — относительная точность решения 1E-8,
% AbsTol — абсолютная точность решения 1E-8,
% InitialStep — начальное значение шага изменения переменной 0.02,
% MaxStep — максимальное значение шага изменения переменной 0.1.
par=odeset("RelTol",1e-8, "AbsTol",1e-8, ’InitialStep’, 0.02, ’
MaxStep’, 0.1);
% Решение жёсткой системы дифференциальных уравнений.
[ A,B]= ode2r(@syst1, [0 5], [1; 1; 1; 1], par);
% Построение графика решения.
plot(A, B, ’-k’); grid on;
Этим примером мы заканчиваем краткое описание возможностей Octave для решения дифференциальных уравнений. Однако, следует помнить о следующем: решение реального дифференциального уравнения (а тем более системы) — достаточно сложная математическая задача. Для её решения недостаточно знания синтаксиса функций Octave, необходимо достаточно глубоко знать математические методы решения подобных задач. При решении дифференциальных уравнений необходимо определить метод решения и только потом пытаться использовать встроенные функции или писать свои. Авторы не случайно достаточно подробно напомнили читателю основные численные методы решения дифференциальных уравнений и систем. На наш взгляд без знания численных и аналитических методов решения дифференциальных уравнений, достаточно проблематично решить реальную задачу.
(рис 9.7) График решения задачи 9.2
Кроме того, следует помнить, что функциями $$ode23, ode45, ode2r, ode5r$$ возможности пакета не ограничиваются. Octave предоставляет достаточное количество функций для решения дифференциальных уравнений различного вида. Они подробно описаны в справке консольной версии
Множество функций для решения дифференциальных уравнений находится в пакете расширений odepkg. Краткое описание функций этого пакета на английском языке с некоторыми примерами приведено на странице http://octave.sourceforge.net/odepkg/overview.html.
Дифференциальным уравнением $$n$$-го порядка называется соотношение вида
$$H(t,x,x',x'',\dots,x^{(n)})=0.$$Решением дифференциального уравнения называется функция $$x(t)$$, которая обращает уравнение в тождество.
Системой дифференциальных уравнений $$n$$-го порядка называется система вида:
$$ \left\{ \begin{matrix} {x'}_1=f_1(t,x_1,x_2,\dots,x_n)\\ {x'}_2=f_2(t,x_1,x_2,\dots,x_n)\\ \hdotsfor{1}\\ {x'}_n=f_n(t,x_1,x_2,\dots,x_n) \end{matrix} \right.$$Системой линейных дифференциальных уравнений называется система вида:
$$\label{gl9:ref2} \left\{ \begin{matrix} \displaystyle {x'}_1=\sum _{j=1}^na_{1j}x_j+b_1\\ \displaystyle {x'}_2=\sum_{j=1}^na_{2j}x_j+b_2\\ \hdotsfor{1}\\ \displaystyle {x'}_n=\sum _{j=1}^na_{nj}x_j+b_n \end{matrix} \right.$$Решением системы называется вектор $$x(t)= \begin{pmatrix} x_1(t)\\x_2(t)\\\dots\\x_n(t) \end{pmatrix}$$, который обращает уравнения систем (9.2), (9.3) в тождества.
Каждое дифференциальное уравнение, так же, как и система, имеет бесконечное множество решений, которые отличаются друг от друга константами. Для однозначного определения решения необходимо определить дополнительные начальные или граничные условия. Количество таких условий должно совпадать с порядком дифференциального уравнения или системы. В зависимости от вида дополнительных условий в дифференциальных уравнениях различают:
Различают точные (аналитические) и приближённые (численные) методы решения дифференциальных уравнений. Большое количество уравнений может быть решено точно. Однако есть уравнения, а особенно системы уравнений, для которых нельзя записать точное решение. Но даже для уравнений с известным аналитическим решением очень часто необходимо вычислить числовое значение при определённых исходных данных. Поэтому широкое распространение получили численные методы решения обыкновенных дифференциальных уравнений.
(рис 9.1) Интегральная кривая, проходящая через точку M_0(_t0, x_0)
Численные методы решения дифференциального уравнения первого порядка будем рассматривать для следующей задачи Коши. Найти решение дифференциального уравнения
$$x'=f(x,t)$$удовлетворяющее начальному условию
$$x(t_0)=x_0$$иными словами, требуется найти интегральную кривую $$x = x(t)$$, проходящую через заданную точку $$M_0(t_0,x_0)$$ (рис. 9.1).
Для дифференциального уравнения $$n$$-го порядка
$$x^{(n)}=f(t,x,x^{'},x^{''},\dots,x^{(n-1)})$$задача Коши состоит в нахождении решения x = x(t), удовлетворяющего уравнению (9.6) и начальным условиям
$$x(t_0)=x_0,{x}^{'}(t_0)=x_0^{'},\dots,x^{(n-1)}(t_0)=x_0^{(n-1)}$$Рассмотрим основные численные методы решения задачи Коши.
При решении задачи Коши (9.4), (9.5) на интервале $$[t_0,t_n]$$, выбрав достаточно малый шаг $$h$$, построим систему равноотстоящих точек
$$t_i=t_0+ih,\quad i=0,1,\dots, n,\quad h=\frac{t_n-t_0}{n}$$Для вычисления значения функции в точке $$t_1$$ разложим функцию $$x = x(t)$$ в окрестности точки $$t_0$$ в ряд Тейлора [2]
$$x(t_1)=x(t_0+h)=x(t_0)+x'(t_0)h+x''(t_0)\frac{h^2}{2}+\dots$$При достаточном малом значении $$h$$ членами выше второго порядка можно пренебречь и с учётом $$x'(t_0)=f(x_{0,}t_0)$$ получим следующую формулу для вычисления приближённого значения функции $$x(t)$$ в точке $$t_1$$
$$x_1=x_0+hf(x_0,t_0)$$Рассматривая найденную точку $$(x_1,t_1)$$, как начальное условие задачи Коши запишем аналогичную формулу для нахождения значения функции $$x(t)$$ в точке $$t_2$$
$$x_2=x_1+hf(x_1,t_1).$$Повторяя этот процесс, сформируем последовательность значений $$x_i$$ в точках $$t_i$$ по формуле
$$x_{i+1}=x_i+hf(x_i,t_i),\quad i=0,1,\dots,n.$$Процесс нахождения значений функции $$x_i$$ в узловых точках $$t_i$$ по формуле (9.11) называется методом Эйлера. Геометрическая интерпретация метода Эйлера состоит в замене интегральной кривой $$x(t)$$ ломаной $$M_0,M_1,M_2,\dots,M_n$$ с вершинами $$M_i(x_i,y_i)$$. Звенья ломанной Эйлера $$M_iM_{i+1}$$ в каждой вершине $$M_i$$ имеют направление $$y_i=f(t_i,x_i)$$, совпадающее с направлением интегральной кривой $$x(t)$$ уравнения (9.4), проходящей через точку $$M_i$$ (рис. 9.2). Последовательность ломанных Эйлера при $$h\to 0$$ на достаточно малом отрезке $$[x_i,x_i+h]$$ стремится к искомой интегральной кривой.
(рис 9.2) Геометрическая интерпретация метода Эйлера
На каждом шаге решение $$x(t)$$ определяется с ошибкой за счёт отбрасывания членов ряда Тейлора выше первой степени, что в случае быстро меняющейся функции $$f (t, x)$$ может привести к быстрому накапливанию ошибки. В методе Эйлера следует выбирать достаточной малый шаг $$h$$.
Более точным методом решения задачи (9.4)–(9.5) является модифицированный метод Эйлера, при котором сначала вычисляют промежуточные значения [2]
$$t_p=t_i+\frac{h}{2},\ x_p=x_i+\frac{h}{2}f(x_i,t_i)$$после чего находят значение $$x_{i+1}$$ по формуле
$$x_{i+1}=x_i+hf(x_p,t_p),\quad i=0,1,\dots, n-1$$Рассмотренные выше методы Эйлера (как обычный, так и модифицированный) являются частными случаями явного метода Рунге-Кутта $$k$$-го порядка. В общем случае формула вычисления очередного приближения методом Рунге-Кутта имеет вид [2]:
$$x_{i+1}=x_i+h\varphi (t_i,x_i,h),\quad i=0,1,\dots, n-1$$Функция $$\varphi (t,x,h)$$ приближает отрезок ряда Тейлора до $$k$$-го порядка и не содержит частных производных $$f (t, x)$$ [2].
Метод Эйлера является методом Рунге-Кутта первого порядка (k = 1) и получается при $$\varphi (t,x,h) = f (t,x)$$.
Семейство методов Рунге-Кутта второго порядка имеет вид [2]
$$x_{i+1}=x_i+h\Biggl((1-\alpha )f(t_i,x_i)+\alpha f\left(t_i+ \frac{h}{2\alpha },x_i+\frac{h}{2\alpha}f(t_i,x_i)\right)\Biggr),\\ i=0,1,\dots, n-1$$Два наиболее известных среди методов Рунге-Кутта второго порядка [2] — это метод Хойна $$\alpha=\frac{1}{2}$$ и модифицированный метод Эйлера $$\alpha=1$$.
Подставив $$\alpha=\frac{1}{2}$$в формулу (9.15), получаем расчётную формулу метода Хойна [2]:
$$x_{i+1}=x_i+\frac{h}{2}\left(f(t_i,x_i)+f(t_i+h,x_i+hf(t_i,x_i))\right),\quad i=0,1,\dots, n-1$$Подставив $$\alpha=1$$ в формулу (9.15), получаем расчётную формулу уже рассмотренного выше модифицированного метода Эйлера
$$x_{i+1}=x_i+h\Biggl(f\left(t_i+\frac{h}{2},x_i+\frac{h}{2}f(t_i,x_i)\right)\Biggr),\quad i=0,1,\dots, n-1$$Наиболее известным является метод Рунге-Кутта четвёртого порядка, расчётные формулы которого можно записать в виде [2]:
$$\left\{ \begin{aligned} x_{i+1} =x_i+\Delta x_i,\quad i=1,\dots, n\\ \Delta x_i =\frac{h}{6}(K_1^i+2K_2^i+2K_3^i+K_4^i)\\ K_1^i =f(t_i,x_i)\\ K_2^i =f(t_i+\frac{h}{2},x_i+\frac{h}{2}K_1^i)\\ K_3^i =f(t_i+\frac{h}{2},x_i+\frac{h}{2}K_2^i)\\ K_4^i =f(t_i+h,x_i+hK_3^i) \end{aligned} \right.$$Одной из модификаций метода Рунге-Кутта является метод Кутта-Мерсона (или пятиэтапный метод Рунге-Кутта четвёртого порядка), который состоит в следующем [2].
Рассмотренные методы Рунге-Кутта относятся к классу одношаговых методов, в которых для вычисления значения в очередной точке $$x_{k+1}$$ нужно знать значение в предыдущей точке $$x_k$$.
Ещё один класс методов решения задачи Коши — многошаговые методы, в которых используются точки $$x_{k-3}, x_{k-2}, x_{k-1}, x_{k}$$ для вычисления $$x_{k+1}$$. В многошаговых методах первые четыре начальные точки $$(t_{0},x_{0}),(t_{1},x_{1}),(t_{2},x_{2}),(t_{3},x_{3})$$должны быть получены заранее любым из одношаговых методов (метод Эйлера, Рунге-Кутта и т.д.). Наиболее известными многошаговыми методами являются методы прогноза-коррекции Адамса и Милна.
Рассмотрим решение уравнения (9.1)–(9.2) на интервале $$[t_{i},t_{i+1}]$$. Будем считать, что решение в точках $$t_{0},t_{1},t_{2},\dots,t_{i}$$ уже найдено, и значения в этих точках будем использовать для нахождения значения $$x(t_{i+1})$$.
Проинтегрируем уравнение (9.1) на интервале $$[t_{i},t_{i+1}]$$ и получим соотношение [2]
$$x(t_{i+1})=x(t_{i})+\int _{t_{i}}^{t_{i+1}}f(t,x(t))\,dt$$При вычислении интеграла, входящего в (9.20), вместо функции $$f (t, x(t))$$ будем использовать интерполяционный полином Лагранжа,построенный по точкам $$(t_{i-3},x_{i-3}), (t_{i-2},x_{i-2}), (t_{i-1},x_{i-1}),(t_{i},x_{i})$$. Подставив полином Лагранжа в (9.20), получаем первое приближение (прогноз) $$\tilde{x}_{i+1}$$ для значения функции в точке $$t_{i+1}$$
$$\tilde {x}_{i+1}=x_{i}+\frac{h}{24}(-9f(t_{i-3},x_{i-3})+37f(t_{i-2},x_{i-2})-\\-59f(t_{i-1},x_{i-1})+55f(t_{i},x_{i}))$$Как только $$\tilde{x}_{i+1}$$ вычислено, его можно использовать. Следующий полином Лагранжа для функции f (t, x(t)) построим по точкам $$(t_{i-2},x_{i-2}),(t_{i-1},x_{i-1}),(t_{i},x_{i})$$ и новой точке $$(t_{i+1},\tilde{x}_{i+1})$$, после чего подставляем его в (9.20) и получаем второе приближение (корректор)
$$x_{i+1}=x_{i}+\frac{h}{24}(f(t_{i-2},x_{i-2})-5f(t_{i-1},x_{i-1})+\\+19f(t_{i},x_{i})+9f(t_{i+1},\tilde{x}_{i+1}))$$Таким образом, для вычисления значения $$x(t_{i+1})$$ методом Адамса необходимо последовательно применять формулы (9.21), (9.22) [2], а первые четыре точки можно получить методом Рунге-Кутта.
Отличие метода Милна от метода Адамса состоит в использовании в качест ве интерполяционного полинома Ньютона.
Подставив в (9.20) вместо функции $$f (t, x(t))$$ интерполяционный полином Ньютона, построенный по точкам $$(t_{k-3},x_{k-3}),(t_{k-2},x_{k-2}),(t_{k-1},x_{k-1}),(t_{k},x_{k})$$ получаем первое приближение — прогноз Милна $$\tilde {{x_{k+1}}}$$ для значения функции в точке $$t_{k+1}$$[2]
$$\tilde {x}_{k+1}=x_{k-3}+\frac{4h}{3}(2f(t_{k-2},x_{k-2})-f(t_{k-1},x_{k-1})+2f(t_{k},x_{k}))$$Следующий полином Ньютона для функции $$f (t, x(t))$$ построим по точкам $$(t_{k-2},x_{k-2}),(t_{k-1},x_{k-1}),(t_{k},x_{k})$$ и новой точке $$(t_{k+1},\tilde{x}_{k+1})$$, после чего подставляем его в (9.20) и получаем второе приближение — корректор Милна [2]
$$x_{k+1}=x_{k-1}+\frac{h}{3}(f(t_{k-1},x_{k-1})+4f(t_{k},x_{k})+f(t_{k+1},\tilde{x}_{k+1}))$$В методе Милна для вычисления значения $$x(t_{k+1})$$ необходимо последовательно применять формулы (9.23), (9.24), а первые четыре точки можно получить методом Рунге-Кутта.
Существует модифицированный метод Милна. В нём сначала вычисляется первое приближение по формуле (9.23), затем вычисляется управляющий параметр [2]
$$m_{k+1}=\tilde {x}_{k+1}+\frac{28}{29}(x_{k}-\tilde {x}_{k})$$После чего вычисляется значение второго приближения — корректор Милна по формуле
$$x_{k+1}=x_{k-1}+\frac{h}{3}(f(t_{k-1},x_{k-1})+4f(t_{k},x_{k})+f(t_{k+1},m_{k+1}))$$В модифицированном методе Милна первые четыре точки можно получить методом Рунге-Кутта, а для вычисления значения $$x(t_{k+1})$$ необходимо последовательно применять формулы (9.23), (9.25), (9.26).
Ниже приведены тексты функций, реализующие рассмотренные в п. 9.2 численные методы решения дифференциальных уравнений.
function[x, t]= eiler(a, b, n, x0) % Функция решения задачи Коши x'(t) = g(t, x) x(a) = x0 методом Эйлера. % n — количество отрезков, на которые разбивается интервал [a, b]. h=(b-a)/n; % Вычисление шага h. x(1)=x0; for i =1:n+1 % Формирование системы равноотстоящих узлов ti t(i)=a+(i-1)*h; end % Вычисление значений функции в узловых точках по формуле (9.11) for i =2:n+1 x(i)=x(i-1)+h*g(t(i-1),x(i-1)); end end
function[x, t]= eiler_m(a, b, n, x0) % Функция решения задачи Коши x'(t) = g(t, x)x(a) = x0 % модифицированным методом Эйлера. % n — количество отрезков, на которые разбивается интервал [a, b]. h=(b-a)/n;% Вычисление шага h. x(1)=x0; for i =1:n+1 % Формирование системы равноотстоящих узлов ti t(i)=a+(i-1)*h; end % Вычисление значений функции по формулам (9.13) — (9.14). for i =2:n+1 tp=t(i-1)+h/2; xp=x(i-1)+h/2*g(t(i-1), x(i-1)); x(i)=x(i-1)+h*g(tp, xp); end end
function[x, t]= runge_kut(a, b, n, x0) % Функция решения задачи Коши x'(t) = g(t, x) x(a) = x0 методом Рунге-Кутта % n — количество отрезков, на которые разбивается интервал [a, b]. h=(b-a)/n;% Вычисление шага h. x(1)=x0; for i =1:n+1 % Формирование системы равноотстоящих узлов ti t(i)=a+(i-1)*h; end % Вычисление значений функции формуле (9.16). for i =2:n+1 % Расчёт коэффициентов K1, K2, K3, K4 K1=g(t(i-1), x(i-1)); K2=g(t(i-1)+h/2, x(i-1)+h/2*K1); K3=g(t(i-1)+h/2, x(i-1)+h/2*K2); K4=g(t(i-1)+h, x(i-1)+h-K3); % Расчёт приращения delt delt=h/6*(K1+2*K2+2*K3+K4); x(i)=x(i-1)+delt; end end
function[x, t, j]=kut_merson(a, b, n, eps, x0) % Функция решения задачи Коши x'(t) = g(t, x)x(a) = x0 методом % Кутта-Мерсона на интервале интегрирования [a, b] c точностью eps, % n — количество отрезков, на которые вначале разбивается интервал [a, b]. h=(b-a)/n; % Вычисление шага h. x(1)=x0; t(1)=a; i=2; while(t(i-1)+h)<=b R=3*eps; while R>eps % Расчёт коэффициентов K1, K2, K3, K4, K5. K1=g(t(i-1), x(i-1)); K2=g(t(i-1)+h/3, x(i-1)+h/3*K1); K3=g(t(i-1)+h/3, x(i-1)+h/6*K1+h/6*K2); K4=g(t(i-1)+h/2, x(i-1)+h/8*K1+3*h/8*K2); K5=g(t(i-1)+h, x(i-1)+h/2*K1-3*h/2*K3+2*h*K4); % Вычисление сравниваемых значений x(i+1) X1=x(i-1)+h/2*(K1-3*K3+4*K4); X2=x(i-1)+h/6*(K1+4*K4+K5); % Вычисление оценочного коэффициента R. R=0.2*abs(X1-X2); % Сравнение оценочного коэффициента R с точностью eps. if R>eps h=h/2; else % Если оценочный коэффициент R меньше точности eps, % то происходит формирование очередной найденной точки и % переход к следующему этапу по i. t(i)=t(i-1)+h; x(i)=X2; i=i+1; % Если оценочный коэффициент R меньше eps/64, % то можно попробовать увеличить шаг. if R<= eps/64 if (t(i-1)+2*h)<=b h=2*h; end end end end end % В переменной j возвращается количество элементов в массивах x и t j=i-1 end
function[x, t]=adams(a, b, n, x0) % Функция решения задачи Коши x'(t) = g(t, x) x(a) = x0 методом Адамса % n — количество отрезков, на которые разбивается интервал [a, b]. h=(b-a)/n; % Вычисление шага h x(1)=x0; for i=1:n+1 % Формирование системы равноотстоящих узлов ti. t(i)=a+(i-1)*h; end % Вычисление значений функции в трёх узловых точках по формуле(9.16) for i =2:4 K1=g(t(i-1), x(i-1)); K2=g(t(i-1)+h/2, x(i-1)+h/2*K1); K3=g(t(i-1)+h/2, x(i-1)+h/2*K2); K4=g(t(i-1)+h, x(i-1)+h*K3); % Расчёт приращения delt delt=h/6*(K1+2*K2+2*K3+K4); x(i)=x(i-1)+delt; end for i =4:n % Вычисление значений в остальных точках методом Адамса % Вычисление прогноза xp=x(i)+h/24*(-9*g(t(i-3), x(i-3))+37*g(t(i-2), x(i-2)) -59*g(t(i-1), x(i-1))+55*g(t(i), x(i))); % Вычисление корректора x(i+1)=x(i)+h/24*(g(t(i-2), x(i-2))-5*g(t(i-1), x(i-1)) +19*g(t(i), x(i))+9*g(t(i+1), xp)); end end
function[x, t]= miln(a, b, n, x0) % Функция решения задачи Коши x'(t) = g(t, x) x(a) = x0 методом Милна % n — количество отрезков, на которые разбивается интервал [a, b]. h=(b-a)/n; % Вычисление шага h x(1)=x0; xp(1)=x(1); for i =1:n+1 % Формирование системы равноотстоящих узлов ti t(i)=a+(i-1)*h; end % Вычисление значений функции в трёх узловых точках по формуле (9.16) for i =2:4 K1=g(t(i-1), x(i-1)); K2=g(t(i-1)+h/2, x(i-1)+h/2*K1); K3=g(t(i-1)+h/2, x(i-1)+h/2*K2); K4=g(t(i-1)+h, x(i-1)+h*K3); % Расчёт приращения delt delt=h/6*(K1+2*K2+2*K3+K4); x(i)=x(i-1)+delt; xp(i)=x(i); end for i =4:n % Вычисление значений в остальных точках методом Адамса % Вычисление прогноза xp(i+1)=x(i-3)+4*h/3*(2*g(t(i-2), x(i-2))-g(t(i-1), x(i -1))+g(t(i), x(i))); % Вычисление управляющего параметра m=xp(i+1)+28/29*(x(i)-xp(i)); % Вычисление корректора. x(i+1)=x(i-1)+h/3*(g(t(i-1), x(i-1))+4*g(t(i), x(i))+g(t (i+1), m)); end end
Написать функцию модифицированного метода Милна авторы предоставляют читателю.
Рассмотрим использование приведённых выше функций на примере решения следующей задачи Коши.
Пример 9.1. Решить задачу Коши
$$\left\{ \begin{aligned} y'(x)=6y-13x^{3}-22x^{2}+17x-11+\sin (x);\\ y(0)=2. \end{aligned}$$Известно точное решение задачи 9.1:
$$y(x)=\frac{119}{296}e^{6x}+\frac{1}{24}(52x^{3}+114x^{2}-30x+39)-\frac{6\sin (x)}{37}-\frac{\cos (x)}{37}.$$В листинге 9.7 представлено решение уравнения методами:
% Точное решение function q= fi(x) q=119/296*exp(6*x)+1/24*(52*x.^3+114*x.^2-30*x+39)-6*sin(x )/37-cos(x)/37; end % Правая часть дифференциального уравнения. function y=g(t, x) y=6-x-13*t^3-22*t^2+17*t-11+sin(t); end % Функция решения задачи Коши модифицированным методом Эйлера. function[x, t]= eiler_m(a, b, n, x0) h=(b-a)/n; x(1)=x0; for i =1:n+1 t(i)=a+(i-1)*h; end for i =2:n+1 tp=t(i-1)+h/2; xp=x(i-1)+h/2*g(t(i-1), x(i-1)); x(i)=x(i-1)+h*g(tp, xp); end end % Функция решения задачи Коши методом Рунге-Кутта. function[x, t]=runge_kut(a, b, n, x0) h=(b-a)/n; x(1)=x0; for i =1:n+1 t(i)=a+(i-1)*h; end for i =2:n+1 K1=g(t(i-1), x(i-1)); K2=g(t(i-1)+h/2, x(i-1)+h/2*K1); K3=g(t(i-1)+h/2, x(i-1)+h/2*K2); K4=g(t(i-1)+h, x(i-1)+h*K3); delt=h/6*(K1+2*K2+2*K3+K4); x(i)=x(i-1)+delt; end end % Функция решения задачи Коши методом Кутта-Мерсона. function[x, t,j ]=kut_merson(a, b, n, eps, x0) h=(b-a)/n; x(1)=x0; t(1)=a; i=2; while(t(i-1)+h)<=b R=3*eps; while R>eps K1=g(t(i-1), x(i-1)); K2=g(t(i-1)+h/3, x(i-1)+h/3*K1); K3=g(t(i-1)+h/3, x(i-1)+h/6*K1+h/6*K2); K4=g(t(i-1)+h/2, x(i-1)+h/8*K1+3*h/8*K2); K5=g(t(i-1)+h, x(i-1)+h/2*K1-3*h/2*K3+2*h*K4); X1=x(i-1)+h/2*(K1-3*K3+4*K4); X2=x(i-1)+h/6*(K1+4*K4+K5); R=0.2*abs(X1-X2); if R>eps h=h/2; else t(i)=t(i-1)+h; x(i)=X2; i=i+1; if R<= eps/64 if (t(i-1)+2*h)<=b h=2*h; end end end end end j=i-1 end % Функция решения задачи Коши методом Милна. function[x, t]= miln(a, b, n, x0) h=(b-a)/n; x(1)=x0; xp(1)=x(1); for i =1:n+1 t(i)=a+(i-1)*h; end for i =2:4 K1=g(t(i-1), x(i-1)); K2=g(t(i-1)+h/2, x(i-1)+h/2*K1); K3=g(t(i-1)+h/2, x(i-1)+h/2*K2); K4=g(t(i-1)+h, x(i-1)+h*K3); delt=h/6*(K1+2*K2+2*K3+K4); x(i)=x(i-1)+delt; xp(i)=x(i); end for i =4:n xp(i+1)=x(i-3)+4*h/3*(2-g(t(i-2), x(i-2))-g(t(i-1), x(i -1))+g(t(i), x(i))); m=xp(i+1)+28/29*(x(i)-xp(i)); x(i+1)=x(i-1)+h/3*(g(t(i-1), x(i-1))+4*g(t(i), x(i))+g(t (i+1),m)); end end % Функция решения задачи Коши методом Адамса. function[x, t]=adams(a, b, n, x0) h=(b-a)/n; x(1)=x0; for i =1:n+1 t(i)=a+(i-1)*h; end for i =2:4 K1=g(t(i-1), x(i-1)); K2=g(t(i-1)+h/2, x(i-1)+h/2*K1); K3=g(t(i-1)+h/2, x(i-1)+h/2*K2); K4=g(t(i-1)+h, x(i-1)+h* K3); delt=h/6*(K1+2*K2+2*K3+K4); x(i)=x(i-1)+delt; end for i =4:n xp=x (i)+h/24*(-9*g(t(i-3), x(i-3))+37*g(t(i-2), x(i-2)) -59*g(t(i-1), x(i-1)) +55*g(t(i), x(i))); x(i+1)=x(i)+h/24*(g(t(i-2), x(i-2))-5*g(t(i-1), x(i-1)) +19*g(t(i), x(i))+9*g(t(i+1), xp)); end end % Решение дифференциального уравнения модифицированным методом Эйлера. [YE_M,XE_M]= eiler_m(0, 1, 10, 2); % Решение дифференциального уравнения методом Рунге-Кутта. [YR,XR]= runge_kut(0, 1, 10, 2); % Решение дифференциального уравнения методом Кутта-Мерсона. [YKM,XKM,KM]=kut_merson(0, 1, 5, 0.001, 2); % Решение дифференциального уравнения методом Адамса. [YA,XA]=adams(0, 1, 10, 2); % Решение дифференциального уравнения методом Милна. [YM,XM]= miln(0, 1, 10, 2); % Точное решение. x1 = 0:0.05:1; y1= fi(x1); % Построение графиков. plot(x1, y1, ’-g;exact solution;’,XE_M,YE_M, ’*b;eiler;’,XR,YR, ’ ob;runge-kutt;’,XA,YA, ’^b;adams;’,XM,YM, ’>b;miln;’); figure(); plot(x1, y1, ’-g;exact solution;’,XKM,YKM, ’<b;kut -merson;’); grid on;
(рис 9.3) Графики решения модифицированным методом Эйлера, методами Рунге-Кутта, Адамса, Милна и точного решения
На рис. 9.3–9.4 приведены графики решения задачи модифицированным методом Эйлера, методами Рунге-Кутта, Кутта-Мерсона, Адамса, Милна и точного решения. При обращении к функции $$kut_merson$$ в качестве $$n$$ передавалось число 5.
Функция выбирала оптимальный шаг на каждом из отрезков. Как видно из рисунка, шаг то увеличивается, то уменьшается. При решении уравнения методом Кутта-Мерсона невозможно гарантировать вычисление значения в заданных точках интервала. Однако после получения решения методом Кутта-Мерсона значение в любой точки можно вычислить, интерполируя полученную зависимость.
При решении данной задачи наиболее точными оказались методы Адамса, Рунге-Кутта и Кутта-Мерсона.
(рис 9.4) Графики решения методом Кутта-Мерсона и точного решения
Все рассмотренные методы решения дифференциальных уравнений применимы и для систем дифференциальных уравнений. Рассмотрим на примере метода Рунге-Кутта, как рассмотренные методы можно обобщить для систем.
Пусть дана система дифференциальных уравнений в матричном виде:
$$\left\{\begin{aligned}\frac{d\bar{x}}{dt}amp;=\bar{f}(t,\bar{x})\\ \bar{x}(t_{0})amp;=\bar{x}_{0} \quad(\text{начальное условие}), \end{aligned}$$ $$$\left\{\begin{aligned}\frac{d\bar{x}}{dt}amp;=\bar{f}(t,\bar{x})\\ \bar{x}(t_{0})amp;=\bar{x}_{0} \quad(\text{начальное условие}), \end{aligned}$\\ \mbox{где}\bar{x}=\left(\begin{matrix}x_{1}(t)\\x_{2}(t)\\\dots\\x_{n}(t)\end{matrix}\right),\bar{f}(t,\bar{x})=\left(\begin{matrix}f_{1}(t,x_{1},x_{2,}\dots,X_{n})\\f_{2}(t,x_{1},x_{2,}\dots,X_{n})\\\hdotsfor{1}\\f_{n}(t,x_{1},x_{2,}\dots,X_{n})\end{matrix}\right),\bar{x}_0=\left(\begin{matrix}x_{1}^{0}\\x_{2}^{0}\\\dots\\x_{n}^{0}\end{matrix}\right).$$Задавшись некоторым шагом $$h$$ и введя стандартные обозначения $$t_{i}=t_{0}+ih,x_{i}=x(t_{i}), \Delta x_{i}=x_{i+1}-x_{i}, i=1,2,\dots, n$$ получим формулы метода Рунге-Кутта для системы:
$$\left\{ \begin{aligned} \bar{x}_{i+1}=\bar{x}_i+\Delta \bar{x}_i,i=1,n\\ \Delta\bar{x}_{i}=\frac{h}{6}(\bar{K}_{1}^{i}+2\bar{K}_{2}^{i}+2\bar{K}_{3}^{i}+\bar{K}_{4}^{i})\\ \bar{K}_{1}^{i}=\bar{f}(t_{i},\bar{x}_{i})\\ \bar{K}_{2}^{i}=\bar{f}(t_{i}+\frac{h}{2},\bar{x}_{i}+\frac{h}{2}\bar{K}_{1}^{i})\\ \bar{K}_{3}^{i}=\bar{f}(t_{i}+\frac{h}{2},\bar{x}_{i}+\frac{h}{2}\bar{K}_{2}^{i})\\ \bar{K}_{4}^{i}=\bar{f}(t_{i}+h,\bar{x}_{i}+h\bar{K}_{3}^{i}) \end{aligned} \right.$$Наиболее часто используемыми в Octave функциями для решения дифференциальных уравнений являются:
Функции решают систему дифференциальных уравнений автоматически подбирая шаг для достижения необходимой точности. Входными параметрами этих функций являются:
Для определения параметров управления ходом решения дифференциальных уравнений используется функция odeset следующей структуры:
$$options = odeset('namepar_1',val_1, 'namepar_2',val_2, \dots, 'namepar_n',val_n);$$
Здесь
При решении дифференциальных уравнений необходимо определить следующие параметры:
Все функции возвращают:
Решим задачу 9.1 с использованием функций $$ode23, ode45$$. Текст программы с комментариями представлен в листинге 9.8.
% Точное решение системы.
function q= fi(x)
q=119/296-exp(6*x)+1/24*(52*x.^3+114*x.^2-30*x+39)-6*sin(x
)/37-cos(x)/37;
end
% Правая часть дифференциального уравнения.
function y=g(t, x)
y=6*x-13*t^3-22*t^2+17*t-11+sin(t);
end
% Определение параметров управления ходом решения уравнения.
% RelTol — относительная точность решения 1E-5,
% AbsTol — абсолютная точность решения 1E-5,
% InitialStep — начальное значение шага изменения переменной 0.025,
% MaxStep — максимальное значение шага изменения переменной 0.1.
par=odeset("RelTol", 1e-5, "AbsTol", 1e-5, ’InitialStep’
, 0.025, ’MaxStep’, 0.1);
% Решение дифференциального уравнения методом Рунге-Кутта 2–3 порядка.
[X23, Y23]= ode23 (@g, [0 0.25], 2, par);
% Определение параметров управления ходом решения уравнения.
% RelTol — относительная точность решения 1E-4,
% AbsTol — абсолютная точность решения 1E-4,
% InitialStep — начальное значение шага изменения переменной 0.005,
% MaxStep — максимальное значение шага изменения переменной 0.2.
par=odeset("RelTol", 1e-4, "AbsTol",1e-4, ’InitialStep’, 0.05, ’
MaxStep’, 0.2);
% Решение дифференциального уравнения методом Рунге-Кутта 4–5 порядка.
[X45, Y45]=ode45(@g, [0 0.25], 2, par);
% Точное решение
x1 = 0:0.05:0.25;
y1= fi(x1);
% График решения функцией ode23 и точного решения.
plot(x1, y1, ’-g;exact solution;’, X23, Y23, ’*b;ode23;’);
grid on;
figure();
% График решения функцией ode45 и точного решения.
plot(x1, y1, ’-g;exact solution;’, X45, Y45, ’*b;ode45;’);
grid on;
На рис. 9.5 представлено решение, найденное с помощью функции $$ode23$$ с точностью 1E-5 и точное решение. На рис. 9.6 представлено решение, найденное с помощью функции $$ode45$$ с точностью 1E-4 и точное решение.
Функции $$ode23$$ и $$ode45$$ позволяют найти решение с заданной точностью, однако, как и следовало ожидать, при использовании метода Рунге-Кутта более высокой точности шаг изменения переменной $$x$$ намного меньше.
Рассмотрим пример решения жёсткой системы дифференциальных уравнений. Напомним читателю определение жёсткой системы дифференциальных уравнений. Система дифференциальных уравнений $$n$$-го порядка
$$\frac{d{x}}{dt}={B}x$$называется жёсткой [2], если выполнены следующие условия:
(рис 9.5) Графики точного решения задачи 9.1 и решения, найденного с помощью функции ode23
(рис 9.6) Графики точного решения задачи 9.1 и решения, найденного с помощью функции ode45
Пример 9.2. Решить задачу Коши для жёсткой системы дифференциальных уравнений:
$$\left\{ \begin{aligned} \frac{dx}{dt}= \begin{pmatrix} 119.46 185.38 126.88 121.03\\ -10.395 -10.136 -3.636 8.577\\ -53.302 -85.932 -63.182 -54.211\\ -115.58 -181.75 -112.8 -199 \end{pmatrix} x,\\ {x}(0)=\begin{pmatrix}1\\1\\1\\1\end{pmatrix} \end{aligned} \right.$$Решение задачи с комментариями представлено в листинге 9.9, на рис. 9.7 можно увидеть график решения.
% Функция правой части жёсткой системы дифференциальных уравнений.
function dx=syst1(t, x)
B=[119.46 185.38 126.88 121.03; -10.395 -10.136 -3.636 8.577;
–53.302 –85.932 –63.182 –54.211;–115.58 –181.75 –112.8 –199];
dx=B-x;
end
% Определение параметров управления ходом решения жёсткой
% системы дифференциальных уравнений.
% RelTol — относительная точность решения 1E-8,
% AbsTol — абсолютная точность решения 1E-8,
% InitialStep — начальное значение шага изменения переменной 0.02,
% MaxStep — максимальное значение шага изменения переменной 0.1.
par=odeset("RelTol",1e-8, "AbsTol",1e-8, ’InitialStep’, 0.02, ’
MaxStep’, 0.1);
% Решение жёсткой системы дифференциальных уравнений.
[ A,B]= ode2r(@syst1, [0 5], [1; 1; 1; 1], par);
% Построение графика решения.
plot(A, B, ’-k’); grid on;
Этим примером мы заканчиваем краткое описание возможностей Octave для решения дифференциальных уравнений. Однако, следует помнить о следующем: решение реального дифференциального уравнения (а тем более системы) — достаточно сложная математическая задача. Для её решения недостаточно знания синтаксиса функций Octave, необходимо достаточно глубоко знать математические методы решения подобных задач. При решении дифференциальных уравнений необходимо определить метод решения и только потом пытаться использовать встроенные функции или писать свои. Авторы не случайно достаточно подробно напомнили читателю основные численные методы решения дифференциальных уравнений и систем. На наш взгляд без знания численных и аналитических методов решения дифференциальных уравнений, достаточно проблематично решить реальную задачу.
(рис 9.7) График решения задачи 9.2
Кроме того, следует помнить, что функциями $$ode23, ode45, ode2r, ode5r$$ возможности пакета не ограничиваются. Octave предоставляет достаточное количество функций для решения дифференциальных уравнений различного вида. Они подробно описаны в справке консольной версии
Множество функций для решения дифференциальных уравнений находится в пакете расширений odepkg. Краткое описание функций этого пакета на английском языке с некоторыми примерами приведено на странице http://octave.sourceforge.net/odepkg/overview.html.
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.