10 常微分方程初值问题的数值解法

10 常微分方程初值问题的数值解法

10.1 引言

包含自变量、未知函数以及未知函数导数或微分的方程称为微分方程。在微分方程中,如果自变量的个数只有一个,就称为常微分方程;如果自变量个数两个及以上,就称为偏微分方程。微分方程中出现的未知函数最高阶导数的阶称为微分方程的阶。如果未知函数\(y\)及其各阶导数:\(y',y'',\cdots,y^{(n)}\)都是一次的,则称它是线性的,否则是非线性的。

高等数学中给出了一些典型的常微分方程的求解方法,但实际应用中,很多微分方程往往是无法直接求出解析解的。因此,很有必要研究微分方程的数值解法。一阶常微分方程的初值问题的一般形式是:
\[ \left\{\begin{aligned} &y'=f(x,y),a\le x\le b\\ &y(x_0)=y_0 \end{aligned}\right.\tag{10-1-1} \]
其中函数\(f(x,y)\)的定义域\(D=\{(x,y)|a\le x\le b,c\le y\le d\}\)

对于这一类的初值问题而言,如果\(f(x,y)\)在区域\(D\)上满足李普希兹(Lipschitz)条件,那么初值问题在区间\([a,b]\)上具有唯一连续可微解。李普希兹条件具体表述如下:
\[ \exists L>0,\forall x\in[a,b],y\in[c,d],|f(x,y_1)-f(x,y_2)|\le L|y_1-y_2| \]
所谓微分方程的数值解法,就是寻找方程(10-1-1)的解\(y(x)\)在一系列离散节点:\(x_1<x_2<\cdots<x_n\),上的近似值\(y_1,y_2,\cdots,y_n\)。相邻两个节点之间的距离\(h=x_{n+1}-x_n\)称为步长,如果所设置的步长是定值,那么就有\(x_n=x_0+nh\)。常微分方程的数值解法的基本出发点就是将连续的问题离散化,并且采用“步进式”的解法,即求解过程顺着节点排序的次序一步一步向前推进。描述这一类算法,就是要用已知的\(y_i,y_{i-1},\cdots,y_0\)构建出计算\(y_{i+1}\)的递推式,而建立递推公式的基本方法就是在这些节点上应用数值积分、微分、泰勒展开等方法。

10.2 欧拉(Euler)方法

欧拉格式:

一种最简单的方法便是使用差商代替微分:
\[ y'(x_n)=f(x_n,y_n)\approx\frac{y_{n+1}-y_n}{h} \]
于是就可以得到欧拉格式
\[ \left\{\begin{aligned} y_{n+1}&=y_n+hf(x_n,y_n)\\ y(x_0)&=y_0 \end{aligned}\right.\quad n=0,1,2,\cdots \]
隐式欧拉格式:

欧拉格式是用差商的值来近似点\((x_n,y_n)\)处的导数值,若用差商的值来近似点\((x_{n+1},y_{n+1})\)处的导数值,则可以得到隐式欧拉格式
\[ \left\{\begin{aligned} y_{n+1}&=y_n+hf(x_{n+1},y_{n+1})\\ y(x_0)&=y_0 \end{aligned}\right.\quad n=0,1,2,\cdots \]
隐式欧拉格式只有在\(f(x,y)\)容易将两个参数分离的情况,才比较容易使用。

改进的欧拉格式:

为了得到更加准确的估计,可以考虑将欧拉格式和隐式欧拉格式取平均值,得到
\[ y_{n+1}=y_n+\frac{h}{2}(f(x_n,y_n)+f(x_{n+1},y_{n+1}))\tag{10-2-1} \]
上述式子称为梯形公式,为了计算\(y_{n+1}\)常用以下迭代式
\[ \left\{\begin{aligned} y_{n+1}^{(0)}&=y_n+hf(x_n,y_n)\\ y_{n+1}^{(k+1)}&=y_n+\frac{h}{2}(f(x_n,y_n)+f(x_{n+1},y_{n+1}^{(k)})) \end{aligned}\right.\quad k=0,1,2,\cdots\tag{10-2-2} \]
\(|y_{n+1}^{(k+1)}-y_{n+1}^{(k)}|<\varepsilon\)时,取\(y_{n+1}\approx y_{n+1}^{(k+1)}\)

定理 设函数\(f(x,y)\)对变量\(y\)满足Lipschtz条件,\(L\)为Lipschtz常数。若步长\(h\)满足\(0\le\frac{hL}{2}\lt1\),由迭代式(10-2-1)产生的序列\(\{y_{n+1}^{(k)}\}\)收敛到\(y_{n+1}\)

证明:由(10-2-1)和(10-2-2)有
\[ \begin{aligned} |y_{n+1}-y_{n+1}^{(k+1)}|&=\frac{h}{2}|f(x_{n+1},y_{n+1})-f(x_{n+1},y_{n+1}^{(k)})|\\ &\le\frac{hL}{2}|y_{n+1}-y_{n+1}^{(k)}|\le\cdots\le \left(\frac{hL}{2}\right)^{k+1}|y_{n+1}-y_{n+1}^{(0)}| \end{aligned} \]
于是
\[ \lim_{k\rightarrow\infty}\left(\frac{hL}{2}\right)^{k+1}=0 \Rightarrow \lim_{k\rightarrow\infty}|y_{n+1}-y_{n+1}^{(k+1)}|=0 \Rightarrow \lim_{k\rightarrow\infty}y_{n+1}^{(k+1)}=y_{n+1} \]
由于采用迭代方法计算\(y_{n+1}\)时的计算量较大,因此一般只迭代一次,构成一类预估-校正算法:
\[ \left\{\begin{aligned} y^P_{n+1}&=y_n+hf(x_n,y_n)&\text{(预估)}\\ y^C_{n+1}&=y_n+\frac{h}{2}(f(x_n,y_n)+f(x_{n+1},y_{n+1}^P))&\text{(校正)} \end{aligned}\right. \]
\(y_{n+1}=y_{n+1}^C\),将上述式子改写成
\[ \left\{\begin{aligned} k_1&=hf(x_n,y_n)\\ k_2&=hf(x_n+h,y_n+k_1)\\ y_{n+1}&=y_n+\frac{1}{2}(k_1+k_2) \end{aligned}\right. \]

10.3 误差、数值稳定性、收敛性

10.3.1 误差概述

显式单步法一般形式为
\[ y_{n+1}=y_n+h\varphi(x_n,y_n,h) \]
而隐式单步法的一般形式为
\[ y_{n+1}=y_n+h\varphi(x_n,y_n,x_{n+1},y_{n+1},h) \]
其中\(\varphi(\cdot)\)称为增量函数,并且与\(f(x,y)\)相关。欧拉格式、隐式欧拉格式就是一个典型的实例。

扫描二维码关注公众号,回复: 9381877 查看本文章

需要注意的是,欧拉格式的基本原理就是利用了一阶差商近似了一个节点上的导数值,这种近似本身就带来了一定的误差。也就是说,单步法本身就具有一定的误差。

定义1 从初值\(y(x_0)=y_0\)出发,由单步法显式、或隐式逐步计算,可以得到\(x_{n+1}\)点出的近似值\(y_{n+1}\)。此时,我们称\(e_{n+1}=y(x_{n+1})-y_{n+1}\)为在点\(x_{n+1}\)上的整体截断误差。

定义2 如果第\(n\)步在\(x_n\)的计算没有误差,即\(y(x_n)=y_n\)。且由单步法计算出来的近似值\(\widetilde{y}_{n+1}\),此时,我们称\(T_{n+1}=y(x_{n+1})-\widetilde{y}_{n+1}\)为点\(x_{n+1}\)上的局部截断误差。

局部阶段误差的实例(以显式单步法为例):
\[ \widetilde{y}_{n+1}=y(x_n)+h\varphi(x_n,y(x_n),h)\\ T_{n+1}=y(x_{n+1})-\widetilde{y}_{n+1} \]
定义3 若一种数值方法的局部截断误差是\(O(h^{p+1})\),即\(T_{n+1}=O(h^{p+1})\)。则称相应的数值方法是\(p\)阶方法,并称该算法具有\(p\)阶精度,其中\(p\)是正整数。

一般来说,一种数值方法的局部截断误差阶越大,那么相对精度就越高。

欧拉格式的局部截断误差:

对于欧拉格式,假设\(y_k=y(x_k)\),那么
\[ y_{k+1}=y(x_k)+hf(x_k,y(x_k))=y(x_k)+hy'(x_k) \]
对理论解\(y(x)\)在点\(x_k\)进行二阶泰勒展开,并令\(x=x_{k+1}\),则有
\[ y(x_{k+1})=y(x_k)+hy'(x_k)+\frac{h^2}{2}y''(\xi)\quad\xi\in(x_k,x_{k+1}) \]
于是
\[ T_{k+1}=y(x_{k+1})-y_{k+1}=\frac{h^2}{2}y''(\xi)\Rightarrow T_{k+1}=O(h^2) \]
即显式欧拉格式仅具有一阶精度。

梯形公式的局部截断误差:

假设\(y_k=y(x_k)\),那么
\[ y_{k+1}=y(x_k)+\frac{h}{2}[y'(x_k)+y'(x_{k+1})] \]
利用泰勒展开可以得到
\[ y(x_{k+1})=y(x_k)+hy'(x_k)+\frac{h^2}{2}f''(x_k)+\frac{h^3}{6}f'''(x_k)+O(h^4)\\ y'(x_{k+1})=y'(x_k)+hy''(x_k)+\frac{h^2}{2}f'''(x_k)+O(h^3) \]
综合上述式子,可以得到
\[ \begin{aligned} T_{k+1}&=y(x_{k+1})-y_{k+1}\\ &=-\frac{h^3}{12}f'''(x_k)+O(h^4) \end{aligned}\Rightarrow T_{k+1}=O(h^3) \]
即梯形公式的局部截断误差为\(O(h^3)\)

欧拉方法的整体截断误差:

下面考察使用\(n+1\)次欧拉公式所产生的累计误差,即整体截断误差。

首先,记\(\bar{y}_{n+1}=y(x_n)+hf(x_n,y(x_n)),\varepsilon_{n+1}=y(x_{n+1})-y_{n+1}\),那么
\[ \begin{aligned} |\varepsilon_{n+1}|&=|y(x_{n+1})-y_{n+1}|\\ &=|y(x_{n+1})-\bar{y}_{n+1}+\bar{y}_{n+1}-y_{n+1}|\\ &\le|T_{n+1}|+|\bar{y}_{n+1}-y_{n+1}| \end{aligned} \]
其中
\[ \begin{aligned} |\bar{y}_{n+1}-y_{n+1}|&=|[y(x_n)+hf(x_n,y(x_n))]-[y_n+hf(x_n,y_n)]|\\ &=|[y(x_n)-y_n]+h[f(x_n,y(x_n))-f(x_n,y_n)]|\\ &\le|y(x_n)-y_n|+h|f(x_n,y(x_n))-f(x_n,y_n)|\\ &\le|y(x_n)-y_n|+hL|y(x_n)-y_n|\\ &=(1+hL)|y(x_n)-y_n|=(1+hL)|\varepsilon_n| \end{aligned} \]
其中\(L\)是Lipschtz常数。

根据之前的局部截断误差的推导,可知
\[ |T_{n+1}|\le\frac{Mh^2}{2},\quad M=\max_{x\in[a,b]}|y''(x)| \]
于是
\[ |\varepsilon_{n+1}|\le\frac{Mh^2}{2}+(1+hL)|\varepsilon_n| \]
反复通过上述式子递推,最终可以得到
\[ \begin{aligned} |\varepsilon_{n+1}|&\le\frac{Mh^2}{2}+\frac{Mh^2}{2}(1+hL)+\cdots+\frac{Mh^2}{2}(1+hL)^n +(1+hL)^{n+1}|\varepsilon_0|\\ &=\frac{Mh^2}{2}\sum_{k=0}^n(1+hL)^k+(1+hL)^{n+1}|\varepsilon_0|\\ &=\frac{Mh}{2L}((1+hL)^{n+1}-1)+(1+hL)^{n+1}|\varepsilon_0| \end{aligned} \]
由于初值是准确的,即\(\varepsilon_0=0\),那么
\[ |\varepsilon_n|\le\frac{Mh}{2L}((1+hL)^{n}-1) \]
根据不等式\(e^x\ge1+x(x\ge0)\),可以知道\(e^{hL}\ge1+hL\),于是\(e^{nhL}\ge(1+hL)^n\)

假设\(b\ge nh=x_n-x_0\),那么\(e^{bL}\ge(1+hL)^n\),于是
\[ |\varepsilon_n|\le\frac{Mh}{2L}(e^{bL}-1) \]
所以,显式欧拉格式的整体截断误差为\(\varepsilon_n=O(h)\)。可以发现此时全局截断误差的阶恰好比局部截断误差的阶降一级。

10.3.2 数值稳定性

用数值方法求解初值问题时,舍入误差是不可避免地。稳定性就是研究舍入误差传播问题,在求解过程中,如果舍入误差不增长,则称算法是数值稳定的。一般地讨论一个数值方法的稳定性非常复杂,因此一般是把数值方法应用于实验方程
\[ y'=\lambda y\tag{10-3-1} \]
其中\(\lambda\in\mathbb{C},Re(\lambda)<0\)

当然,如果一个数值方法对于实验方程是稳定的,并不能保证该方法但对于任何方程都是稳定的。但如果该数值方法连实验方程都不稳定,那么也很难应用于其他方程的求解。

定义4 用一个数值方法求解实验方程(10-3-1),假设对于给定的步长\(h\),计算\(y_n\)时引起的误差为\(\varepsilon_n\)。若这个误差在计算后面的\(y_{n+k}(k=1,2,\cdots)\)所引起的误差为\(\varepsilon_{n+k}\)满足:
\[ |\varepsilon_{n+k}|\le|\varepsilon_n| \]
则称这个数值方法对步长\(h\)和复数\(\lambda\)是绝对稳定的,使得数值方法绝对稳定的\(\bar{h}=h\lambda\)在复平面山的允许范围称为数值方法的绝对稳定域

定义5 若某数值算法的绝对稳定域包含\(h\lambda\)平面上的左边平面(即\(Re(h\lambda)<0\)),则称该算法是A稳定的。

欧拉方法的稳定性

将欧拉方法应用到实验方程中,可以得到
\[ y_{n+1}=y_n+h(x_n,y_n)=(1+h\lambda)y_n \]
由于舍入误差的存在,实际上应该把\(y_n\)写成\(\widetilde{y}_n\),因此
\[ \widetilde{y}_{n+1}=(1+h\lambda)\widetilde{y}_n \]
令误差\(\varepsilon_n=y_n-\widetilde{y}_n\),那么
\[ \begin{aligned} \varepsilon_{n+1}&=(1+h\lambda)\varepsilon_n\\ &=(1+h\lambda)^2\varepsilon_{n-1}\\ &=\cdots\\ &=(1+h\lambda)^{n+1}\varepsilon_0 \end{aligned} \]
于是
\[ |\varepsilon_{n}|\le|1+h\lambda|^n|\varepsilon_0| \]
通过上述式子可以发现,只要\(|1+h\lambda|\le1\),那么欧拉方法就是绝对稳定的。我们称满足\(|1+h\lambda|\le1\)\(h\lambda\)区域为绝对稳定区域。可以发现,该绝对稳定区域实际上是复平面上的一个圆。

隐式欧拉方法的稳定性

与上述分析方法相同,可以得到
\[ |\varepsilon_n|\le\left|\frac{1}{1-h\lambda}\right|^n|\varepsilon_0| \]
因为实验方程要求\(Re(\lambda)<0\),所以\(\left|\frac{1}{1-h\lambda}\right|<1\)是恒成立的。这也意味着隐式欧拉方法是无条件绝对稳定的,自然也是A稳定的。

梯形公式(改进欧拉格式)的稳定性

同样可以得到
\[ |\varepsilon_n|\le\left|\frac{1+\frac{h\lambda}{2}}{1-\frac{h\lambda}{2}}\right|^n|\varepsilon_0| \]
\(\frac{h\lambda}{2}=a+bi\),那么
\[ r=\left|\frac{1+\frac{h\lambda}{2}}{1-\frac{h\lambda}{2}}\right|= \left|\frac{1+a+bi}{1-a-bi}\right|= \sqrt{\frac{(1+a)^2+b^2}{(1-a)^2+b^2}}= \sqrt{1+\frac{4a}{(1-a)^2+b^2}} \]
因为\(Re(\lambda)<0\),所以\(a=Re(h\lambda)<0,h>0\)。因此\(r<1\),这对于实验方程是恒成立的。这意味着,梯形公式是绝对稳定的,并且还是A稳定的。

10.3.3 收敛性

常微分方程初值问题的求解,是将微分方程转换成差分方程来求解,并用计算值\(y_n\)来近似代替\(y(x_n)\)。这种近似是否合理,需要看当分割区间\([x_n,x_{n+1}]\)的长度\(h\)越来越小时,即\(h=x_{n+1}-x_n\rightarrow0\)时,\(y_n\rightarrow y(x_n)\)是否成立。如果成立,则称该方法是收敛的,否则是不收敛的。

以欧拉方法为例,结合之前在全局截断误差中的推导可知
\[ \lim_{h\rightarrow0}|\varepsilon_n|=\lim_{h\rightarrow0}\frac{M}{2L}((1+hL)^{n}-1)h=0 \]
这说明欧拉方法是收敛的,并且具有一阶收敛速度。

10.4 龙格-库塔(Runge-Kutta)方法

欧拉公式:
\[ \left\{\begin{aligned} K_1=f(x_n,y_n)\\ y_{n+1}=y_n+hK_1 \end{aligned}\right. \]
改进的欧拉公式:
\[ \left\{\begin{aligned} K_1&=f(x_n,y_n)\\ K_2&=f(x_n+h,y_n+K_1)\\ y_{n+1}&=y_n+\frac{h}{2}(K_1+K_2) \end{aligned}\right. \]
可以发现上述两组公式都使用了函数\(f(x,y)\)在某些点上的函数值的线性组合来计算\(y(x_{n+1})\)的近似值\(y_{n+1}\)。欧拉公式每一步需要计算一次\(f(x,y)\)的值,称为一阶方法。改进的欧拉公式则需要计算两次\(f(x,y)\)的值,称为二阶方法

于是可以考虑使用函数\(f(x,y)\)在若干个点上的函数值的线性组合来构造近似公式,构造是要求近似公式在\((x_n,y_n)\)处的泰勒展开与理论解\(y(x)\)\(x_n\)处的泰勒展开前面几项重合,从而提高近似公式的阶数。这样一来,既能够避免求偏导,又能够提高计算方法的精度阶数。

简言之,这种方法就是在区间\([x_i,x_{i+1}]\)上多预报几个点的斜率值,然后将其加权平均作为平均斜率,以此构造更高精度的计算格式,这就是龙格-库塔方法的基本思想。

一般地,在RK方法中,将近似公式设为
\[ \left\{\begin{aligned} y_{n+1}&=y_n+h\sum_{i=1}^pc_iK_i\\ K_1&=f(x_n,y_n)\\ K_i&=f(x_n+a_ih,y_n+h\sum_{j=1}^{i-1}b_{ij}K_j)\;(i=2,3,\cdots,p)\\ \end{aligned}\right. \]
其中\(a_i,b_{ij},c_i\)都是待定参数,确定它们的原则是使近似公式在\((x_n,y_n)\)处的泰勒展开式与解\(y(x)\)\(x_n\)处的泰勒展开式的前几项尽可能多地重合。

二阶方法:\(p=2\)时,近似公式设为
\[ \left\{\begin{aligned} y_{n+1}&=y_n+h(c_1K_1+c_2K_2)\\ K_1&=f(x_n,y_n)\\ K_2&=f(x_n+a_2h,y_n+hb_{21}K_1) \end{aligned}\right. \]
在点\((x_n,y_n)\)处对\(f(x,y)\)应用泰勒展开
\[ \begin{aligned} y_{n+1}&=y_n+h(c_1f(x_n,y_n)+c_2f(x_n+a_2h,y_n+hb_{21}K_1))\\ &=y_n+h\left(\color{red}{c_1f(x_n,y_n)}+\color{blue}{c_2\left[f(x_n,y_n)+a_2hf'_x(x_n,y_n)+hb_{21}f'_y(x_n,y_n)f(x_n,y_n)+O(h^2)\right]}\right)\\ &=y_n+(c_1+c_2)f(x_n,y_n)h+c_2[a_2f'_x(x_n,y_n)+b_{21}f'_y(x_n,y_n)f(x_n,y_n)]h^2+O(h^3)\\ \end{aligned} \]
\(y(x_{n+1})\)在点\((x_n,y_n)\)处的泰勒展开为(这里需要注意\(y'=f(x,y)\)
\[ \begin{aligned} y(x_{n+1})&=y(x_n)+hy'(x_n)+\frac{h^2}{2}y''(x_n)+O(h^3)\\ &=y_n+hf(x_n,y_n)+\frac{h^2}{2}(f'_x(x_n,y_n)+f'_y(x_n,y_n)f(x_n,y_n))+O(h^3)\\ \end{aligned} \]
对比上下两式的泰勒展开的系数,可得
\[ c_1+c_2=1\\ c_2a_2=\frac12\\ c_2b_{21}=\frac12 \]
显然三个方程有四个未知数,具有无穷多组解。

如果取\(c_1=c_2=1/2,a_2=b_{21}=1\),即可得到改进的欧拉公式。

如果取\(c_1=0,c_2=1,a_2=b_{21}=1/2\),就得到了常用的二阶RK公式(也称为中点公式):
\[ \left\{\begin{aligned} y_{n+1}&=y_n+hK_2\\ K_1&=f(x_n,y_n)\\ K_2&=f(x_n+h/2,y_n+hK_1/2) \end{aligned}\right. \]
三阶方法:\(p=3\)时,需要计算三个K值,此时近似公式为
\[ \left\{\begin{aligned} y_{n+1}&=y_n+h(c_1K_1+c_2K_2+c_3K_3)\\ K_1&=f(x_n,y_n)\\ K_2&=f(x_n+a_2h,y_n+hb_{21}K_1)\\ K_3&=f(x_n+a_3h,y_n+hb_{31}K_1+hb_{32}K_2) \end{aligned}\right. \]
仍然按照上述分析方法,此时要求泰勒展开式的前四项相同,得到
\[ \left\{\begin{aligned} &c_1+c_2+c_3=1\\ &a_2=b_{21}\\ &a_3=b_{31}+b_{32}\\ &c_2a_2+c_3a_3=\frac12\\ &c_2a_2^2+c_3a_3^2=\frac13\\ &c_3a_2b_{32}=\frac16 \end{aligned}\right. \]

\[ c_1=\frac16,c_2=\frac46,c_3=\frac16\\ a_2=\frac12,a_3=1\\ b_{21}=\frac12,b_{31}=-1,b_{32}=2 \]
就得到了常用的三阶RK公式:
\[ \left\{\begin{aligned} y_{n+1}&=y_n+\frac{h}6(K_1+4K_2+K_3)\\ K_1&=f(x_n,y_n)\\ K_2&=f(x_n+\frac{h}2,y_n+\frac{h}2K_1)\\ K_3&=f(x_n+h,y_n-hK_1+2hK_2) \end{aligned}\right. \]
四阶方法: 在实际应用中,最常用的时四阶龙格-库塔公式。但是该方法的推导十分繁琐,需要求解含有13个参数的11个方程组成的方程组。因此,这里就不加以推导地给出计算公式。
\[ \left\{\begin{aligned} y_{n+1}&=y_n+\frac{h}6(K_1+2K_2+2K_3+K_4)\\ K_1&=f(x_n,y_n)\\ K_2&=f(x_n+\frac{h}2,y_n+\frac{h}2K_1)\\ K_3&=f(x_n+\frac{h}2,y_n+\frac{h}2K_2)\\ K_4&=f(x_n+h,y_n+hK_3) \end{aligned}\right. \]
其局部截断误差为\(O(h^5)\)

四阶RK方法的稳定性:

将四阶RK方法应用到实验方程中可以得到
\[ y_{n+1}=[1+(h\lambda)+\frac{(h\lambda)^2}{2!}+\frac{(h\lambda)^3}{3!}+\frac{(h\lambda)^4}{4!}]y_n \]
于是稳定区域由下式确定
\[ \left|1+(h\lambda)+\frac{(h\lambda)^2}{2!}+\frac{(h\lambda)^3}{3!}+\frac{(h\lambda)^4}{4!}\right|\le1 \]
\(\lambda<0\)时,可以解得:\(-2.78<h\lambda<0\)。因此,当\(|\lambda|\)的值比较大时,只有当\(h\)比较小的时候才能够保证算法的稳定性。

一阶方程组:

四阶RK方法可以拓展到多个函数的情况,假设有
\[ \left\{\begin{aligned} y'_1&=f_1(x,y_1,y_2,\cdots,y_n)\\ y'_2&=f_2(x,y_1,y_2,\cdots,y_n)\\ &\vdots\\ y'_n&=f_n(x,y_1,y_2,\cdots,y_n) \end{aligned}\right. \]
并且有初值条件
\[ \left\{\begin{aligned} y_1(x_0)&=y_{10}\\ y_2(x_0)&=y_{20}\\ &\vdots\\ y_n(x_0)&=y_{n0} \end{aligned}\right. \]

为了简化记号,可以先将其上面的条件改写成向量的形式:
\[ \left\{\begin{aligned} &y'=f(x,y)\\ &y(x_0)=y_0 \end{aligned}\right. \]
其中
\[ y'=\begin{bmatrix} y_1'\\y_2'\\\vdots\\y_n' \end{bmatrix},y=\begin{bmatrix} y_1\\y_2\\\vdots\\y_n \end{bmatrix}\\ f(x,y)=\begin{bmatrix} f_1\\f_2\\\vdots\\f_n \end{bmatrix}(x,y)=\begin{bmatrix} f_1(x,y)\\f_2(x,y)\\\vdots\\f_n(x,y) \end{bmatrix}=\begin{bmatrix} f_1(x,y_1,\cdots,y_n)\\f_2(x,y_1,\cdots,y_n)\\\vdots\\f_n(x,y_1,\cdots,y_n) \end{bmatrix}\\ y_0=y(x_0)=\begin{bmatrix} y_1\\y_2\\\vdots\\y_n \end{bmatrix}(x_0)=\begin{bmatrix} y_1(x_0)\\y_2(x_0)\\\vdots\\y_n(x_0) \end{bmatrix} \]
有了上述向量形式的记号,于是
\[ K_1=f(x_k,y_k)=\begin{bmatrix} f_1\\f_2\\\vdots\\f_n \end{bmatrix}(x_k,y_k)\\ K_2=f(x_k+\frac{h}2,y_k+\frac{h}2K_1)\\ K_3=f(x_k+\frac{h}2,y_k+\frac{h}2K_2)\\ K_4=f(x_k+h,y_k+hK_3) \]
于是形式上就和四阶方法相同
\[ \left\{\begin{aligned} y_{k+1}&=y_k+\frac{h}6(K_1+2K_2+2K_3+K_4)\\ K_1&=f(x_k,y_k)\\ K_2&=f(x_k+\frac{h}2,y_k+\frac{h}2K_1)\\ K_3&=f(x_k+\frac{h}2,y_k+\frac{h}2K_2)\\ K_4&=f(x_k+h,y_k+hK_3) \end{aligned}\right. \]
但需要注意的是,需要将上述的变量当成向量来对待。

高阶方程化为一阶方程组:

对于高阶微分方程的初值问题,原则上总可以归结成一阶方程组来求解。例如,对于如下m阶微分方程
\[ y^{(m)}=f(x,y,y',\cdots,y^{(m-1)}) \]
初始条件为
\[ y(x_0)=y_0,y'(x_0)=y'_0,\cdots,y^{(m-1)}(x_0)=y_0^{(m-1)} \]
引入记号
\[ y_1=y,y_2=y',\cdots,y_m=y^{(m-1)} \]
可以得到
\[ \left\{\begin{aligned} &y_1'=y_2\\&y_2'=y_3\\&\cdots\\&y_{m-1}'=y_m\\&y'_m=f(x,y_1,y_2,\cdots,y_m) \end{aligned}\right. \]
然后使用一阶方程组的四阶RK方法即可。

猜你喜欢

转载自www.cnblogs.com/philolif/p/calculation-method-10.html