偏微分方程算法之二维初边值问题(交替方向隐(ADI)格式)

news2025/3/17 3:56:15

一、研究对象

        以二维抛物型方程初边值问题为研究对象:

\left\{\begin{matrix} \frac{\partial u(x,y,t)}{\partial t}-(\frac{\partial^{2}u(x,y,t)}{\partial x^{2}}+\frac{\partial^{2}u(x,y,t)}{\partial y^{2}})=f(x,y,t),(x,y)\in \Omega=[0,a]\times [0,b],0<t\leqslant T,\\ u(x,y,0)=\varphi(x,y),(x,y)\in \Omega,\space\space\space\space(1)\\ u(0,y,t)=g_{1}(y,t),u(a,y,t)=g_{2}(y,t),0\leqslant y\leqslant b,0<t\leqslant T,\\ u(x,0,t)=g_{3}(x,t),u(x,b,t)=g_{4}(x,t),0\leqslant x\leqslant a,0<t\leqslant T \end{matrix}\right.

        为了确保连续性,公式(1)中的相关函数满足:

g_{1}(0,t)=g_{3}(0,t),g_1(b,t)=g_4(0,t),

g_{2}(0,t)=g_{3}(a,t),g_{2}(b,t)=g_{4}(a,t)

\varphi(0,y)=g_{1}(y,0),\varphi(a,y)=g_{2}(y,0),

\varphi(x,0)=g_{3}(x,0),\varphi(x,b)=g_{4}(x,0)

二、理论推导

2.1 向前欧拉格式

        首先进行网格剖分。将三维长方体空间(二维位置平面+一维时间轴)进行剖分,将区域[0,a]等分m份,区域[0,b]等分n份,区域[0,T]等分l份,有:

x_{i}=i\cdot \Delta x=\frac{ia}{m},0\leqslant i\leqslant m,

y_{j}=j\cdot \Delta y=\frac{jb}{n},0\leqslant j\leqslant n,t_{k}=k\cdot \Delta t=\frac{kT}{l},0\leqslant k\leqslant l

得到网格节点坐标(x_{i},y_{j},t_{k})。利用数值法求的数值解u(x,y,t)在网格节点(x_{i},y_{j},t_{k})处的近似值u^{k}_{i,j}

        然后将原方程弱化为节点离散方程,即

\left\{\begin{matrix} \frac{\partial u}{\partial t}|_{(x_{i},y_{j},t_{k})}- (\frac{\partial^{2}u}{\partial x^{2}}+\frac{\partial^{2}u}{\partial y^{2}})|_{(x_{i},y_{j},t_{k})}=f(x_{i},y_{j},t_{k}),0\leqslant i\leqslant m,0\leqslant j\leqslant n,0<k\leqslant l,\\ u(x_{i},y_{j},t_{0})=\varphi(x_{i},y_{j}),0\leqslant i \leqslant m,0\leqslant j\leqslant n, \space\space\space\space (2)\\ u(x_{0},y_{j},t_{k})=g_{1}(y_{j},t_{k}),u(x_{m},y_{j},t_{k})=g_{2}(y_{j},t_{k}),0\leqslant j\leqslant n,0<k\leqslant l,\\ u(x_{i},y_{0},t_{k})=g_{3}(x_{i},t_{k}),u(x_{i},y_{n},t_{k})=g_{4}(x_{i},t_{k}),0\leqslant i\leqslant m,0<k\leqslant l \end{matrix}\right.

        然后利用差商代替微商,取

\frac{\partial u}{\partial t}|_{(x_{i},y_{j},t_{k})}\approx \frac{u(x_{i},y_{j},t_{k+1})-u(x_{i},y_{j},t_{k})}{\Delta t}

\frac{\partial^{2}u}{\partial x^{2}}|_{(x_{i},y_{j},t_{k})}\approx \frac{u(x_{i+1},y_{j},t_{k})-2u(x_{i},y_{j},t_{k})+u(x_{i-1},y_{j},t_{k})}{\Delta x^{2}}

\frac{\partial^{2}u}{\partial y^{2}}|_{(x_{i},y_{j},t_{k})}\approx \frac{u(x_{i},y_{j+1},t_{k})-2u(x_{i},y_{j},t_{k})+u(x_{i},y_{j-1},t_{k})}{\Delta y^{2}}

将上面三式代入公式(2),用数值解代替精确解并忽略高阶项,可得数值格式为

\left\{\begin{matrix} \frac{u^{k+1}_{i,j}-u^{k}_{i,j}}{\Delta t}-(\frac{u^{k}_{i+1,j}-2u^{k}_{i,j}+u^{k}_{i-1,j}}{\Delta x^{2}}+\frac{u^{k}_{i,j+1}-2u^{k}_{i,j}+u^{k}_{i,j-1}}{\Delta y^{2}})=f(x_{i},y_{j},t_{k}),1\leqslant i\leqslant m-1,1\leqslant j\leqslant n-1,0\leqslant k\leqslant l-1,\\ u^{0}_{i,j}=\varphi(x_{i},y_{j}),0\leqslant i\leqslant m,0\leqslant j\leqslant n,\\ u^{k}_{0,j}=g_{1}(y_{j},t_{k}),u^{k}_{m,j}=g_{2}(y_{j},t_{k}),0\leqslant j\leqslant n,0<k\leqslant l,\\ u^{k}_{i,0}=g_{3}(x_{i},t_{k}),u^{k}_{i,n}=g_{4}(x_{i},t_{k}),0\leqslant i\leqslant m,0<k\leqslant l \end{matrix}\right.

        记r_{1}=\frac{\Delta t}{\Delta x^{2}},r_{2}=\frac{\Delta t}{\Delta y^{2}},则上式可整理为

\left\{\begin{matrix} u^{k+1}_{i,j}=r_{1}u^{k}_{i-1,j}+r_{1}u^{k}_{i+1,j}+r_{2}u^{k}_{i,j-1}+r_{2}u^{k}_{i,j+1}+(1-2r_{1}-2r_{2})u^{k}_{i,j}+f(x_{i},y_{j},t_{k})\Delta t,1\leqslant i\leqslant m-1,1\leqslant j\leqslant n-1,0\leqslant k\leqslant l-1,\\ u^{0}_{i,j}=\varphi(x_{i},y_{j}),0\leqslant i\leqslant m,0\leqslant j\leqslant n,\space\space\space\space(3)\\ u^{k}_{0,j}=g_{1}(y_{j},t_{k}),u^{k}_{m,j}=g_{2}(y_{j},t_{k}),0\leqslant j\leqslant n,0<k\leqslant l, \\ u^{k}_{i,0}=g_{3}(x_{i},t_{k}),u^{k}_{i,n}=g_{4}(x_{i},t_{k}),0\leqslant i\leqslant m,0<k\leqslant l \end{matrix}\right.

        公式(3)的截断误差为O(\Delta t +\Delta x^{2}+\Delta y^{2}),可证明其稳定性条件为r_{1}+r_{2}\leqslant \frac{1}{2}。可见,时间、空间步长的选择条件苛刻,应用价值不大,需要通过其它方式来降低使用局限性。

2.2 Crank-Nicolson格式

        显格式方法稳定性条件差,尝试采用隐格式来计算。将原节点离散方程公式(2)改为:

\left\{\begin{matrix} \frac{\partial u}{\partial t}|_{(x_{i},y_{j},t_{k+\frac{1}{2}})}- (\frac{\partial^{2}u}{\partial x^{2}}+\frac{\partial^{2}u}{\partial y^{2}})|_{(x_{i},y_{j},t_{k+\frac{1}{2}})}=f(x_{i},y_{j},t_{k+\frac{1}{2}}),0\leqslant i\leqslant m,0\leqslant j\leqslant n,0<k\leqslant l,\\ u(x_{i},y_{j},t_{0})=\varphi(x_{i},y_{j}),0\leqslant i \leqslant m,0\leqslant j\leqslant n, \space\space\space\space (4)\\ u(x_{0},y_{j},t_{k})=g_{1}(y_{j},t_{k}),u(x_{m},y_{j},t_{k})=g_{2}(y_{j},t_{k}),0\leqslant j\leqslant n,0<k\leqslant l,\\ u(x_{i},y_{0},t_{k})=g_{3}(x_{i},t_{k}),u(x_{i},y_{n},t_{k})=g_{4}(x_{i},t_{k}),0\leqslant i\leqslant m,0<k\leqslant l \end{matrix}\right.

        然后利用差商代替微商,取

\frac{\partial u}{\partial t}|_{(x_{i},y_{j},t_{k+\frac{1}{2}})}\approx \frac{u(x_{i},y_{j},t_{k+1})-u(x_{i},y_{j},t_{k})}{\Delta t}

\frac{\partial^{2}u}{\partial x^{2}}|_{(x_{i},y_{j},t_{k+\frac{1}{2}})}\approx \frac{1}{2}[\frac{\partial^{2}u}{\partial x^{2}}|_{(x_{i},y_{j},t_{k})}+\frac{\partial^{2}u}{\partial x^{2}}|_{(x_{i},y_{j},t_{k+1})}]\approx\frac{1}{2}[\frac{u(x_{i+1},y_{j},t_{k})-2u(x_{i},y_{j},t_{k})+u(x_{i-1},y_{j},t_{k})}{\Delta x^{2}}+\frac{u(x_{i+1},y_{j},t_{k+1})-2u(x_{i},y_{j},t_{k+1})+u(x_{i-1},y_{j},t_{k+1})}{\Delta x^{2}}]

\frac{\partial^{2}u}{\partial y^{2}}|_{(x_{i},y_{j},t_{k+\frac{1}{2}})}\approx \frac{1}{2}[\frac{\partial^{2}u}{\partial y^{2}}|_{(x_{i},y_{j},t_{k})}+\frac{\partial^{2}u}{\partial y^{2}}|_{(x_{i},y_{j},t_{k+1})}]\approx\frac{1}{2}[\frac{u(x_{i},y_{j+1},t_{k})-2u(x_{i},y_{j},t_{k})+u(x_{i},y_{j-1},t_{k})}{\Delta y^{2}}+\frac{u(x_{i},y_{j+1},t_{k+1})-2u(x_{i},y_{j},t_{k+1})+u(x_{i},y_{j-1},t_{k+1})}{\Delta y^{2}}]

将上面三式代入公式(4),用数值解代替精确解并忽略高阶项,可得数值格式为

\frac{u^{k+1}_{i,j}-u^{k}_{i,j}}{\Delta t}-\frac{1}{2}(\frac{u^{k+1}_{i+1,j}-2u^{k+1}_{i,j}+u^{k+1}_{i-1,j}+u^{k}_{i+1,j}-2u^{k}_{i,j}+u^{k}_{i-1,j}}{\Delta x^{2}}+\frac{u^{k+1}_{i,j+1}-2u^{k+1}_{i,j}+u^{k+1}_{i,j-1}+u^{k}_{i,j+1}-2u^{k}_{i,j}+u^{k}_{i,j-1}}{\Delta y^{2}})=f(x_{i},y_{j},t_{k+\frac{1}{2}}) \space\space(5)

        上式可整理为

\left\{\begin{matrix} -\frac{r_{1}}{2}u^{k+1}_{i-1,j}+(1+r_{1}+r_{2})u^{k+1}_{i,j}-\frac{r_{1}}{2}u^{k+1}_{i+1,j}-\frac{r_{2}}{2}u^{k+1}_{i,j-1}-\frac{r_{2}}{2}u^{k+1}_{i,j+1}=\\ \frac{r_{1}}{2}u^{k}_{i-1,j}+(1-r_{1}-r_{2})u^{k}_{i,j}+\frac{r_{1}}{2}u^{k}_{i+1,j}+\frac{r_{2}}{2}u^{k}_{i,j-1}+\frac{r_{2}}{2}u^{k}_{i,j+1}+f(x_{i},y_{j},t_{k})\Delta t, \\1\leqslant i\leqslant m-1,1\leqslant j\leqslant n-1,0\leqslant k\leqslant l-1, \\ u^{0}_{i,j}=\varphi(x_{i},y_{j}),0\leqslant i\leqslant m,0\leqslant j\leqslant n,\\ u^{k}_{0,j}=g_{1}(y_{j},t_{k}),u^{k}_{m,j}=g_{2}(y_{j},t_{k}),0\leqslant j\leqslant n,0<k\leqslant l,\\ u^{k}_{i,0}=g_{3}(x_{i},t_{k}),u^{k}_{i,n}=g_{4}(x_{i},t_{k}),0\leqslant i\leqslant m,0<k\leqslant l \end{matrix}\right.

        上式写成矩阵形式为

\begin{pmatrix} -\frac{r_{2}}{2} & & & & \\ & -\frac{r_{2}}{2} & & 0 & \\ & & \vdots & & \\ & 0 & & -\frac{r_{2}}{2} & \\ & & & & -\frac{r_{2}}{2} \end{pmatrix}\begin{pmatrix} u^{k+1}_{1,j-1}\\ u^{k+1}_{2,j-1}\\ \vdots\\ u^{k+1}_{m-2,j-1}\\ u^{k+1}_{m-1,j-1} \end{pmatrix}+\begin{pmatrix} 1+r_{1}+r_{2} & -\frac{r_{1}}{2} & & & \\ -\frac{r_{1}}{2}& 1+r_{1}+r_{2} & -\frac{r_{1}}{2} & 0 & \\ & & \ddots & & \\ & 0 & -\frac{r_{1}}{2} & 1+r_{1}+r_{2} &-\frac{r_{1}}{2} \\ & & & -\frac{r_{1}}{2}& 1+r_{1}+r_{2} \end{pmatrix}\begin{pmatrix} u^{k+1}_{1,j}\\ u^{k+1}_{2,j}\\ \vdots\\ u^{k+1}_{m-2,j}\\ u^{k+1}_{m-1,j} \end{pmatrix}+\begin{pmatrix} -\frac{r_{2}}{2} & & & & \\ & -\frac{r_{2}}{2} & & 0 & \\ & & \vdots & & \\ & 0 & & -\frac{r_{2}}{2} & \\ & & & & -\frac{r_{2}}{2} \end{pmatrix}\begin{pmatrix} u^{k+1}_{1,j+1}\\ u^{k+1}_{2,j+1}\\ \vdots\\ u^{k+1}_{m-2,j+1}\\ u^{k+1}_{m-1,j+1} \end{pmatrix}=\begin{pmatrix} \frac{r_{1}}{2}u^{k}_{0,j}+(1-r_{1}-r_{2})u^{k}_{1,j}+\frac{r_{1}}{2}u^{k}_{2,j}+\frac{r_{2}}{2}u^{k}_{1,j-1}+\frac{r_{2}}{2}u^{k}_{1,j+1}+f(x_{1},y_{j},t_{k+\frac{1}{2}})\Delta t+\frac{r_{1}}{2}u^{k+1}_{0,j}\\ \frac{r_{1}}{2}u^{k}_{1,j}+(1-r_{1}-r_{2})u^{k}_{2,j}+\frac{r_{1}}{2}u^{k}_{3,j}+\frac{r_{2}}{2}u^{k}_{2,j-1}+\frac{r_{2}}{2}u^{k}_{2,j+1}+f(x_{2},y_{j},t_{k+\frac{1}{2}})\Delta t\\ \vdots \\ \frac{r_{1}}{2}u^{k}_{m-3,j}+(1-r_{1}-r_{2})u^{k}_{m-2,j}+\frac{r_{1}}{2}u^{k}_{m-1,j}+\frac{r_{2}}{2}u^{k}_{m-2,j-1}+\frac{r_{2}}{2}u^{k}_{m-2,j+1}+f(x_{m-2},y_{j},t_{k+\frac{1}{2}})\Delta t\\ \frac{r_{1}}{2}u^{k}_{m-2,j}+(1-r_{1}-r_{2})u^{k}_{m-1,j}+\frac{r_{1}}{2}u^{k}_{m,j}+\frac{r_{2}}{2}u^{k}_{m-1,j-1}+\frac{r_{2}}{2}u^{k}_{m-1,j+1}+f(x_{m-1},y_{j},t_{k+\frac{1}{2}})\Delta t+\frac{r_{1}}{2}u^{k+1}_{m,j} \end{pmatrix}

上式为五对角矩阵的线性方程组,求解困难。

2.3 交替方向隐(ADI)格式

        为了分别求解对角矩阵,我们需要用到一个二阶中心差分记号,即算子符合:

\left\{\begin{matrix} \delta ^{2}_{x}u(x_{i},y_{j},t_{k})=u(x_{i-1},y_{j},t_{k})-2u(x_{i},y_{j},t_{k})+u(x_{i+1},y_{j},t_{k})\\ \delta ^{2}_{y}u(x_{i},y_{j},t_{k})=u(x_{i},y_{j-1},t_{k})-2u(x_{i},y_{j},t_{k})+u(x_{i},y_{j+1},t_{k})\\ \delta ^{2}_{t}u(x_{i},y_{j},t_{k-1})=u(x_{i},y_{j},t_{k})-2u(x_{i},y_{j},t_{k})+u(x_{i},y_{j},t_{k+1}) \end{matrix}\right.

及其离散形式:

\left\{\begin{matrix} \delta^{2}_{x}u^{k}_{ij}=u^{k}_{i-1,j}-2u^{k}_{ij}+u^{k}_{i+1,j},\\ \delta^{2}_{y}u^{k}_{ij}=u^{k}_{i,j-1}-2u^{k}_{ij}+u^{k}_{i,j+1},\\ \delta^{2}_{t}u^{k}_{ij}=u^{k-1}_{ij}-2u^{k}_{ij}+u^{k+1}_{ij} \end{matrix}\right.

        利用这些记号,可以将公式(5)写成

\frac{u^{k+1}_{i,j}-u^{k}_{i,j}}{\Delta t}-\frac{1}{2}(\frac{\delta^{2}_{x}u^{k+1}_{i,j}+\delta^{2}_{x}u^{k}_{i,j}}{\Delta x^{2}}+\frac{\delta^{2}_{y}u^{k+1}_{i,j}+\delta^{2}_{y}u^{k}_{i,j}}{\Delta y^{2}})=f(x_{i},y_{j},t_{k+\frac{1}{2}})

整理可得

u^{k+1}_{i,j}-u^{k}_{i,j}-\frac{1}{2}(r_{1}(\delta^{2}_{x}u^{k+1}_{i,j}+\delta^{2}_{x}u^{k}_{i,j})+r_{2}(\delta^{2}_{y}u^{k+1}_{i,j}+\delta^{2}_{y}u^{k}_{i,j}))=f(x_{i},y_{j},t_{k+\frac{1}{2}})\Delta t

再整理,可得

(1-\frac{r_{1}}{2}\delta^{2}_{x}-\frac{r_{2}}{2}\delta^{2}_{y})u^{k+1}_{i,j}=(1+\frac{r_{1}}{2}\delta^{2}_{x}+\frac{r_{2}}{2}\delta^{2}_{y})u^{k}_{i,j}+f(x_{i},y_{j},t_{k+\frac{1}{2}})\Delta t \space\space(6)

        在公式(6)左右两端分别添加辅助项\frac{r_{1}r_{2}}{4}\delta^{2}_{x}\delta^{2}_{y}u^{k+1}_{i,j}\frac{r_{1}r_{2}}{4}\delta^{2}_{x}\delta^{2}_{y}u^{k}_{i,j}。于是Crank-Nicolson格式可以修正为:

(1-\frac{r_{1}}{2}\delta^{2}_{x}-\frac{r_{2}}{2}\delta^{2}_{y}+\frac{r_{1}r_{2}}{4}\delta^{2}_{x}\delta^{2}_{y})u^{k+1}_{i,j}=(1+\frac{r_{1}}{2}\delta^{2}_{x}+\frac{r_{2}}{2}\delta^{2}_{y}+\frac{r_{1}r_{2}}{4}\delta^{2}_{x}\delta^{2}_{y})u^{k}_{i,j}+f(x_{i},y_{j},t_{k+\frac{1}{2}})\Delta t

 即

                    (1-\frac{r_{1}}{2}\delta^{2}_{x})(1-\frac{r_{2}}{2}\delta^{2}_{y})u^{k+1}_{i,j}=(1+\frac{r_{1}}{2}\delta^{2}_{x})(1+\frac{r_{2}}{2}\delta^{2}_{y})u^{k}_{i,j}+f^{k+\frac{1}{2}}_{ij}\Delta t

其中,f^{k+\frac{1}{2}}_{i,j}=f(x_{i},y_{j},t_{k+\frac{1}{2}})。为使分解更彻底,上式可以写成

(1-\frac{r_{1}}{2}\delta^{2}_{x})(1-\frac{r_{2}}{2}\delta^{2}_{y})u^{k+1}_{i,j}=(1+\frac{r_{1}}{2}\delta^{2}_{x})(1+\frac{r_{2}}{2}\delta^{2}_{y})u^{k}_{i,j}+\frac{1}{2}(1-\frac{r_{1}}{2}\delta^{2}_{x}+1+\frac{r_{1}}{2}\delta^{2}_{x})f^{k+\frac{1}{2}}_{i,j}\Delta t

进一步分解得

(1-\frac{r_{1}}{2}\delta^{2}_{x})[(1-\frac{r_{2}}{2}\delta^{2}_{y})u^{k+1}_{i,j}-\frac{1}{2}f^{k+\frac{1}{2}}_{i,j}\Delta t]=(1+\frac{r_{1}}{2}\delta^{2}_{x})[(1+\frac{r_{2}}{2}\delta^{2}_{y})u^{k}_{i,j}+\frac{1}{2}f^{k+\frac{1}{2}}_{i,j}\Delta t] \space\space\space\space (7)

        引入中间变量V_{i,j},使公式(7)中最右端方括号内的元素满足:

(1+\frac{r_{2}}{2}\delta^{2}_{y})u^{k}_{i,j}+\frac{1}{2}f^{k+\frac{1}{2}}_{i,j}\Delta t =(1-\frac{r_{1}}{2}\delta^{2}_{x})V_{i,j} \space\space(8)

        再由于差分算子具有可交换性,由公式(7)有:

(1-\frac{r_{2}}{2}\delta^{2}_{y})u^{k+1}_{i,j}-\frac{1}{2}f^{k+\frac{1}{2}}_{i,j}\Delta t =(1+\frac{r_{1}}{2}\delta^{2}_{x})V_{i,j} \space\space(9)

       2.3.1 Peaceman-Rachford格式

        组合公式(8)和公式(9),可得Peaceman-Rachford格式:

\left\{\begin{matrix} (1-\frac{r_{1}}{2}\delta^{2}_{x})V_{i,j}=(1+\frac{r_{2}}{2}\delta^{2}_{y})u^{k}_{i,j}+\frac{1}{2}f^{k+\frac{1}{2}}_{i,j}\Delta t \\ (1+\frac{r_{1}}{2}\delta^{2}_{x})V_{i,j}=(1-\frac{r_{2}}{2}\delta^{2}_{y})u^{k+1}_{i,j}-\frac{1}{2}f^{k+\frac{1}{2}}_{i,j}\Delta t \end{matrix}\right.(10)

将公式(10)中两式相减,整理后可得:

V_{i,j}=\frac{1}{2}(1+\frac{r_{2}}{2}\delta^{2}_{y})u^{k}_{i,j}+\frac{1}{2}(1-\frac{r_{2}}{2}\delta^{2}_{y})u^{k+1}_{i,j}

从而有:

\left\{\begin{matrix} V_{0,j}=\frac{1}{2}(1+\frac{r_{2}}{2}\delta^{2}_{y})u^{k}_{0,j}+\frac{1}{2}(1-\frac{r_{2}}{2}\delta^{2}_{y})u^{k+1}_{0,j}\\ V_{m,j}=\frac{1}{2}(1+\frac{r_{2}}{2}\delta^{2}_{y})u^{k}_{m,j}+\frac{1}{2}(1-\frac{r_{2}}{2}\delta^{2}_{y})u^{k+1}_{m,j} \end{matrix}\right.(11)

公式(10)和(11)即为完整的Peaceman-Rachford格式。整个求解过程从k=0第0层开始逐层求解。这种方式是关于x方向和y方向交替求解的隐式方法,称为ADI方法。将其写成差分形式:

\left\{\begin{matrix} -\frac{r_{1}}{2}V_{i-1,j}+(1+r_{1})V_{i,j}-\frac{r_{1}}{2}V_{i+1,j}=\frac{r_{2}}{2}u^{k}_{i,j-1}+(1-r_{2})u^{k}_{i,j}+\frac{r_{2}}{2}u^{k}_{i,j+1}+\frac{1}{2}f^{k+\frac{1}{2}}_{i,j}\Delta t\\ -\frac{r_{2}}{2}u^{k+1}_{i,j-1}+(1+r_{2})u^{k+1}_{i,j}-\frac{r_{2}}{2}u^{k+1}_{i,j+1}=\frac{r_{1}}{2}(V_{i-1,j}+V_{i+1,j})+(1-r_{1})V_{i,j}+\frac{1}{2}f^{k+\frac{1}{2}}_{i,j}\Delta t \end{matrix}\right.

其中,1\leqslant i\leqslant m-1,1\leqslant j\leqslant n-1,0\leqslant k\leqslant l-1,

\left\{\begin{matrix} V_{0,j}=\frac{1-r_{2}}{2}u^{k}_{0,j}+\frac{1+r_{2}}{2}u^{k+1}_{0,j}+\frac{r_{2}}{4}(u^{k}_{0,j-1}+u^{k}_{0,j+1}-u^{k+1}_{0,j-1}-u^{k+1}_{0,j+1})\\ V_{m,j}=\frac{1-r_{2}}{2}u^{k}_{m,j}+\frac{1+r_{2}}{2}u^{k+1}_{m,j}+\frac{r_{2}}{4}(u^{k}_{m,j-1}+u^{k}_{m,j+1}-u^{k+1}_{m,j-1}-u^{k+1}_{m,j+1}) \end{matrix}\right.

        2.3.2 D’Yakonov格式

        公式        (1-\frac{r_{1}}{2}\delta^{2}_{x})(1-\frac{r_{2}}{2}\delta^{2}_{y})u^{k+1}_{i,j}=(1+\frac{r_{1}}{2}\delta^{2}_{x})(1+\frac{r_{2}}{2}\delta^{2}_{y})u^{k}_{i,j}+f^{k+\frac{1}{2}}_{ij}\Delta t还可以分解为:

\left\{\begin{matrix} (1-\frac{r_{1}}{2}\delta^{2}_{x})V_{i,j}=(1+\frac{r_{1}}{2}\delta^{2}_{x})(1+\frac{r_{2}}{2}\delta^{2}_{y})u^{k}_{i,j}+f^{k+\frac{1}{2}}_{i,j}\Delta t\\ (1-\frac{r_{2}}{2}\delta^{2}_{y})u^{k+1}_{i,j}=V_{i,j} \end{matrix}\right.

V_{0,j},V_{m,j}可以直接从上式的第2式中获得:

\left\{\begin{matrix} V_{0,j}=(1-\frac{r_{2}}{2}\delta^{2}_{y})u^{k+1}_{0,j} \\ V_{m,j}=(1-\frac{r_{2}}{2}\delta^{2}_{y})u^{k+1}_{m,j} \end{matrix}\right.

        将其写成差分形式:

\left\{\begin{matrix} -\frac{r_{1}}{2}V_{i-1,j}+(1+r_{1})V_{i,j}-\frac{r_{1}}{2}V_{i+1,j}=\frac{r_{1}(1-r_{2})}{2}(u^{k}_{i-1,j}+u^{k}_{i+1,j}) +\frac{r_{2}(1-r_{1})}{2}(u^{k}_{i,j-1}+u^{k}_{i,j+1}) +\\(1-r_{1})(1-r_{2})u^{k}_{i,j}+f^{k+\frac{1}{2}}_{i,j}\Delta t +\frac{r_{1}r_{2}}{4}(u^{k}_{i-1,j-1}+u^{k}_{i+1,j-1}+u^{k}_{i-1,j+1}+u^{k}_{i+1,j+1}) \\ -\frac{r_{2}}{2}u^{k+1}_{i,j-1}+(1+r_{2})u^{k+1}_{i,j}-\frac{r_{2}}{2}u^{k+1}_{i,j+1}=V_{i,j} \end{matrix}\right.

其中,1\leqslant i\leqslant m-1,1\leqslant j\leqslant n-1,0\leqslant k\leqslant l-1,

\left\{\begin{matrix} V_{0,j}=-\frac{r_{2}}{2}(u^{k+1}_{0,j-1}+u^{k+1}_{0,j+1})+(1+r_{2})u^{k+1}_{0,j} \\ V_{m,j}=-\frac{r_{2}}{2}(u^{k+1}_{m,j-1}+u^{k+1}_{m,j+1})+(1+r_{2})u^{k+1}_{m,j} \end{matrix}\right.

        2.3.3 Douglas格式

          公式        (1-\frac{r_{1}}{2}\delta^{2}_{x})(1-\frac{r_{2}}{2}\delta^{2}_{y})u^{k+1}_{i,j}=(1+\frac{r_{1}}{2}\delta^{2}_{x})(1+\frac{r_{2}}{2}\delta^{2}_{y})u^{k}_{i,j}+f^{k+\frac{1}{2}}_{ij}\Delta t还可以分解为:

(1-\frac{r_{1}}{2}\delta^{2}_{x})(1-\frac{r_{2}}{2}\delta^{2}_{y})(u^{k+1}_{i,j}-u^{k}_{i,j})=(r_{1}\delta^{2}_{x}+r_{2}\delta^{2}_{y})u^{k}_{i,j}+f^{k+\frac{1}{2}}_{i,j})\Delta t

        借助中间变量V_{i,j}可以分解为下式:

\left\{\begin{matrix} (1-\frac{r_{1}}{2}\delta^{2}_{x})V_{i,j}=(r_{1}\delta^{2}_{x}+r_{2}\delta^{2}_{y})u^{k}_{i,j}+f^{k+\frac{1}{2}}_{i,j}\Delta t \\ (1-\frac{r_{2}}{2}\delta^{2}_{y})u^{k+1}_{i,j}=V_{i,j}+(1-\frac{r_{2}}{2}\delta^{2}_{y})u^{k}_{i,j} \end{matrix}\right.

V_{0,j},V_{m,j}可以直接从上式的第2式中获得:

\left\{\begin{matrix} V_{0,j}=(1-\frac{r_{2}}{2}\delta^{2}_{y})u^{k+1}_{0,j} -(1-\frac{r_{2}}{2}\delta^{2}_{y})u^{k}_{0,j} \\ V_{m,j}=(1-\frac{r_{2}}{2}\delta^{2}_{y})u^{k+1}_{m,j}-(1-\frac{r_{2}}{2}\delta^{2}_{y})u^{k}_{m,j} \end{matrix}\right.

 将其写成差分形式:

\left\{\begin{matrix} -\frac{r_{1}}{2}V_{i-1,j}+(1+r_{1})V_{i,j}-\frac{r_{1}}{2}V_{i+1,j}=r_{1}(u^{k}_{i-1,j}-2u^{k}_{i,j}+u^{k}_{i+1,j}) +r_{2}(u^{k}_{i,j-1}-2u^{k}_{i,j}+u^{k}_{i,j+1}) +f^{k+\frac{1}{2}}_{i,j}\Delta t \\ -\frac{r_{2}}{2}u^{k+1}_{i,j-1}+(1+r_{2})u^{k+1}_{i,j}-\frac{r_{2}}{2}u^{k+1}_{i,j+1}=V_{i,j} -\frac{r_{2}}{2}(u^{k}_{i,j-1}+u^{k}_{i,j+1})+(1+r_{2})u^{k}_{i,j} \end{matrix}\right.

其中,1\leqslant i\leqslant m-1,1\leqslant j\leqslant n-1,0\leqslant k\leqslant l-1,

\left\{\begin{matrix} V_{0,j}= -\frac{r_{2}}{2}(u^{k+1}_{0,j-1}+u^{k+1}_{0,j+1}-u^{k}_{0,j-1}-u^{k}_{0,j+1})+(1+r_{2})(u^{k+1}_{0,j} - u^{k}_{0,j}) \\ V_{m,j}=-\frac{r_{2}}{2}(u^{k+1}_{m,j-1}+u^{k+1}_{m,j+1}-u^{k}_{m,j-1}-u^{k}_{m,j+1})+(1+r_{2})(u^{k+1}_{m,j} - u^{k}_{m,j}) \end{matrix}\right.

三、算例实现

        二维抛物型方程初边值问题:

\left\{\begin{matrix} \frac{\partial u}{\partial t}-(\frac{\partial^{2}u}{\partial x^{2}}+\frac{\partial^{2}u}{\partial y^{2}})=-\frac{3}{2}e^{(x+y)/2-t},(x,y)\in [0,1]\times[0,1],0<t\leqslant 1,\\ u(x,y,0)=e^{(x+y)/2},(x,y)\in[0,1]\times[0,1],\\ u(0,y,t)=e^{y/2-t},u(1,y,t)=e^{(1+y)/2-t},0\leqslant y\leqslant 1,0<t\leqslant 1,\\ u(x,0,t)=e^{x/2-t},u(x,1,t)=e^{(1+x)/2-t},0\leqslant x\leqslant 1,0<t\leqslant 1 \end{matrix}\right.

已知精确解为u(x,y,t)=e^{(x+y)/2-t}。分别计算两种不同步长条件下的数值解,并输出18个节点处的数值解和误差。【18个点分别为:(0.25i,0.25j,0.50)及(0.25i,0.25j,1.00),其中i,j=1,2,3.】

条件1:\Delta x =\frac{1}{60},\Delta y =\frac{1}{40},\Delta t =\frac{1}{20}

条件2:\Delta x =\frac{1}{120},\Delta y =\frac{1}{80},\Delta t =\frac{1}{40}

3.1 Peaceman-Rachford格式

        代码如下:


#include <cmath>
#include<stdlib.h>
#include<stdio.h>

int main(int argc, char* argv[])
{
        int i, j, k, m, n, L, gap_i, gap_j;
        double a, b, T, r1, r2, dx, dy, dt;
        double  *x, *y, *t, ***u, **v;
        double *a1, *b1, *c1, *d1, *a2, *b2, *c2, *d2, tmid, *ans, temp;
        double f(double x, double y, double t);
        double phi(double x, double y);
        double g1(double y, double t);
        double g2(double y, double t);
        double g3(double x, double t);
        double g4(double x, double t);
        double *chase_algorithm(double *a, double *b, double *c, double *d, int n);
        double exact(double x, double y, double t);

        a=1.0;
        b=1.0;
        T=1.0;
        m=60;
        n=40;
        L=20;
        dx=a/m;
        dy=b/n;
        dt=T/L;
        r1=dt/(dx*dx);
        r2=dt/(dy*dy);
        printf("m=%d, n=%d, L=%d\n", m, n, L);
        printf("r1=%.4f,   r2=%.4f\n", r1, r2);

        x=(double *)malloc(sizeof(double)*(m+1));
        for(i=0;i<=m;i++)
                x[i]=i*dx;

        y=(double *)malloc(sizeof(double)*(n+1));
        for(j=0;j<=n;j++)
                y[j]=j*dy;

        t=(double *)malloc(sizeof(double)*(L+1));
        for(k=0;k<=L;k++)
                t[k]=k*dt;

        u=(double ***)malloc(sizeof(double *)*((m+1)*(n+1)*(L+1)));
        for(i=0;i<=m;i++)
                u[i]=(double **)malloc(sizeof(double *)*((n+1)*(L+1)));
        for(i=0;i<=m;i++)
        {
                for(j=0;j<=n;j++)
                        u[i][j]=(double *)malloc(sizeof(double)*(L+1));
        }
                                                         
        v=(double **)malloc(sizeof(double *)*(m+1));
        for(i=0;i<=m;i++)
                v[i]=(double *)malloc(sizeof(double)*(n+1));

        for(i=0;i<=m;i++)
        {
                for(j=0;j<=n;j++)
                {
                        u[i][j][0]=phi(x[i], y[j]);
                }
        }

        for(k=1;k<=L;k++)
        {
                for(j=0;j<=n;j++)
                {
                         u[0][j][k]=g1(y[j], t[k]);
                         u[m][j][k]=g2(y[j], t[k]);
                }
                for(i=1;i<=m-1;i++)
                {
                         u[i][0][k]=g3(x[i], t[k]);
                         u[i][n][k]=g4(x[i], t[k]);
                }
        }

        a1=(double *)malloc(sizeof(double)*(m-1));
        b1=(double *)malloc(sizeof(double)*(m-1));
        c1=(double *)malloc(sizeof(double)*(m-1));
        d1=(double *)malloc(sizeof(double)*(m-1));
        for(i=0;i<m-1;i++)
        {
                a1[i]=-r1/2.0;
                b1[i]=1.0+r1;
                c1[i]=a1[i];
        }

        a2=(double *)malloc(sizeof(double)*(n-1));
        b2=(double *)malloc(sizeof(double)*(n-1));
        c2=(double *)malloc(sizeof(double)*(n-1));
        d2=(double *)malloc(sizeof(double)*(n-1));
        for(j=0;j<n-1;j++)
        {
                a2[j]=-r2/2.0;
                b2[j]=1.0+r2;
                c2[j]=a2[j];
        }

        for(k=0;k<L;k++)
        {
                tmid=(t[k]+t[k+1])/2.0;
                for(j=1;j<=n-1;j++)
                {
                        for(i=1;i<=m-1;i++)
                                  d1[i-1]=r2*(u[i][j-1][k]+u[i][j+1][k])/2.0+(1.0-r2)*u[i][j][k]+f(x[i], y[j], tmid)*dt/2.0;
                        v[0][j]=(1-r2)*u[0][j][k]/2.0+(1+r2)*u[0][j][k+1]/2.0+r2*(u[0][j-1][k]+u[0][j+1][k]-u[0][j-1][k+1]-u[0][j+1][k+1])/4.0;
                        v[m][j]=(1-r2)*u[m][j][k]/2.0+(1+r2)*u[m][j][k+1]/2.0+r2*(u[m][j-1][k]+u[m][j+1][k]-u[m][j-1][k+1]-u[m][j+1][k+1])/4.0;
                        d1[0]=d1[0]+r1*v[0][j]/2.0;
                        d1[m-2]=d1[m-2]+r1*v[m][j]/2.0;
                        ans=chase_algorithm(a1, b1, c1, d1, m-1);

                        for(i=1;i<=m-1;i++)
                                v[i][j]=ans[i-1];
                        free(ans);
                }

                for(i=1;i<=m-1;i++)
                {
                        for(j=1;j<=n-1;j++)
                                d2[j-1]=r1*(v[i-1][j]+v[i+1][j])/2.0+(1.0-r1)*v[i][j]+f(x[i], y[j], tmid)*dt/2.0;
                        d2[0]=d2[0]+r2*u[i][0][k+1]/2.0;
                        d2[n-2]=d2[n-2]+r2*u[i][n][k+1]/2.0;
                        ans=chase_algorithm(a2, b2, c2, d2, n-1);

                        for(j=1;j<=n-1;j++)
                                u[i][j][k+1]=ans[j-1];
                        free(ans);
                }
        }

        gap_i=m/4;
        gap_j=n/4;

        for(i=gap_i;i<=m-1;i=i+gap_i)
        {
                for(j=gap_j;j<=n-1;j=j+gap_j)
                {
                        temp=fabs(exact(x[i], y[j], T/2.0)-u[i][j][L/2]);
                        printf("(%.2f, %.2f, 0.50)     y=%f,    err=%.4e\n", x[i], y[j], u[i][j][L/2], temp);
                }
        }

        printf("\n");
        printf("\n");

        for(i=gap_i;i<=m-1;i=i+gap_i)
        {
                for(j=gap_j;j<=n-1;j=j+gap_j)
                {
                        temp=fabs(exact(x[i], y[j], T)-u[i][j][L]);
                        printf("(%.2f, %.2f, 1.00)     y=%f,    err=%.4e\n", x[i], y[j], u[i][j][L], temp);
                }
        }

        free(x); free(y); free(t);
        free(a1); free(b1); free(c1); free(d1);
        free(a2); free(b2); free(c2); free(d2);

        for(i=0;i<=m;i++)
        {
                for(j=0;j<=n;j++)
                      free(u[i][j]);
        }
        for(i=0;i<=m;i++)
        {
                free(u[i]); free(v[i]);
        }

        free(u); free(v);

        return 0;
}



double f(double x, double y, double t)
{
        return -3.0*exp((x+y)/2.0-t)/2.0;
}
double phi(double x, double y)
{
        return exp((x+y)/2.0);
}
double g1(double y, double t)
{
        return exp(y/2.0-t);
}
double g2(double y, double t)
{
        return exp((1.0+y)/2.0-t);
}
double g3(double x, double t)
{
        return exp(x/2.0-t);
}
double g4(double x, double t)
{
        return exp((1.0+x)/2.0-t);
}
double * chase_algorithm(double *a, double *b, double *c, double *d, int n)
{
        int i;
        double *ans, *g, *w, p;

        ans=(double *)malloc(sizeof(double)*n);
        g=(double *)malloc(sizeof(double)*n);
        w=(double *)malloc(sizeof(double)*n);
        g[0]=d[0]/b[0];
        w[0]=c[0]/b[0];

        for(i=1;i<n;i++)
        {
                p=b[i]-a[i]*w[i-1];
                g[i]=(d[i]-a[i]*g[i-1])/p;
                w[i]=c[i]/p;
        }

        ans[n-1]=g[n-1];
        i=n-2;
        do
        {
                ans[i]=g[i]-w[i]*ans[i+1];
                i=i-1;
        }while(i>=0);

        free(g);free(w);
        return ans;
}
double exact(double x, double y, double t)
{
        return exp((x+y)/2.0-t);
}

当m=60,n=40,L=20时,结果如下:

m=60, n=40, L=20
r1=180.0000,   r2=80.0000
(0.25, 0.25, 0.50)     y=0.778814,    err=1.2876e-05
(0.25, 0.50, 0.50)     y=0.882514,    err=1.7519e-05
(0.25, 0.75, 0.50)     y=1.000015,    err=1.4611e-05
(0.50, 0.25, 0.50)     y=0.882514,    err=1.7519e-05
(0.50, 0.50, 0.50)     y=1.000024,    err=2.3999e-05
(0.50, 0.75, 0.50)     y=1.133168,    err=1.9757e-05
(0.75, 0.25, 0.50)     y=1.000015,    err=1.4611e-05
(0.75, 0.50, 0.50)     y=1.133168,    err=1.9757e-05
(0.75, 0.75, 0.50)     y=1.284042,    err=1.6707e-05


(0.25, 0.25, 1.00)     y=0.472374,    err=7.8105e-06
(0.25, 0.50, 1.00)     y=0.535272,    err=1.0627e-05
(0.25, 0.75, 1.00)     y=0.606540,    err=8.8626e-06
(0.50, 0.25, 1.00)     y=0.535272,    err=1.0627e-05
(0.50, 0.50, 1.00)     y=0.606545,    err=1.4557e-05
(0.50, 0.75, 1.00)     y=0.687301,    err=1.1984e-05
(0.75, 0.25, 1.00)     y=0.606540,    err=8.8626e-06
(0.75, 0.50, 1.00)     y=0.687301,    err=1.1984e-05
(0.75, 0.75, 1.00)     y=0.778811,    err=1.0134e-05

当m=120,n=80,L=40时,结果如下:

m=120, n=80, L=40
r1=360.0000,   r2=160.0000
(0.25, 0.25, 0.50)     y=0.778804,    err=3.2127e-06
(0.25, 0.50, 0.50)     y=0.882501,    err=4.3716e-06
(0.25, 0.75, 0.50)     y=1.000004,    err=3.6449e-06
(0.50, 0.25, 0.50)     y=0.882501,    err=4.3717e-06
(0.50, 0.50, 0.50)     y=1.000006,    err=5.9884e-06
(0.50, 0.75, 0.50)     y=1.133153,    err=4.9297e-06
(0.75, 0.25, 0.50)     y=1.000004,    err=3.6449e-06
(0.75, 0.50, 0.50)     y=1.133153,    err=4.9297e-06
(0.75, 0.75, 0.50)     y=1.284030,    err=4.1668e-06


(0.25, 0.25, 1.00)     y=0.472369,    err=1.9488e-06
(0.25, 0.50, 1.00)     y=0.535264,    err=2.6518e-06
(0.25, 0.75, 1.00)     y=0.606533,    err=2.2109e-06
(0.50, 0.25, 1.00)     y=0.535264,    err=2.6518e-06
(0.50, 0.50, 1.00)     y=0.606534,    err=3.6325e-06
(0.50, 0.75, 1.00)     y=0.687292,    err=2.9903e-06
(0.75, 0.25, 1.00)     y=0.606533,    err=2.2109e-06
(0.75, 0.50, 1.00)     y=0.687292,    err=2.9902e-06
(0.75, 0.75, 1.00)     y=0.778803,    err=2.5275e-06

3.2 D’Yakonov格式

代码如下:


#include <cmath>
#include <stdlib.h>
#include <stdio.h>


int main(int argc, char* argv[])
{
        int i, j, k, m, n, L, gap_i, gap_j;
        double a, b, T, r1, r2, dx, dy, dt;
        double *x, *y, *t, ***u, **v;
        double *a1, *b1, *c1, *d1, *a2, *b2, *c2, *d2, tmid, *ans, temp;
        double f(double x, double y, double t);
        double phi(double x, double y);
        double g1(double y, double t);
        double g2(double y, double t);
        double g3(double x, double t);
        double g4(double x, double t);
        double *chase_algorithm(double *a, double *b, double *c, double *d, int n);
        double exact(double x, double y, double t);

        a=1.0;
        b=1.0;
        T=1.0;
        m=60;
        n=40;
        L=20;
        dx=a/m;
        dy=b/n;
        dt=T/L;
        r1=dt/(dx*dx);
        r2=dt/(dy*dy);
        printf("m=%d, n=%d, L=%d\n", m, n, L);
        printf("r1=%.4f,   r2=%.4f\n", r1, r2);

        x=(double *)malloc(sizeof(double)*(m+1));
        for(i=0;i<=m;i++)
                x[i]=i*dx;

        y=(double *)malloc(sizeof(double)*(n+1));
        for(j=0;j<=n;j++)
                y[j]=j*dy;
        t=(double *)malloc(sizeof(double)*(L+1));
        for(k=0;k<=L;k++)
                t[k]=k*dt;

        u=(double ***)malloc(sizeof(double *)*((m+1)*(n+1)*(L+1)));
        for(i=0;i<=m;i++)
                u[i]=(double **)malloc(sizeof(double *)*((n+1)*(L+1)));
        for(i=0;i<=m;i++)
        {
                for(j=0;j<=n;j++)
                u[i][j]=(double *)malloc(sizeof(double)*(L+1));
        }
        
        v=(double **)malloc(sizeof(double *)*(m+1));
        for(i=0;i<=m;i++)
                v[i]=(double *)malloc(sizeof(double)*(n+1));

        for(i=0;i<=m;i++)
        {
                for(j=0;j<=n;j++)
                {
                        u[i][j][0]=phi(x[i], y[j]);
                }
        }

        for(k=1;k<=L;k++)
        {
                for(j=0;j<=n;j++)
                {
                        u[0][j][k]=g1(y[j], t[k]);
                        u[m][j][k]=g2(y[j], t[k]);
                }
                for(i=1;i<=m-1;i++)
                {
                        u[i][0][k]=g3(x[i], t[k]);
                        u[i][n][k]=g4(x[i], t[k]);
                }
        }

        a1=(double *)malloc(sizeof(double)*(m-1));
        b1=(double *)malloc(sizeof(double)*(m-1));
        c1=(double *)malloc(sizeof(double)*(m-1));
        d1=(double *)malloc(sizeof(double)*(m-1));
        for(i=0;i<m-1;i++)
        {
                a1[i]=-r1/2.0;
                b1[i]=1.0+r1;
                c1[i]=a1[i];
        }

        a2=(double *)malloc(sizeof(double)*(n-1));
        b2=(double *)malloc(sizeof(double)*(n-1));
        c2=(double *)malloc(sizeof(double)*(n-1));
        d2=(double *)malloc(sizeof(double)*(n-1));
        for(j=0;j<n-1;j++)
        {
                a2[j]=-r2/2.0;
                b2[j]=1.0+r2;
                c2[j]=a2[j];
        }

        for(k=0;k<L;k++)
        {
                tmid=(t[k]+t[k+1])/2.0;
                for(j=1;j<=n-1;j++)
                {
                        for(i=1;i<=m-1;i++)
                        {
                                temp=r2*(1-r1)*(u[i][j-1][k]+u[i][j+1][k])/2.0+r1*(1-r2)*(u[i-1][j][k]+u[i+1][j][k])/2.0+(1-r1)*(1-r2)*u[i][j][k];
                                d1[i-1]=temp+f(x[i], y[j], tmid)*dt+r1*r2*(u[i-1][j-1][k]+u[i+1][j-1][k]+u[i-1][j+1][k]+u[i+1][j+1][k])/4.0;
                        }
                        v[0][j]=(1+r2)*u[0][j][k+1]-r2*(u[0][j-1][k+1]+u[0][j+1][k+1])/2.0;
                        v[m][j]=(1+r2)*u[m][j][k+1]-r2*(u[m][j-1][k+1]+u[m][j+1][k+1])/2.0;
                        d1[0]=d1[0]+r1*v[0][j]/2.0;
                        d1[m-2]=d1[m-2]+r1*v[m][j]/2.0;
                        ans=chase_algorithm(a1, b1, c1, d1, m-1);

                        for(i=1;i<=m-1;i++)
                                v[i][j]=ans[i-1];
                        free(ans);
                }

                for(i=1;i<=m-1;i++)
                {
                        for(j=1;j<=n-1;j++)
                                d2[j-1]=v[i][j];
                        d2[0]=d2[0]+r2*u[i][0][k+1]/2.0;
                        d2[n-2]=d2[n-2]+r2*u[i][n][k+1]/2.0;
                        ans=chase_algorithm(a2, b2, c2, d2, n-1);

                        for(j=1;j<=n-1;j++)
                                u[i][j][k+1]=ans[j-1];

                        free(ans);
                }
        }

        gap_i=m/4;
        gap_j=n/4;

        for(i=gap_i;i<=m-1;i=i+gap_i)
        {
                for(j=gap_j;j<=n-1;j=j+gap_j)
                {
                        temp=fabs(exact(x[i], y[j], T/2.0)-u[i][j][L/2]);
                        printf("(%.2f, %.2f, 0.50)     y=%f,    err=%.4e\n", x[i], y[j], u[i][j][L/2], temp);
                }
        }

        printf("\n");
        printf("\n");

        for(i=gap_i;i<=m-1;i=i+gap_i)
        {
                for(j=gap_j;j<=n-1;j=j+gap_j)
                {
                        temp=fabs(exact(x[i], y[j], T)-u[i][j][L]);
                        printf("(%.2f, %.2f, 1.00)     y=%f,    err=%.4e\n", x[i], y[j], u[i][j][L], temp);
                }
        }

        free(x); free(y); free(t);
        free(a1); free(b1); free(c1); free(d1);
        free(a2); free(b2); free(c2); free(d2);
        for(i=0;i<=m;i++)
        {
                for(j=0;j<=n;j++)
                        free(u[i][j]);
        }

        for(i=0;i<=m;i++)
        {
                free(u[i]);free(v[i]);
        }

        free(u); free(v);

        return 0;
}


double f(double x, double y, double t)
{
        return -3.0*exp((x+y)/2.0-t)/2.0;
}
double phi(double x, double y)
{
        return exp((x+y)/2.0);
}
double g1(double y, double t)
{
        return exp(y/2.0-t);
}
double g2(double y, double t)
{
        return exp((1.0+y)/2.0-t);
}
double g3(double x, double t)
{
        return exp(x/2.0-t);
}
double g4(double x, double t)
{
        return exp((1.0+x)/2.0-t);
}
double *chase_algorithm(double *a, double *b, double *c, double *d, int n)
{
        int i;
        double *ans, *g, *w, p;

        ans=(double *)malloc(sizeof(double)*n);
        g=(double *)malloc(sizeof(double)*n);
        w=(double *)malloc(sizeof(double)*n);
        g[0]=d[0]/b[0];
        w[0]=c[0]/b[0];

        for(i=1;i<n;i++)
        {
                p=b[i]-a[i]*w[i-1];
                g[i]=(d[i]-a[i]*g[i-1])/p;
                w[i]=c[i]/p;
        }

        ans[n-1]=g[n-1];
        i=n-2;
        do
        {
                ans[i]=g[i]-w[i]*ans[i+1];
                i=i-1;
        }while(i>=0);

        free(g); free(w);

        return ans;
}
double exact(double x, double y, double t)
{
        return exp((x+y)/2.0-t);
}

 


当m=60,n=40,L=20时,结果如下:

m=60, n=40, L=20
r1=180.0000,   r2=80.0000
(0.25, 0.25, 0.50)     y=0.778814,    err=1.2876e-05
(0.25, 0.50, 0.50)     y=0.882514,    err=1.7519e-05
(0.25, 0.75, 0.50)     y=1.000015,    err=1.4611e-05
(0.50, 0.25, 0.50)     y=0.882514,    err=1.7519e-05
(0.50, 0.50, 0.50)     y=1.000024,    err=2.3999e-05
(0.50, 0.75, 0.50)     y=1.133168,    err=1.9757e-05
(0.75, 0.25, 0.50)     y=1.000015,    err=1.4611e-05
(0.75, 0.50, 0.50)     y=1.133168,    err=1.9757e-05
(0.75, 0.75, 0.50)     y=1.284042,    err=1.6707e-05


(0.25, 0.25, 1.00)     y=0.472374,    err=7.8105e-06
(0.25, 0.50, 1.00)     y=0.535272,    err=1.0627e-05
(0.25, 0.75, 1.00)     y=0.606540,    err=8.8626e-06
(0.50, 0.25, 1.00)     y=0.535272,    err=1.0627e-05
(0.50, 0.50, 1.00)     y=0.606545,    err=1.4557e-05
(0.50, 0.75, 1.00)     y=0.687301,    err=1.1984e-05
(0.75, 0.25, 1.00)     y=0.606540,    err=8.8626e-06
(0.75, 0.50, 1.00)     y=0.687301,    err=1.1984e-05
(0.75, 0.75, 1.00)     y=0.778811,    err=1.0134e-05

当m=120,n=80,L=40时,结果如下:

m=120, n=80, L=40
r1=360.0000,   r2=160.0000
(0.25, 0.25, 0.50)     y=0.778804,    err=3.2127e-06
(0.25, 0.50, 0.50)     y=0.882501,    err=4.3716e-06
(0.25, 0.75, 0.50)     y=1.000004,    err=3.6449e-06
(0.50, 0.25, 0.50)     y=0.882501,    err=4.3717e-06
(0.50, 0.50, 0.50)     y=1.000006,    err=5.9884e-06
(0.50, 0.75, 0.50)     y=1.133153,    err=4.9297e-06
(0.75, 0.25, 0.50)     y=1.000004,    err=3.6449e-06
(0.75, 0.50, 0.50)     y=1.133153,    err=4.9297e-06
(0.75, 0.75, 0.50)     y=1.284030,    err=4.1668e-06


(0.25, 0.25, 1.00)     y=0.472369,    err=1.9488e-06
(0.25, 0.50, 1.00)     y=0.535264,    err=2.6518e-06
(0.25, 0.75, 1.00)     y=0.606533,    err=2.2109e-06
(0.50, 0.25, 1.00)     y=0.535264,    err=2.6518e-06
(0.50, 0.50, 1.00)     y=0.606534,    err=3.6325e-06
(0.50, 0.75, 1.00)     y=0.687292,    err=2.9903e-06
(0.75, 0.25, 1.00)     y=0.606533,    err=2.2109e-06
(0.75, 0.50, 1.00)     y=0.687292,    err=2.9902e-06
(0.75, 0.75, 1.00)     y=0.778803,    err=2.5275e-06

3.3 Douglas格式

代码如下:


#include <stdlib.h>
#include <stdio.h>

int main(int argc, char* argv[])
{
        int i, j, k, m, n, L, gap_i, gap_j;
        double a, b, T, r1, r2, dx, dy, dt;
        double *x, *y, *t, ***u, **v;
        double *a1, *b1, *c1, *d1, *a2, *b2, *c2, *d2, tmid, *ans, temp;
        double f(double x, double y, double t);
        double phi(double x, double y);
        double g1(double y, double t);
        double g2(double y, double t);
        double g3(double x, double t);
        double g4(double x, double t);
        double *chase_algorithm(double *a, double *b, double *c, double *d, int n);
        double exact(double x, double y, double t);

        a=1.0;
        b=1.0;
        T=1.0;
        m=60;
        n=40;
        L=20;
        dx=a/m;
        dy=b/n;
        dt=T/L;
        r1=dt/(dx*dx);
        r2=dt/(dy*dy);
        printf("m=%d, n=%d, L=%d\n", m, n, L);
        printf("r1=%.4f,   r2=%.4f\n", r1, r2);

        x=(double *)malloc(sizeof(double)*(m+1));
        for(i=0;i<=m;i++)
                x[i]=i*dx;

        y=(double *)malloc(sizeof(double)*(n+1));
        for(j=0;j<=n;j++)
                y[j]=j*dy;

        t=(double *)malloc(sizeof(double)*(L+1));
        for(k=0;k<=L;k++)
                t[k]=k*dt;

        u=(double ***)malloc(sizeof(double *)*((m+1)*(n+1)*(L+1)));
        for(i=0;i<=m;i++)
                u[i]=(double **)malloc(sizeof(double *)*((n+1)*(L+1)));
        for(i=0;i<=m;i++)
        {
                for(j=0;j<=n;j++)
                        u[i][j]=(double *)malloc(sizeof(double)*(L+1));
        }

        v=(double **)malloc(sizeof(double *)*(m+1));
        for(i=0;i<=m;i++)
                v[i]=(double *)malloc(sizeof(double)*(n+1));

        for(i=0;i<=m;i++)
        {
                for(j=0;j<=n;j++)
                {
                         u[i][j][0]=phi(x[i], y[j]);
                }
        }

        for(k=1;k<=L;k++)
        {
                for(j=0;j<=n;j++)
                {
                         u[0][j][k]=g1(y[j], t[k]);
                         u[m][j][k]=g2(y[j], t[k]);
                }
                for(i=1;i<=m-1;i++)
                {
                         u[i][0][k]=g3(x[i], t[k]);
                         u[i][n][k]=g4(x[i], t[k]);
                }
        }

        a1=(double *)malloc(sizeof(double)*(m-1));
        b1=(double *)malloc(sizeof(double)*(m-1));
        c1=(double *)malloc(sizeof(double)*(m-1));
        d1=(double *)malloc(sizeof(double)*(m-1));
        for(i=0;i<m-1;i++)
        {
                a1[i]=-r1/2.0;
                b1[i]=1.0+r1;
                c1[i]=a1[i];
        }

        a2=(double *)malloc(sizeof(double)*(n-1));
        b2=(double *)malloc(sizeof(double)*(n-1));
        c2=(double *)malloc(sizeof(double)*(n-1));
        d2=(double *)malloc(sizeof(double)*(n-1));
        for(j=0;j<n-1;j++)
        {
                a2[j]=-r2/2.0;
                b2[j]=1.0+r2;
                c2[j]=a2[j];
        }

        for(k=0;k<L;k++)
        {
                tmid=(t[k]+t[k+1])/2.0;
                for(j=1;j<=n-1;j++)
                {
                        for(i=1;i<=m-1;i++)
                        {
                                d1[i-1]=r1*(u[i-1][j][k]-2*u[i][j][k]+u[i+1][j][k])+r2*(u[i][j-1][k]-2*u[i][j][k]+u[i][j+1][k])+f(x[i], y[j], tmid)*dt;
                        }
                        v[0][j]=(1+r2)*(u[0][j][k+1]-u[0][j][k])-r2*(u[0][j+1][k+1]-u[0][j+1][k]+u[0][j-1][k+1]-u[0][j-1][k])/2.0;
                        v[m][j]=(1+r2)*(u[m][j][k+1]-u[m][j][k])-r2*(u[m][j+1][k+1]-u[m][j+1][k]+u[m][j-1][k+1]-u[m][j-1][k])/2.0;
                        d1[0]=d1[0]+r1*v[0][j]/2.0;
                        d1[m-2]=d1[m-2]+r1*v[m][j]/2.0;
                        ans=chase_algorithm(a1, b1, c1, d1, m-1);

                        for(i=1;i<=m-1;i++)
                                v[i][j]=ans[i-1];
                        free(ans);
                }

                for(i=1;i<=m-1;i++)
                {
                        for(j=1;j<=n-1;j++)
                                d2[j-1]=(1+r2)*u[i][j][k]-r2*(u[i][j-1][k]+u[i][j+1][k])/2.0+v[i][j];
                        d2[0]=d2[0]+r2*u[i][0][k+1]/2.0;
                        d2[n-2]=d2[n-2]+r2*u[i][n][k+1]/2.0;
                        ans=chase_algorithm(a2, b2, c2, d2, n-1);

                        for(j=1;j<=n-1;j++)
                                u[i][j][k+1]=ans[j-1];
                        free(ans);
                }
        }

        gap_i=m/4;
        gap_j=n/4;

        for(i=gap_i;i<=m-1;i=i+gap_i)
        {
                for(j=gap_j;j<=n-1;j=j+gap_j)
                {
                        temp=fabs(exact(x[i], y[j], T/2.0)-u[i][j][L/2]);
                        printf("(%.2f, %.2f, 0.50)     y=%f,    err=%.4e\n", x[i], y[j], u[i][j][L/2], temp);
                }
        }

        printf("\n");
        printf("\n");

        for(i=gap_i;i<=m-1;i=i+gap_i)
        {
               for(j=gap_j;j<=n-1;j=j+gap_j)
               {
                        temp=fabs(exact(x[i], y[j], T)-u[i][j][L]);
                        printf("(%.2f, %.2f, 1.00)     y=%f,    err=%.4e\n", x[i], y[j], u[i][j][L], temp);
               }
        }

        free(x); free(y); free(t);
        free(a1); free(b1); free(c1); free(d1);
        free(a2); free(b2); free(c2); free(d2);

        for(i=0;i<=m;i++)
        {
               for(j=0;j<=n;j++)
                       free(u[i][j]);
        }

        for(i=0;i<=m;i++)
        {
               free(u[i]); free(v[i]);
        }

        free(u); free(v);

        return 0;
}


double f(double x, double y, double t)
{
        return -3.0*exp((x+y)/2.0-t)/2.0;
}
double phi(double x, double y)
{
        return exp((x+y)/2.0);
}
double g1(double y, double t)
{
        return exp(y/2.0-t);
}
double g2(double y, double t)
{
        return exp((1.0+y)/2.0-t);
}
double g3(double x, double t)
{
        return exp(x/2.0-t);
}
double g4(double x, double t)
{
        return exp((1.0+x)/2.0-t);
}
double *chase_algorithm(double *a, double *b, double *c, double *d, int n)
{
        int i;
        double * ans, *g, *w, p;

        ans=(double *)malloc(sizeof(double)*n);
        g=(double *)malloc(sizeof(double)*n);
        w=(double *)malloc(sizeof(double)*n);

        g[0]=d[0]/b[0];
        w[0]=c[0]/b[0];

        for(i=1;i<n;i++)
        {
                p=b[i]-a[i]*w[i-1];
                g[i]=(d[i]-a[i]*g[i-1])/p;
                w[i]=c[i]/p;
        }

        ans[n-1]=g[n-1];
        i=n-2;
        do
        {
                ans[i]=g[i]-w[i]*ans[i+1];
                i=i-1;
        }while(i>=0);

        free(g); free(w);

        return ans;
}
double exact(double x, double y, double t)
{
        return exp((x+y)/2.0-t);
}

 


当m=60,n=40,L=20时,结果如下:

m=60, n=40, L=20
r1=180.0000,   r2=80.0000
(0.25, 0.25, 0.50)     y=0.778814,    err=1.2876e-05
(0.25, 0.50, 0.50)     y=0.882514,    err=1.7519e-05
(0.25, 0.75, 0.50)     y=1.000015,    err=1.4611e-05
(0.50, 0.25, 0.50)     y=0.882514,    err=1.7519e-05
(0.50, 0.50, 0.50)     y=1.000024,    err=2.3999e-05
(0.50, 0.75, 0.50)     y=1.133168,    err=1.9757e-05
(0.75, 0.25, 0.50)     y=1.000015,    err=1.4611e-05
(0.75, 0.50, 0.50)     y=1.133168,    err=1.9757e-05
(0.75, 0.75, 0.50)     y=1.284042,    err=1.6707e-05


(0.25, 0.25, 1.00)     y=0.472374,    err=7.8105e-06
(0.25, 0.50, 1.00)     y=0.535272,    err=1.0627e-05
(0.25, 0.75, 1.00)     y=0.606540,    err=8.8626e-06
(0.50, 0.25, 1.00)     y=0.535272,    err=1.0627e-05
(0.50, 0.50, 1.00)     y=0.606545,    err=1.4557e-05
(0.50, 0.75, 1.00)     y=0.687301,    err=1.1984e-05
(0.75, 0.25, 1.00)     y=0.606540,    err=8.8626e-06
(0.75, 0.50, 1.00)     y=0.687301,    err=1.1984e-05
(0.75, 0.75, 1.00)     y=0.778811,    err=1.0134e-05

当m=120,n=80,L=40时,结果如下:

m=120, n=80, L=40
r1=360.0000,   r2=160.0000
(0.25, 0.25, 0.50)     y=0.778804,    err=3.2127e-06
(0.25, 0.50, 0.50)     y=0.882501,    err=4.3716e-06
(0.25, 0.75, 0.50)     y=1.000004,    err=3.6449e-06
(0.50, 0.25, 0.50)     y=0.882501,    err=4.3717e-06
(0.50, 0.50, 0.50)     y=1.000006,    err=5.9884e-06
(0.50, 0.75, 0.50)     y=1.133153,    err=4.9297e-06
(0.75, 0.25, 0.50)     y=1.000004,    err=3.6449e-06
(0.75, 0.50, 0.50)     y=1.133153,    err=4.9297e-06
(0.75, 0.75, 0.50)     y=1.284030,    err=4.1668e-06


(0.25, 0.25, 1.00)     y=0.472369,    err=1.9488e-06
(0.25, 0.50, 1.00)     y=0.535264,    err=2.6518e-06
(0.25, 0.75, 1.00)     y=0.606533,    err=2.2109e-06
(0.50, 0.25, 1.00)     y=0.535264,    err=2.6518e-06
(0.50, 0.50, 1.00)     y=0.606534,    err=3.6325e-06
(0.50, 0.75, 1.00)     y=0.687292,    err=2.9903e-06
(0.75, 0.25, 1.00)     y=0.606533,    err=2.2109e-06
(0.75, 0.50, 1.00)     y=0.687292,    err=2.9902e-06
(0.75, 0.75, 1.00)     y=0.778803,    err=2.5275e-06

四、结论

        从三种不同格式的计算结果可以看出,虽然分解方法不同,但计算结果是完全一致的。同时,如果时间步长、空间步长同时减半,则误差减小为1/4。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1598138.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

还在担心报表不好做?不用怕,试试这个方法(四)

系列文章&#xff1a; 《还在担心报表不好做&#xff1f;不用怕&#xff0c;试试这个方法》&#xff08;一&#xff09; 《还在担心报表不好做&#xff1f;不用怕&#xff0c;试试这个方法》&#xff08;二&#xff09; 《还在担心报表不好做&#xff1f;不用怕&#xff0c;…

UE5学习日记——制作多语言版本游戏,同时初步学习UI制作、多语言化、控制器配置、独立进程测试、打包配置和快速批量翻译等

所有的文本类&#xff0c;无论变量还是控件等都能实现本地化&#xff0c;以此实现不同语言版本。 在这里先将重点注意标注一下&#xff1a; 所有文本类的变量、控件等都可以多语言&#xff1b;本地化控制板中收集、编译时&#xff0c;别忘了编译这一步&#xff1b;支持批量复制…

海思Hi3519 DV500 部署yolov5并加速优化

本项目代码已开源&#xff0c;见文末 导出onnx模型 yolov5官方地址 利用官方命令导出python export.py --weights yolov5n.pt --include onnx 或者自写代码导出 import os import sys os.chdir(sys.path[0]) import onnx import torch sys.path.append(..) from models.co…

ASP.NET MVC企业级程序设计 (EF+三层架构+MVP实现查询数据)

目录 效果图 实现过程 1创建数据库 2创建项目文件 3创建控制器&#xff0c;右键添加&#xff0c;控制器 ​编辑 注意这里要写Home​编辑 创建成功 数据模型创建过程之前作品有具体过程​编辑 4创建DAL 5创建BLL 6创建视图&#xff0c;右键添加视图 ​编辑 7HomeContr…

[计算机效率] 本地视频播放器:QQPlayer

3.26 本地视频播放器&#xff1a;QQPlayer QQPlayer是一款由腾讯公司开发的视频播放软件&#xff0c;它支持多种视频格式&#xff0c;包括MP4、AVI、FLV等&#xff0c;并且可以播放高清视频。 强大的播放功能&#xff1a;QQPlayer具有强大的解码功能&#xff0c;可以轻松播放…

GIS 数据格式转换

1、在线工具 mapshaper 2、数据上传 3、数据格式转换 导入数据可导出为多种格式&#xff1a;Shapefile、Json、GeoJson、CSV、TopJSON、KML、SVG

面试算法-174-二叉树的层序遍历

题目 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;[[3],[9,20],[15,7]] 解 class Solut…

Antd:在文本框中展示格式化JSON

要想将对象转换为格式化 JSON 展示在文本框中&#xff0c;需要用到 JSON.stringify JSON.stringify 方法接受三个参数&#xff1a; value&#xff1a;必需&#xff0c;一个 JavaScript 值&#xff08;通常为对象或数组&#xff09;要转换为 JSON 字符串。replacer&#xff1a…

基于springboot+vue实现的疫情防控物资调配与管理系统

作者主页&#xff1a;Java码库 主营内容&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 技术选型 【后端】&#xff1a;Java 【框架】&#xff1a;spring…

【软考高项】二十一、政策法规之招投标法知识点学习

一、总则部分 必须招标的 社会公共利益、公众安全的&#xff1b;国有资金投资或者国家融资的&#xff1b;外国政府贷款、援助资金的原则 公开、公平、公正和诚实信用 不得将依法必须进行招标的项目化整为零或者以其他任何方式规避招标、不受地区或者部门的限…

【Go】原子并发操作

目录 一、基本概念 支持的数据类型 主要函数 使用场景 二、基础代码实例 开协程给原子变量做加法 统计多个变量 原子标志判断 三、并发日志记录器 四、并发计数器与性能监控 五、优雅的停止并发任务 worker函数 Main函数 应用价值 Go语言中&#xff0c;原子并发操…

ABAP MESSAGE 常用的类型

类型文本描述A终止处理终止&#xff0c;用户必须重启事务X退出与消息类型A 类似&#xff0c;但带有程序崩溃 MESSAGE_TYPE_XE错误处理受到干扰&#xff0c;用户必须修正输入条目,左下角提示!W警告处理受到干扰&#xff0c;用户可以修正输入条目,左下角提示!I信息处理受到干扰&a…

中断的设备树修改及上机实验(按键驱动)流程

写在前面的话&#xff1a;对于 GPIO 按键&#xff0c;我们并不需要去写驱动程序&#xff0c;使用内核自带的驱动程序 drivers/input/keyboard/gpio_keys.c 就可以&#xff0c;然后你需要做的只是修改设备树指定引脚及键值。 根据驱动文件中的platform_driver中的.of_match_tabl…

一套3种风格经典的wordpress免费主题模板

wordpress免费企业主题 https://www.wpniu.com/themes/39.html 免费wordpress企业模板 https://www.wpniu.com/themes/43.html 免费wordpress企业主题 https://www.wpniu.com/themes/44.html

图灵奖2023:Avi Wigderson的开创性贡献揭示计算中的随机性和伪随机性

文章目录 每日一句正能量前言背景什么是理论计算机科学&#xff1f;为什么随机性很重要&#xff1f;三篇影响深远的论文Avi Wigderson在计算复杂性理论方面的贡献及其对现代计算的影响Avi Wigderson对随机性和伪随机性在计算中作用的理解及其实际应用Avi Wigderson的学术生涯和…

超越GPT-4V!马斯克发布Grok-1.5 With Vision

在 Grok-1 开源后不到一个月&#xff0c;xAI 的首个多模态模型就问世了。Grok-1.5V是XAI的第一代多模态模型&#xff0c;除了其强大的文本处理能力之外&#xff0c;Grok现在还能够处理包括文档、图表、图形、屏幕截图和照片在内的各种视觉信息。相信Grok-1.5V将很快提供给现有的…

基于unity+c#的随机点名系统(简单UI界面+列表+数组)

目录 一、功能界面显示 二、UI 1、视频的使用 &#xff08;1&#xff09;渲染纹理 &#xff08;2&#xff09; 视频铺全屏 &#xff08;3&#xff09;视频的调用 2、 下拉文本框的使用&#xff08;旧版&#xff09; 3、输入文本框的使用&#xff08;旧版&#xff09; …

OneFlow深度学习简介

介绍 OneFlow是一个基于深度学习的开源框架,主要面向机器学习工程师和研究人员。它提供了类似于其他深度学习框架(如TensorFlow和PyTorch)的API,同时具有高性能和高效的特点。OneFlow专注于在大规模数据集和分布式环境下的训练和推理,以及在生产环境中的部署和优化。其设计…

冯诺依曼结构理解

冯诺依曼结构 存储器&#xff1a;内存 数据是要在计算机的体系结构中进行流动的&#xff0c;在流动过程中对数据加工处理 从一个设备到另一个设备&#xff0c;本质是一种拷贝 CPU的计算速度是很快的&#xff0c;所以数据设备间的拷贝效率&#xff0c;决定了计算机整体的基本效率…

vue3第十八节(diff算法)

引言&#xff1a; 上一节说了key的用途&#xff0c;而这个key属性&#xff0c;在vue的vnode 中至关重要&#xff0c;直接影响了虚拟DOM的更新机制&#xff1b; 什么场景中会用到diff算法 如&#xff1a;修改响应式属性需要重新渲染页面&#xff0c;会重新执行render渲染函数返…