3.3: Метод Рунге-Кутта
- Page ID
- 62131
Загалом, якщо будь-яке\(k\) додатне ціле число і\(f\) задовольняє відповідні припущення, існують числові методи з локальною похибкою усічення\(O(h^{k+1})\) для розв'язання задачі початкового значення
\[\label{eq:3.3.1} y'=f(x,y),\quad y(x_0)=y_0.\]
Більш того, можна показати, що метод з локальною помилкою усічення\(O(h^{k+1})\) має глобальну помилку усічення\(O(h^k)\). У розділах 3.1 і 3.2 ми вивчали чисельні методи, де\(k=1\) і\(k=2\). Пропустимо методи, для яких\(k=3\) і перейдемо до методу Рунге - Кутта, найбільш широко використовуваному методу, для якого\(k=4\). Величина локальної похибки усічення визначається п'ятою похідною\(y^{(5)}\) розв'язку задачі початкового значення. Тому локальна помилка усічення буде більшою там, де\(|y^{(5)}|\) велика, або менша, де\(|y^{(5)}|\) мала. Метод Рунге-Кутта обчислює наближені значення\(y_1\)\(y_2\),,...,\(y_n\) розв'язку Рівняння\ ref {eq:3.3.1} at\(x_0\)\(x_0+h\),,...\(x_0+nh\) наступним чином: Задано\(y_i\), обчислити
\[\begin{align*} k_{1i}&=f(x_i,y_i),\\ k_{2i}&=f \left(x_i+{h\over2},y_i+{h\over2}k_{1i}\right),\\ k_{3i}&=f\left(x_i+{h\over2},y_i+{h\over2}k_{2i}\right),\\ k_{4i}&=f(x_i+h,y_i+hk_{3i}),\end{align*}\]
і
\[y_{i+1}=y_i+{h\over6}(k_{1i}+2k_{2i}+2k_{3i}+k_{4i}).\nonumber \]
Наступний приклад, який стосується задачі початкового значення, розглянутого в Прикладах і Прикладах Template:index, ілюструє обчислювальну процедуру, зазначену в методі Рунге-Кутти.
Використовувати метод Рунге-Кутта with,\(h=0.1\) щоб знайти приблизні значення для розв'язку початкової задачі
\[\label{eq:3.3.2} y'+2y=x^3e^{-2x},\quad y(0)=1,\]
в\(x=0.1,0.2\).
Рішення
Знову переписуємо рівняння\ ref {eq:3.3.2} як
\[y'=-2y+x^3e^{-2x},\quad y(0)=1, \nonumber\]
який має вигляд Рівняння\ ref {eq:3.3.1}, з
\[f(x,y)=-2y+x^3e^{-2x},\ x_0=0,\mbox{ and}\ y_0=1. \nonumber\]
Метод Рунге-Кутта дає
\[\begin{aligned} k_{10} & = f(x_0,y_0) = f(0,1)=-2,\\ k_{20} & = f(x_0+h/2,y_0+hk_{10}/2)=f(.05,1+(.05)(-2))\\ &= f(.05,.9)=-2(.9)+(.05)^3e^{-.1}=-1.799886895,\\ k_{30} & = f(x_0+h/2,y_0+hk_{20}/2)=f(.05,1+(.05)(-1.799886895))\\ &= f(.05,.910005655)=-2(.910005655)+(.05)^3e^{-.1}=-1.819898206,\\ k_{40} & = f(x_0+h,y_0+hk_{30})=f(.1,1+(.1)(-1.819898206))\\ &=f(.1,.818010179)=-2(.818010179)+(.1)^3e^{-.2}=-1.635201628,\\ y_1&=y_0+{h\over6}(k_{10}+2k_{20}+2k_{30}+k_{40}),\\ &=1+{.1\over6}(-2+2(-1.799886895)+2(-1.819898206) -1.635201628)=.818753803,\\[4pt] k_{11} & = f(x_1,y_1) = f(.1,.818753803)=-2(.818753803))+(.1)^3e^{-.2}=-1.636688875,\\ k_{21} & = f(x_1+h/2,y_1+hk_{11}/2)=f(.15,.818753803+(.05)(-1.636688875))\\ &= f(.15,.736919359)=-2(.736919359)+(.15)^3e^{-.3}=-1.471338457,\\ k_{31} & = f(x_1+h/2,y_1+hk_{21}/2)=f(.15,.818753803+(.05)(-1.471338457))\\ &= f(.15,.745186880)=-2(.745186880)+(.15)^3e^{-.3}=-1.487873498,\\ k_{41} & = f(x_1+h,y_1+hk_{31})=f(.2,.818753803+(.1)(-1.487873498))\\ &=f(.2,.669966453)=-2(.669966453)+(.2)^3e^{-.4}=-1.334570346,\\ y_2&=y_1+{h\over6}(k_{11}+2k_{21}+2k_{31}+k_{41}),\\ &=.818753803+{.1\over6}(-1.636688875+2(-1.471338457)+2(-1.487873498)-1.334570346) \\&=.670592417.\end{aligned}\]
Метод Рунге-Кутта досить точний для більшості застосувань.
Таблиця Template:index показує результати використання методу Рунге-Кутти з розмірами кроків\(h=0.1\) і\(h=0.05\) знайти приблизні значення розв'язку початкової задачі
\[y'+2y=x^3e^{-2x},\quad y(0)=1 \nonumber\]
в\(x=0\),\(0.1\),\(0.2\),\(0.3\),...,\(1.0\). Для порівняння він також показує відповідні наближені значення, отримані за допомогою вдосконаленого методу Ейлера в прикладі 3.2.2, і значення точного розв'язку
\[y={e^{-2x}\over4}(x^4+4).\nonumber \]
Результати, отримані методом Рунге-Кутта, явно кращі, ніж отримані вдосконаленим методом Ейлера фактично; результати, отримані методом Рунге-Кутта з\(h=0.1\), кращі, ніж результати, отримані вдосконаленим методом Ейлера с\(h=0.05\).
| Покращений Ейлер | Рунге-Кутта | ||||
|---|---|---|---|---|---|
| х | h=0.1 | н=0,05 | h=0.1 | ч -0,05 | «точний» |
| 0.0 | 1.000000000 | 1.000000000 | 1.000000000 | 1.000000000 | 1.000000000 |
| 0.1 | 0.820040937 | 0,819050572 | 0,818753803 | 0,818751370 | 0,818751221 |
| 0.2 | 0.672734445 | 0.67108645 | 0.670592417 | 0.670588418 | 0.670588174 |
| 0.3 | 0,552597643 | 0.550543878 | 0.549928221 | 0.549923281 | 0.549922980 |
| 0.4 | 0,455 160637 | 0,452890616 | 0,452210430 | 0,452205001 | 0,452204669 |
| 0.5 | 0,37668 1251 | 0,3743 35747 | 0,373633492 | 0,373627899 | 0,373627557 |
| 0.6 | 0.313970920 | 0,31 1652239 | 0.310958768 | 0,310953242 | 0,310952904 |
| 0.7 | 0.264287611 | 0.262067624 | 0.261404568 | 0.261399 270 | 0.261398947 |
| 0.8 | 0,225 267702 | 0,223 194281 | 0,2225 75989 | 0.222571024 | 0.222570721 |
| 0.9 | 0,1948 79501 | 0,192981757 | 0,1924 16882 | 0,1924 12317 | 0,1924 12038 |
| 1.0 | 0,17 138 8070 | 0.169680673 | 0,169 173489 | 0.169169356 | 0.169169104 |
Таблиця Template:index показує аналогічні результати для нелінійної задачі на початкове значення
\[y'=-2y^2+xy+x^2,\ y(0)=1. \nonumber\]
Ми застосували вдосконалений метод Ейлера до цієї проблеми в прикладі 3.2.3.
| Покращений Ейлер | Рунге-Кутта | ||||
|---|---|---|---|---|---|
| х | h=0.1 | н=0,05 | h=0.1 | ч -0,05 | «точний» |
| 0.0 | 1.000000000 | 1.000000000 | 1.000000000 | 1.000000000 | 1.000000000 |
| 0.1 | 0.840500 000 | 0,838288371 | 0.837587192 | 0.837584759 | 0.837584494 |
| 0.2 | 0,733430846 | 0,73055677 | 0.729644 487 | 0,729642155 | 0,729641890 |
| 0.3 | 0.661600806 | 0.658552190 | 0.657 582449 | 0.657580598 | 0.657 580377 |
| 0.4 | 0.615961841 | 0.612884493 | 0.611903380 | 0.611901969 | 0.611901791 |
| 0.5 | 0.591634742 | 0.588558952 | 0.587576716 | 0.587575635 | 0.587575491 |
| 0.6 | 0.58600 6935 | 0.582927224 | 0.581943210 | 0.581942342 | 0.581942225 |
| 0.7 | 0.597712120 | 0.594618012 | 0.593630403 | 0.593629627 | 0.593629526 |
| 0.8 | 0.626008824 | 0,62 2898279 | 0.62 1908378 | 0.62 1907553 | 0.62 1907458 |
| 0.9 | 0.670351225 | 0.667237617 | 0.66625 1988 | 0.666250942 | 0.666250842 |
| 1.0 | 0,7300 69610 | 0.726985837 | 0,726017378 | 0,726015908 | 0,726015790 |
Таблиці Template:index та Template:index показують результати, отримані шляхом застосування напівлінійних методів Рунге-Кутта та Рунге-Кутта до початкової задачі
\[y'-2xy=1,\ y(0)=3, \nonumber\]
які ми розглядали в прикладах Template:index та Template:index
| \(x\) | \(h=0.2\) | \(h=0.1\) | \(h=0.05\) | «Точний» |
|---|---|---|---|---|
| \ (x\)» style="вирівнювання тексту: центр; "> 0.0 | \ (h = 0.2\)» style="вирівнювання тексту: праворуч; "> 3.000000000 | \ (h = 0.1\)» style="вирівнювання тексту: праворуч; "> 3.000000000 | \ (h = 0.05\)» style="вирівнювання тексту: праворуч; "> 3.000000000 | 3.000000000 |
| \ (x\)» style="вирівнювання тексту: центр; "> 0.2 | \ (h = 0.2\)» style="вирівнювання тексту: праворуч; "> 3.327846400 | \ (h = 0.1\)» style="вирівнювання тексту: праворуч; "> 3.327851633 | \ (h=0.05\)» style="вирівнювання тексту: праворуч; "> 3.327851952 | 3 2785 1973 |
| \ (x\)» style="вирівнювання тексту: центр; "> 0.4 | \ (h = 0.2\)» style="вирівнювання тексту: праворуч; "> 3.966044973 | \ (h = 0.1\)» style="вирівнювання тексту: праворуч; "> 3.966058535 | \ (h = 0.05\)» style="вирівнювання тексту: праворуч; "> 3.966059300 | 3 966059348 |
| \ (x\)» style="вирівнювання тексту: центр; "> 0.6 | \ (h = 0.2\)» style="вирівнювання тексту: праворуч; "> 5.066996754 | \ (h = 0.1\)» style="вирівнювання тексту: праворуч; "> 5.067037123 | \ (h = 0.05\)» style="вирівнювання тексту: праворуч; "> 5.067039396 | 5.0670 39535 |
| \ (x\)» style="вирівнювання тексту: центр; "> 0.8 | \ (h = 0.2\)» style="вирівнювання тексту: праворуч; "> 6.936534178 | \ (h = 0.1\)» style="вирівнювання тексту: праворуч; "> 6.936690679 | \ (h = 0.05\)» style="вирівнювання тексту: праворуч; "> 6.936700320 | 6.936700945 |
| \ (x\)» style="вирівнювання тексту: центр; "> 1.0 | \ (h = 0.2\)» style="вирівнювання тексту: праворуч; "> 10.184232252 | \ (h = 0.1\)» style="вирівнювання тексту: праворуч; "> 10.184877733 | \ (h = 0.05\)» style="вирівнювання тексту: праворуч; "> 10.184920997 | 10.1849 23955 |
| \ (x\)» style="вирівнювання тексту: центр; "> 1.2 | \ (h = 0.2\)» style="вирівнювання тексту: праворуч; "> 16.064344805 | \ (h = 0.1\)» style="вирівнювання тексту: праворуч; "> 16.066915583 | \ (h = 0.05\)» style="вирівнювання тексту: праворуч; "> 16.067098699 | 16.0671 1677 |
| \ (x\)» style="вирівнювання тексту: центр; "> 1.4 | \ (h = 0.2\)» style="вирівнювання тексту: праворуч; "> 27.278771833 | \ (h = 0.1\)» style="вирівнювання тексту: праворуч; "> 27.288605217 | \ (h = 0,05\)» style="вирівнювання тексту: праворуч; "> 27.289338955 | 27.289392347 |
| \ (x\)» style="вирівнювання тексту: центр; "> 1.6 | \ (h = 0.2\)» style="вирівнювання тексту: праворуч; "> 49.960553660 | \ (h = 0.1\)» style="вирівнювання тексту: праворуч; "> 49.997313966 | \ (h = 0.05\)» style="вирівнювання тексту: праворуч; "> 50.000165744 | 50.000377775 |
| \ (x\)» style="вирівнювання тексту: центр; "> 1.8 | \ (h = 0.2\)» style="вирівнювання тексту: праворуч; "> 98.834337815 | \ (h = 0.1\)» style="вирівнювання тексту: праворуч; "> 98.971146146 | \ (h = 0.05\)» style="вирівнювання тексту: праворуч; "> 98.982136702 | 98.98 2969504 |
| \ (x\)» style="вирівнювання тексту: центр; "> 2.0 | \ (h = 0.2\)» style="вирівнювання тексту: праворуч; "> 211.393800152 | \ (h = 0.1\)» style="вирівнювання тексту: праворуч; "> 211.908445283 | \ (h = 0.05\)» style="вирівнювання тексту: праворуч; "> 211.951167637 | 211.954462214 |
| \(x\) | \(h=0.2\) | \(h=0.1\) | \(h=0.05\) | «Точний» |
|---|---|---|---|---|
| \ (x\) ">0.0 | \ (h = 0.2\) ">3.000000000 | \ (h=0.1\) ">3.000000000 | \ (h = 0,05\) ">3.000000000 | 3.000000000 |
| \ (x\) ">0.2 | \ (h=0,2\) ">3,327853286 | \ (h=0.1\) ">3.327852055 | \ (h=0,05\) ">3.327851978 | 3 2785 1973 |
| \ (x\) ">0.4 | \ (h=0,2\) ">3.966061755 | \ (h=0.1\) ">3.966059497 | \ (h = 0,05\) ">3.966059357 | 3 966059348 |
| \ (x\) ">0.6 | \ (h=0,2\) ">5.067042602 | \ (h=0.1\) ">5.067039725 | \ (h=0,05\) ">5.067039547 | 5.0670 39535 |
| \ (x\) ">0,8 | \ (h=0,2\) ">6.936704019 | \ (h=0.1\) ">6.936701137 | \ (h = 0,05\) ">6.936700957 | 6.936700945 |
| \ (x\) ">1.0 | \ (h=0,2\) ">10.184926171 | \ (h=0.1\) ">10.184924093 | \ (h=0,05\) ">10.184923963 | 10.1849 23955 |
| \ (x\) ">1.2 | \ (h=0.2\) ">16,067111961 | \ (h=0.1\) ">16,067111696 | \ (h=0,05\) ">16,067111678 | 16.0671 1677 |
| \ (x\) ">1.4 | \ (h=0,2\) ">27.289389418 | \ (h=0.1\) ">27.289392167 | \ (h = 0,05\) ">27.289392335 | 27.289392347 |
| \ (x\) ">1.6 | \ (h=0.2\) ">50.000370152 | \ (h=0.1\) ">50.000377302 | \ (h=0,05\) ">50.000377745 | 50.000377775 |
| \ (x\) ">1.8 | \ (h=0,2\) ">98,982955511 | \ (h=0.1\) ">98.982968633 | \ (h=0,05\) ">98.982969450 | 98.98 2969504 |
| \ (x\) ">2.0 | \ (h=0,2\) ">211,954439983 | \ (h=0.1\) ">211,954460825 | \ (h = 0,05\) ">211,954462127 | 211.954462214 |
Випадок, коли xне є лівою кінцевою точкою
Поки що в цьому розділі ми розглянули числові методи розв'язання задачі початкового значення
\[\label{eq:3.3.3} y'=f(x,y),\quad y(x_0)=y_0\]
на інтервалі\([x_0,b]\), для якого\(x_0\) знаходиться ліва кінцева точка. Ми не обговорювали числові методи розв'язання Equation\ ref {eq:3.3.3} на інтервалі\([a,x_0]\), для якого\(x_0\) є права кінцева точка. Якщо бути конкретним, то як отримати наближені значення\(y_{-1}\),\(y_{-2}\),...,\(y_{-n}\) розв'язку Рівняння\ ref {eq:3.3.3} at\(x_0-h, \dots,x_0-nh\), де\(h=(x_0-a)/n\)? Ось відповідь на це питання:
Розглянемо початкову задачу значення
\[\label{eq:3.3.4} z'=-f(-x,z),\quad z(-x_0)=y_0,\]на проміжку\([-x_0,-a]\), для якого\(-x_0\) знаходиться ліва кінцева точка. Використовуйте числовий метод для отримання\(z_1\) наближених\(z_2\) значень,,...,\(z_n\) розв'язку\(\eqref{eq:3.3.4}\) at\(-x_0+h\)\(-x_0+2h\),...,\(-x_0+nh=-a\). Потім\(y_{-1}=z_1\),\(y_{-2}=z_2\),\(\dots\),\(y_{-n}=z_n\) наводяться приблизні значення розв'язку\(\eqref{eq:3.3.3}\) at\(x_0-h\),\(x_0-2h\),...,\(x_0-nh=a\).
Обґрунтування цієї відповіді наведено у вправі 3.3.23. Зверніть увагу, як легко змінити задану задачу Equation\ ref {eq:3.3.3} на модифіковану задачу Equation\ ref {eq:3.3.4}: спочатку замінити\(f\) на\(-f\)\(x\)\(x_0\), а потім замінити\(-x\), і\(y\) на\(-x_0\), і\(z\), відповідно.
Використовуйте метод Рунге-Кутта з розміром кроку,\(h=0.1\) щоб знайти приблизні значення розв'язку
\[\label{eq:3.3.5} (y-1)^2y'=2x+3,\quad y(1)=4\]
в\(x=0\),\(0.1\),\(0.2\),...,\(1\).
Рішення
Ми спочатку перепишемо рівняння\ ref {eq:3.3.5} у вигляді Рівняння\ ref {eq:3.3.3} як
\[\label{eq:3.3.6} y'={2x+3\over(y-1)^2},\quad y(1)=4.\]
Так як початкова умова\(y(1)=4\) накладається в правій кінцевій точці інтервалу\([0,1]\), застосуємо метод Рунге-Кутта до початкової задачі
\[\label{eq:3.3.7} z'={2x-3\over(z-1)^2},\quad z(-1)=4\]
на проміжку\([-1,0]\). (Ви повинні переконатися, що рівняння\ ref {eq:3.3.7} пов'язане з рівнянням\ ref {eq:3.3.6}, оскільки рівняння\ ref {eq:3.3.4} пов'язане з рівнянням\ ref {eq:3.3.3}.) Таблиця [табл:3.3.5} показує результати. Зворотний порядок рядків у таблиці [табл:3.3.5} і зміна знаків значень\(x\) дає перші два стовпці таблиці [табл:3.3.6}. В останньому стовпці таблиці [table:3.3.6} вказані точні значення\(y\), які задаються
\[y=1+(3x^2+9x+15)^{1/3}.\nonumber \]
(Оскільки диференціальне рівняння в Equation\ ref {eq:3.3.6} роздільне, цю формулу можна отримати методом розділу 2.2.)
| \(x\) | \(z\) |
|---|---|
| \ (x\) ">-1.0 | \ (z\) ">4.000000000 |
| \ (x\) ">-0.9 | \ (z\) ">3,944536474 |
| \ (x\) ">-0.8 | \ (z\) ">3.889298649 |
| \ (x\) ">-0.7 | \ (z\) ">3,834355648 |
| \ (x\) ">-0.6 | \ (z\) ">3.779786399 |
| \ (x\) ">-0.5 | \ (z\) ">3.725680888 |
| \ (x\) ">-0.4 | \ (z\) ">3.672141529 |
| \ (x\) ">-0.3 | \ (z\) ">3.619284615 |
| \ (x\) ">-0.2 | \ (z\) ">3.567241862 |
| \ (x\) ">-0.1 | \ (z\) ">3,516161955 |
| \ (x\) ">0.0 | \ (z\) ">3.466212070 |
| \(x\) | \(y\) | Точний |
|---|---|---|
| \ (х\) ">0,00 | \ (y\) ">3.466212070 | 3.46621 2074 |
| \ (x\) ">0,10 | \ (y\) ">3.516161955 | 3 516 161958 |
| \ (x\) ">0,20 | \ (y\) ">3.567241862 | 3 56724 1864 |
| \ (x\) ">0,30 | \ (y\) ">3.619284615 | 3.6 1928 4617 |
| \ (x\) ">0,40 | \ (y\) ">3.672141529 | 3 672 141530 |
| \ (x\) ">0,50 | \ (y\) ">3.725680888 | 3.725680889 |
| \ (x\) ">0,60 | \ (y\) ">3.779786399 | 3.779786399 |
| \ (x\) ">0,70 | \ (y\) ">3.834355648 | 3,834 355648 |
| \ (x\) ">0,80 | \ (y\) ">3.889298649 | 3.889298649 |
| \ (x\) ">0,90 | \ (y\) ">3,944536474 | 3 9445 36474 |
| \ (x\) ">1,00 | \ (y\) ">4.000000000 | 4.000000000 |
Ми залишаємо вам розробити процедуру обробки числового розв'язку Equation\ ref {eq:3.3.3} на\([a,b]\) такому інтервалі, що\(a<x_0<b\) (Вправи 3.3.26 і 3.3.27).
