偏微分方程算法之混合边界条件下的差分法

news/2024/5/21 5:34:42

目录

一、研究目标

二、理论推导

三、算例实现

四、结论


一、研究目标

        我们在前几节中介绍了Poisson方程的边值问题,接下来对椭圆型偏微分方程的混合边值问题进行探讨,研究对象为:

\left\{\begin{matrix} -(\frac{\partial^{2}u(x,y)}{\partial x^{2}}+\frac{\partial^{2}u(x,y)}{\partial y^{2}})=f(x,y),(x,y)\in\Omega,\space\space(1)\\ \frac{\partial u(x,y)}{\partial \mathbf{n}}+\lambda(x,y)u=\mu(x,y),(x,y)\in\partial \Omega=\Gamma \end{matrix}\right.

其中,\Omega为矩形区域\Omega=[(x,y)|a\leqslant x\leqslant b,c\leqslant y\leqslant d]f(x,y)\Omega上的连续函数,\mathit{\mathbf{n}}\Gamma上的单位法向量,从而\frac{\partial u(x,y)}{\partial\mathbf{n}}表示方向导数,\lambda(x,y),\mu(x,y)\Gamma的连续函数且\lambda(x,y)非负。对于矩形区域\Omega而言,其边界上的法向量没有统一的表达式,需要对四条边界线段分别讨论。可见:

        在左边界\mathbf{n}_{1}=(-1,0),边界条件为(-\frac{\partial u}{\partial x}+\lambda(x,y)u)|_{(a,y)}=\mu_{1}(a,y)

        在右边界\mathbf{n}_{2}=(1,0),边界条件为(\frac{\partial u}{\partial x}+\lambda(x,y)u)|_{(b,y)}=\mu_{2}(b,y)

        在下边界\mathbf{n}_{3}=(0,-1),边界条件为(-\frac{\partial u}{\partial y}+\lambda(x,y)u)|_{(x,c)}=\mu_{3}(x,c)

        在上边界\mathbf{n}_{4}=(0,1),边界条件为(\frac{\partial u}{\partial y}+\lambda(x,y)u)|_{(x,d)}=\mu_{4}(x,d)

        于是,公式(1)可以具体写为:

\left\{\begin{matrix} -(\frac{\partial^{2}u(x,y)}{\partial x^{2}}+\frac{\partial^{2}u(x,y)}{\partial y^{2}})=f(x,y),(x,y)\in(a,b)\times (c,d),\\ (\frac{\partial u(x,y)}{\partial x}-\lambda(x,y)u)|_{(a,y)}=\varphi_{1}(y),c\leqslant y\leqslant d,\\ (\frac{\partial u(x,y)}{\partial x}+\lambda(x,y)u)|_{(b,y)}=\varphi_{2}(y),c\leqslant y\leqslant d,\\ (\frac{\partial u(x,y)}{\partial y}-\lambda(x,y)u)|_{(x,c)}=\Psi_{1}(x),a\leqslant x\leqslant b,\\ (\frac{\partial u(x,y)}{\partial y})+\lambda(x,y)u)|_{(x,d)},\Psi_{2}(x),a\leqslant x\leqslant b \end{matrix}\right.

二、理论推导

        首先进行矩形区域\Omega的等距剖分,得到各网格节点(x_{i},y_{j}),且x_{i}=a+i\cdot\Delta x,i=0,1,\cdot\cdot\cdot,m\Delta x=(b-a)/my_{j}=c+j\cdot\Delta y,j=0,1,\cdot\cdot\cdot,n\Delta y=(c-d)/n。然后弱化原方程,使其仅在离散节点上成立,从而有

\left\{\begin{matrix} -(\frac{\partial^{2}u(x,y)}{\partial x^{2}}+\frac{\partial^{2}u(x,y)}{\partial y^{2}})|_{(x_{i},y_{j})}=f(x_{i},y_{j}),1\leqslant i\leqslant m-1,1\leqslant j\leqslant n-1,\\ \frac{\partial u(x,y)}{\partial x}|_{(x_{0},y_{j})}-\lambda(x_{0},y_{j})u(x_{0},y_{j})=\varphi_{1}(y_{j}),0\leqslant j\leqslant n, \\ \frac{\partial u(x,y)}{\partial x}|_{(x_{m},y_{j})}+\lambda(x_{m},y_{j})u(x_{m},y_{j})=\varphi_{2}(y_{j}),0\leqslant j\leqslant n, \\ \frac{\partial u(x,y)}{\partial y}|_{(x_{i},y_{0})}-\lambda(x_{i},y_{0})u(x_{i},y_{0})=\Psi_{1}(x_{i}),0\leqslant i\leqslant m, \\ \frac{\partial u(x,y)}{\partial y}|_{(x_{i},y_{n})}+\lambda(x_{i},y_{n})u(x_{i},y_{n})=\Psi_{2}(x_{i}),0\leqslant i\leqslant m. \end{matrix}\right.

        将上式中的一阶、二阶偏导数分别用关于一阶导数的中心差商和关于二阶导数的中心差商来近似,得

\left\{\begin{matrix} -(\frac{u(x_{i-1},y_{j})-2u(x_{i},y_{j})+u(x_{i+1},y_{j})}{\Delta x^{2}}+\frac{u(x_{i},y_{j-1})-2u(x_{i},y_{j})+u(x_{i},y_{j+1})}{\Delta y^{2}})\\ =f(x_{i},y_{j})+O(\Delta x^{2}+\Delta y^{2}),1\leqslant i\leqslant m-1,1\leqslant j\leqslant n-1,\\ \frac{u(x_{1},y_{j})-u(x_{-1},y_{j})}{2\Delta x}-\lambda(x_{0},y_{j})u(x_{0},y_{j})=\varphi_{1}(y_{j})+O(\Delta x^{2}),0\leqslant j\leqslant n,\\ \frac{u(x_{m+1},y_{j})-u(x_{m-1},y_{j})}{2\Delta x}+\lambda(x_{m},y_{j})u(x_{m},y_{j})=\varphi(y_{j})+O(\Delta x^{2}),0\leqslant j\leqslant n,\\ \frac{u(x_{i},y_{1})-u(x_{i},y_{-1})}{2\Delta y}-\lambda(x_{i},y_{0})u(x_{i},y_{0})=\Psi_{1}(x_{i})+O(\Delta y^{2}),0\leqslant i\leqslant m,\\ \frac{u(x_{i},y_{n+1})-u(x_{i},y_{n-1})}{2\Delta y}+\lambda(x_{i},y_{n})u(x_{i},y_{n})=\Psi_{2}(x_{i})+O(\Delta y^{2}),0\leqslant i\leqslant m. \end{matrix}\right.

        用数值解代替精确解并忽略高阶项,得到以下数值格式:

\left\{\begin{matrix} -(\frac{u_{i-1,j}-2u_{i,j}+u_{i+1,j}}{\Delta x^{2}}+\frac{u_{i,j-1}-2u_{i,j}+u_{i,j+1}}{\Delta y^{2}})=f_{i,j},1\leqslant i\leqslant m-1,1\leqslant j\geqslant n-1,\\ u_{1,j}-u_{-1,j}=2\Delta x(\varphi_{1}(y_{j})+\lambda_{0,j}u_{0,j}),0\leqslant j\leqslant n,\\ u_{m+1,j}-u_{m-1,j}=2\Delta x(\varphi_{2}(y_{j})-\lambda_{m,j}u_{m,j}),0\leqslant j\leqslant n,\\ u_{i,1}-u_{i,-1}=2\Delta y(\Psi_{1}(x_{i})+\lambda_{i,0}u_{i,0}),0\leqslant i\leqslant m,\\ u_{i,n+1}-u_{i,n-1}=2\Delta y(\Psi_{2}(x_{i})-\lambda_{i,n}u_{i,n}),0\leqslant i\leqslant m. \end{matrix}\right.(2)

其中,\lambda_{i,j}=\lambda(x_{i},y_{j}),f_{i,j}=f(x_{i},y_{j})。该格式的局部截断误差为O(\Delta x^{2}+\Delta y^{2}),同时需要处理其中的下标越界问题。由于函数的连续性,我们认为公式(2)中的第1式对i=0也成立,即有

-(\frac{u_{-1,j}-2u_{0,j}+u_{1,j}}{\Delta x^{2}}+\frac{u_{0,j-1}-2u_{0,j}+u_{0,j+1}}{\Delta y^{2}})=f_{i,j},1\leqslant j\leqslant n-1

        再成公式(2)的第2式中解出u_{-1,j}=u_{1,j}-2\Delta x(\varphi_{1}(y_{j})+\lambda_{0,j}u_{0,j})代入上式,得

-\frac{2u_{1,j}-2(1+\Delta x\lambda_{0,j})u_{0,j}}{\Delta x^{2}}-\frac{u_{0,j-1}-2u_{0,j}+u_{0,j+1}}{\Delta y^{2}}=f_{i,j}-\frac{2}{\Delta x}\varphi_{1}(y_{j}),1\leqslant j\leqslant n-1

同样,设公式(2)中的第1式分别对i=m,j=0,j=n成立,再分别从公式(2)的第3、4、5式中解出u_{m+1,j},u_{i,-1},u_{i,n+1}代入前面刚得到的方程,就可以处理掉越界下标,得到以下格式:

\left\{\begin{matrix} -\frac{u_{i-1,j}-2u_{i,j}+u_{i+1,j}}{\Delta x^{2}}-\frac{u_{i,j-1}-2u_{i,j}+u_{i,j+1}}{\Delta y^{2}}=f_{i,j},1\leqslant i\leqslant m-1,1\leqslant j\leqslant n-1,\\ -\frac{2u_{1,j}-2(1+\Delta x\lambda_{0,j})u_{0,j}}{\Delta x^{2}}-\frac{u_{0,j-1}-2u_{0,j}+u_{0,j+1}}{\Delta y^{2}}=f_{0,j}-\frac{2}{\Delta x}\varphi_{1}(y_{j}),1\leqslant j\leqslant n-1,\\ -\frac{2u_{m-1,j}-2(1+\Delta x\lambda_{m,j})u_{m,j}}{\Delta x^{2}}-\frac{u_{m,j-1}-2u_{m,j}+u_{m,j+1}}{\Delta y^{2}}=f_{m,j}+\frac{2}{\Delta x}\varphi_{2}(y_{j}),1\leqslant j\leqslant n-1,\\ -\frac{u_{i-1,0}-2u_{i,0}+u_{i+1,0}}{\Delta x^{2}}-\frac{2u_{i,1}-2(1+\Delta y\lambda_{i,0})u_{i,0}}{\Delta y^{2}}=f_{i,0}-\frac{2}{\Delta y}\Psi_{1}(x_{i}),1\leqslant i\leqslant m-1,\\ -\frac{u_{i-1,n}-2u_{i,n}+u_{i+1,n}}{\Delta x^{2}}-\frac{2u_{i,n-1}-2(1+\Delta y\lambda_{i,n})u_{i,n}}{\Delta y^{2}}=f_{i,n}+\frac{2}{\Delta y}\Psi_{2}(x_{i}),1\leqslant i\leqslant m-1 \end{matrix}\right.

        至此我们共有(m+1)x(n+1)个待求量u_{i,j},0\leqslant i\leqslant m,0\leqslant j\leqslant n,而现有(m-1)x(n-1)个关于内节点的方程,2(n-1)个关于左、右边界上的节点(不含端点)的方程及2(m-1)个关于上、下边界上的节点(也不含端点)的方程,还需要补充

(m+1)(n+1)-(m-1)(n-1)-2(n-1)-2(m-1)=4

个方程,也就是关于矩形区域的4个顶点的方程。为此,设公式(2)中第1式对i=0,j=0成立,即

-\frac{u_{-1,0}-2u_{0,0}+u_{1,0}}{\Delta x^{2}}-\frac{u_{0,-1}-2u_{0,0}+u_{0,1}}{\Delta y^{2}}=f_{0,0} \; (3)

        然后再从公式(2)的第2式和第4式中分别解出u_{-1,0}=u_{1,0}-2\Delta x(\varphi_{1}(y_{0})+\lambda_{0,0}u_{0,0})u_{0,-1}=u_{0,1}-2\Delta y(\Psi_{1}(x_{0})+\lambda_{0,0}u_{0,0}),代入公式(3)中,得到\Omega左下顶点处的方程:

-\frac{2u_{1,0}-2(1+\Delta x\lambda_{0,0})u_{0,0}}{\Delta x^{2}}-\frac{2u_{0,1}-2(1+\Delta y\lambda_{0,0})u_{0,0}}{\Delta y^{2}}=f_{0,0}-\frac{2}{\Delta x}\varphi_{1}(y_{0})-\frac{2}{\Delta y}\Psi_{1}(x_{0})

上式可以简化为

-\frac{2u_{1,0}}{\Delta x^{2}}+[\frac{2(1+\Delta x\lambda_{0,0})}{\Delta x^{2}}+\frac{2(1+\Delta y\lambda_{0,0})}{\Delta y^{2}}]u_{0,0}-\frac{2u_{0,1}}{\Delta y^{2}}=f_{0,0}-\frac{2}{\Delta x}\varphi_{1}(y_{0})-\frac{2}{\Delta y}\Psi_{1}(x_{0})

        同样,设公式(2)中第1式分别对i=m,j=0i=0,j=ni=m,j=n成立,然后再从公式(2)中第3式和第4式解出u_{m+1,0},u_{m,-1},u_{-1,n},u_{0,n+1},u_{m+1,n},u_{m,n+1}分别代入刚才得到的3个方程,就得到\Omega的右下顶点、左上顶点、和右上顶点处的方程,这样,我们就有了完整的处理带导数边界条件的椭圆型方程的数值格式:

\left\{\begin{matrix} -\frac{u_{i,j-1}}{\Delta y^{2}}-\frac{u_{i-1,j}}{\Delta x^{2}}+2[\frac{1}{\Delta x^{2}}+\frac{1}{\Delta y^{2}}]u_{i,j}-\frac{u_{i+1,j}}{\Delta x^{2}}-\frac{u_{i,j+1}}{\Delta y^{2}}=f_{i,j},1\leqslant i\leqslant m-1,1\leqslant j\leqslant n-1,\\ -\frac{u_{0,j-1}}{\Delta y^{2}}+[\frac{2(1+\Delta x\lambda_{0,j})}{\Delta x^{2}}+\frac{2}{\Delta y^{2}}]u_{0,j}-\frac{2u_{1,j}}{\Delta x^{2}}-\frac{u_{0,j+1}}{\Delta y^{2}}=f_{0,j}-\frac{2}{\Delta x}\varphi_{1}(y_{j}),1\leqslant j\leqslant n-1,\\ -\frac{u_{m,j-1}}{\Delta y^{2}}-\frac{2u_{m-1,j}}{\Delta x^{2}}+[\frac{2(1+\Delta x\lambda_{m,j})}{\Delta x^{2}}+\frac{2}{\Delta y^{2}}]u_{m,j}-\frac{u_{m,j+1}}{\Delta y^{2}}=f_{m,j}+\frac{2}{\Delta x}\varphi_{2}(y_{j}),1\leqslant j\leqslant n-1,\\ -\frac{u_{i-1,0}}{\Delta x^{2}}+[\frac{2}{\Delta x^{2}}+\frac{2(1+\Delta y\lambda_{i,0})}{\Delta y^{2}}]u_{i,0}-\frac{u_{i+1,0}}{\Delta x^{2}}-\frac{2u_{i,1}}{\Delta y^{2}}=f_{i,0}-\frac{2}{\Delta y}\Psi_{1}(x_{i}),1\leqslant i\leqslant m-1,\\ -\frac{u_{i-1,n}}{\Delta x^{2}}-\frac{2u_{i,n-1}}{\Delta y^{2}}+[\frac{2}{\Delta x^{2}}+\frac{2(1+\Delta y\lambda_{i,n})}{\Delta y^{2}}]u_{i,n-\frac{u_{i+1,n}}{\Delta x^{2}}}=f_{i,n}+\frac{2}{\Delta y}\Psi_{2}(x_{i}),1\leqslant i\leqslant m-1,\\ [\frac{2(1+\Delta x\lambda_{0,0})}{\Delta x^{2}}+\frac{2(1+\Delta y \lambda_{0,0})}{\Delta y^{2}}]u_{0,0}-\frac{2u_{1,0}}{\Delta x^{2}}-\frac{2u_{0,1}}{\Delta y^{2}}=f_{0,0}-\frac{2}{\Delta x}\varphi_{1}(y_{0})-\frac{2}{\Delta y}\Psi_{1}(x_{0}),\\ -\frac{2u_{m-1,0}}{\Delta x^{2}}+[\frac{2(1+\Delta x\lambda_{m,0})}{\Delta x^{2}}+\frac{2(1+\Delta y \lambda_{m,0})}{\Delta y^{2}}]u_{m,0}-\frac{2u_{m,1}}{\Delta y^{2}}=f_{m,0}+\frac{2}{\Delta x}\varphi_{2}(y_{0})-\frac{2}{\Delta y}\Psi_{1}(x_{m}),\\ -\frac{2u_{0,n-1}}{\Delta y^{2}}+[\frac{2(1+\Delta x\lambda_{0,n})}{\Delta x^{2}}+\frac{2(1+\Delta y\lambda_{0,n})}{\Delta y^{2}}]u_{0,n}-\frac{2u_{1,n}}{\Delta x^{2}}=f_{0,n}-\frac{2}{\Delta x}\varphi_{1}(y_{n})+\frac{2}{\Delta y}\Psi_{2}(x_{0}),\\ -\frac{2u_{m,n-1}}{\Delta y^{2}}-\frac{2u_{m-1,n}}{\Delta x^{2}}+[\frac{2(1+\Delta x\lambda_{m,n})}{\Delta x^{2}}+\frac{2(1+\Delta y\lambda_{m,n})}{\Delta y^{2}}]u_{m,n}=f_{m,n}+\frac{2}{\Delta x}\varphi_{2}(y_{n})+\frac{2}{\Delta y}\Psi_{2}(x_{m}). \end{matrix}\right.

        记\beta =\frac{1}{\Delta x^{2}},\gamma=\frac{1}{\Delta y^{2}},\alpha=2(\frac{1}{\Delta x^{2}}+\frac{1}{\Delta y^{2}}),\xi=\frac{2}{\Delta x},\eta=\frac{2}{\Delta y},有

\begin{Bmatrix} -\gamma u_{i,j-1}-\beta u_{i-1,j}+\alpha u_{i,j}-\beta u_{i+1,j}-\gamma u_{i,j+1}=f_{i,j},1\leqslant i\leqslant m-1,1\leqslant j\leqslant n-1,\\ -\gamma u_{0,j-1}+[\alpha+\xi \lambda_{0,j}]u_{0,j}-2\beta u_{1,j}-\gamma u_{0,j+1}=f_{0,j}-\xi\varphi_{1}(y_{j}),1\leqslant j\leqslant n-1,\\ -\gamma u_{m,j-1}-2\beta u_{m-1,j}+[\alpha+\xi\lambda_{m,j}]u_{m,j}-\gamma u_{m,j+1}=f_{m,j}+\xi \varphi_{2}(y_{j}),1\leqslant j\leqslant n-1,\\ -\beta u_{i-1,0}+[\alpha+\eta\lambda_{i,0}]u_{i,0}-\beta u_{i+1,0}-2\gamma u_{i,1}=f_{i,0}-\eta\Psi_{1}(x_{i}),1\leqslant i\leqslant m-1,\\ -2\gamma u_{i,n-1}-\beta u_{i-1,n}+[\alpha+\eta\lambda_{i,n}]u_{i,n}-\beta u_{i+1,n}=f_{i,n}+\eta\Psi_{2}(x_{i}),1\leqslant i\leqslant m-1,\\ [\alpha+(\xi+\eta)\lambda_{0,0}]u_{0,0}-2\beta u_{1,0}-2\gamma u_{0,1}=f_{0,0}-\xi\varphi_{1}(y_{0})-\eta\Psi_{1}(x_{0}),\\ -2\beta u_{m-1,0}+[\alpha+(\xi+\eta)\lambda_{m,0}]u_{m,0}-2\gamma u_{m,1}=f_{m,0}+\xi\varphi_{2}(y_{0})-\eta\Psi_{1}(x_{m}),\\ -2\gamma u_{0,n-1}+[\alpha+(\xi+\eta)\lambda_{0,n}]u_{0,n}-2\beta u_{1,n}=f_{0,n}-\xi \varphi_{1}(y_{n})+\eta\Psi_{2}(x_{0}),\\ -2\gamma u_{m,n-1}-2\beta u_{m-1,n}+[\alpha+(\xi+\eta)\lambda_{m,n}]u_{m,n}=f_{m,n}+\xi\varphi_{2}(y_{n})+\eta\Psi_{2}(x_{m}). \end{Bmatrix}\;(4)

        为计算分别,可将上述方程组写成矩阵形式。

        首先,将公式(4)中第4、6、7式写成:

\begin{pmatrix} \alpha+(\xi+\eta)\lambda_{0,0} & -2\beta & & & & & \\ -\beta & \alpha+\eta\lambda_{1,0} & -\beta & & & & \\ & -\beta & \alpha+\eta\lambda_{2,0} & -\beta & & & \\ & & \ddots & \ddots & \ddots & & \\ & & & -\beta & \alpha+\eta\lambda_{m-2,0} & -\beta & \\ & & & & -\beta & \alpha+\eta\lambda_{m-1,0} & -\beta\\ & & & & & -2\beta & \alpha+(\xi+\eta)\lambda_{m,0} \end{pmatrix}+\begin{pmatrix} u_{0,0}\\ u_{1,0}\\ u_{2,0}\\ \vdots\\ u_{m-2,0}\\ u_{m-1,0}\\ u_{m,0} \end{pmatrix}+\begin{pmatrix} -2\gamma & & & & & & \\ & -2\gamma & & & & & \\ & & -2\gamma & & & & \\ & & & -2\gamma & & & \\ & & & & -2\gamma & & \\ & & & & & -2\gamma & \\ & & & & & & -2\gamma \end{pmatrix}\begin{pmatrix} u_{0,1}\\ u_{1,1}\\ u_{2,1}\\ \vdots\\ u_{m-2,1}\\ u_{m-1,1}\\ u_{m,1} \end{pmatrix}=\begin{pmatrix} f_{0,0}-\eta\Psi_{1}(x_{0})-\xi\varphi_{1}(y_{0})\\ f_{1,0}-\eta\Psi_{1}(x_{1})\\ f_{2,0}-\eta\Psi_{1}(x_{2})\\ \vdots\\ f_{m-2,0}-\eta\Psi_{1}(x_{m-2})\\ f_{m-1,0}-\eta\Psi_{1}(x_{m-1})\\ f_{m,0}-\eta\Psi_{1}(x_{m})-\xi\varphi_{2}(y_{0}) \end{pmatrix} \; (5)

         上面的式子可以简记为

C\mathbf{u_{0}}+2A\mathbf{u}_{1}=\mathbf{f}_{0}

其中,A=-\gamma II为m+1阶单位矩阵,且C为公式(5)最左端的三对角矩阵,\mathbf{f}_{0}为公式(5)右端的向量,\mathbf{u}_{j}=(u_{0,j},u_{1,j},\cdot\cdot\cdot ,u_{m-1,j},u_{m,j})^{T},0\leqslant j\leqslant n。接着,公式(4)中的第1,2,3式可以写成

\begin{pmatrix} -\gamma & & & & & & \\ & -\gamma & & & & & \\ & & -\gamma & & & & \\ & &\ddots &\ddots &\ddots & & \\ & & & & -\gamma & & \\ & & & & & -\gamma & \\ & & & & & & -\gamma \end{pmatrix}\begin{pmatrix} u_{0,j-1}\\ u_{1,j-1}\\ u_{2,j-1}\\ \vdots\\ u_{m-2,j-1}\\ u_{m-1,j-1}\\ u_{m,j-1} \end{pmatrix}+\begin{pmatrix} \alpha+\xi\lambda_{0,j} & -2\beta & & & & & \\ -\beta & \alpha & -\beta & & & & \\ & -\beta & \alpha & -\beta & & & \\ & & \ddots & \ddots & \ddots & & \\ & & & -\beta & \alpha & -\beta & \\ & & & & -\beta & \alpha & -\beta\\ & & & & & -2\beta & \alpha+\xi\lambda_{m,j} \end{pmatrix}\begin{pmatrix} u_{0,j}\\ u_{1,j}\\ u_{2,j}\\ \vdots\\ u_{m-2,j}\\ u_{m-1,j}\\ u_{m,j} \end{pmatrix}+\begin{pmatrix} -\gamma & & & & & & \\ & -\gamma & & & & & \\ & & -\gamma & & & & \\ & &\ddots &\ddots &\ddots & & \\ & & & & -\gamma & & \\ & & & & & -\gamma & \\ & & & & & & -\gamma \end{pmatrix}\begin{pmatrix} u_{0,j+1}\\ u_{1,j+1}\\ u_{2,j+1}\\ \vdots\\ u_{m-2,j+1}\\ u_{m-1,j+1}\\ u_{m,j+1} \end{pmatrix}=\begin{pmatrix} f_{0,j}-\xi \varphi_{1}(y_{j})\\ f_{1,j}\\ f_{2,j}\\ \vdots\\ f_{m-2,j}\\ f_{m-1,j}\\ f_{m,j}+\xi \varphi_{2}(y_{j}) \end{pmatrix}\;(6),1\leqslant j\leqslant n-1

         该式可以简记为

A\mathbf{u}_{j-1}+B_{j}\mathbf{u}_{j}+A\mathbf{u}_{j+1}=\mathbf{f}_{j},1\leqslant j\leqslant n-1

其中,B_{j}为公式(6)中的三对角矩阵,\mathbf{f}_{j}为公式(6)右端的向量。最后,公式(4)的第5、8、9式可以写成

\begin{pmatrix} -2\gamma & & & & & & \\ & -2\gamma & & & & & \\ & & -2\gamma & & & & \\ & & \ddots& \ddots& \ddots& & \\ & & & & -2\gamma & & \\ & & & & & -2\gamma & \\ & & & & & & -2\gamma \end{pmatrix}\begin{pmatrix} u_{0,n-1}\\ u_{1,n-1}\\ u_{2,n-1}\\ \vdots\\ u_{m-2,n-1}\\ u_{m-1,n-1}\\ u_{m,n-1} \end{pmatrix}+\begin{pmatrix} \alpha+(\xi+\eta)\lambda_{0,n} & -2\beta & & & & & \\ -\beta & \alpha+\eta\lambda_{1,n} & -\beta & & & & \\ & -\beta & \alpha+\eta\lambda_{2,n} & -\beta & & & \\ & & \ddots & \ddots & \ddots & & \\ & & & -\beta & \alpha+\eta\lambda_{m-2,n} & -\beta & \\ & & & & -\beta & \alpha+\eta\lambda_{m-1,n} & -\beta\\ & & & & & -2\beta & \alpha+(\xi+\eta)\lambda_{m,n} \end{pmatrix}\begin{pmatrix} u_{0,n}\\ u_{1,n}\\ u_{2,n}\\ \vdots\\ u_{m-2,n}\\ u_{m-1,n}\\ u_{m,n} \end{pmatrix}==\begin{pmatrix} f_{0,n}+\eta\Psi_{1}(x_{0})-\xi\varphi_{1}(y_{n})\\ f_{1,n}+\eta\Psi_{2}(x_{1})\\ f_{2,n}-\eta\Psi_{2}(x_{2})\\ \vdots\\ f_{m-2,n}+\eta\Psi_{2}(x_{m-2})\\ f_{m-1,n}+\eta\Psi_{2}(x_{m-1})\\ f_{m,n}+\eta\Psi_{2}(x_{m})+\xi\varphi_{2}(y_{n}) \end{pmatrix} \; (7)

        该式可以简记为

2A\mathbf{u}_{n-1}+D\mathbf{u}_{n}=\mathbf{f}_{n}

其中,D为公式(7)中的三对角矩阵,\mathbf{f}_{n}为公式(7)右端的向量。于是,由公式(5)、(6)、(7)可得到公式(4)写成块三对角矩阵为

\begin{pmatrix} C & 2A & & & & & \\ A & B_{1} & A & & & & \\ & A & B_{2} & A & & & \\ & & \ddots & \ddots & \ddots & & \\ & & & A & B_{m-2} & A & \\ & & & & A & B_{m-1} & A\\ & & & & & 2A & D \end{pmatrix}\begin{pmatrix} \mathbf{u}_{0}\\ \mathbf{u}_{1}\\ \mathbf{u}_{2}\\ \vdots\\ \mathbf{u}_{m-2}\\ \mathbf{u}_{m-1}\\ \mathbf{u}_{m} \end{pmatrix}=\begin{pmatrix} \mathbf{f}_{0}\\ \mathbf{f}_{1}\\ \mathbf{f}_{2}\\ \vdots\\ \mathbf{f}_{m-2}\\ \mathbf{f}_{m-1}\\ \mathbf{f}_{m} \end{pmatrix}\;(8)

        采用Gauss-Seidel迭代法求解公式(8)。

三、算例实现

        用差分格式-公式(8)求解椭圆型方程混合边值问题:

\left\{\begin{matrix} -(\frac{\partial^{2}u}{\partial x^{2}}+\frac{\partial^{2}u}{\partial y^{2}})=(\pi^{2}-1)e^{x}sin(\pi y),0<x<2,0<y<1,\\ (\frac{\partial u(x,y)}{\partial x}-(x^{2}+y^{2})u)|_{(0,y)}=(1-y^{2})sin(\pi y),0\leqslant y\leqslant 1,\\ (\frac{\partial u(x,y)}{\partial x}+(x^{2}+y^{2})u)|_{(2,y)}=(5+y^{2})e^{2}sin(\pi y),0\leqslant y\leqslant 1,\\ (\frac{\partial u(x,y)}{\partial y}-(x^{2}+y^{2})u)|_{(x,c)}=\pi e^{x},0\leqslant x\leqslant 1,\\ (\frac{\partial u(x,y)}{\partial y}+(x^{2}+y^{2})u)|_{(x,d)}=-\pi e^{x},0\leqslant x\leqslant 1 \end{matrix}\right.

已知精确解为u(x,y)=e^{x}sin(\pi y)。分别取步长为\Delta x=\Delta y=\frac{1}{16}\Delta x=\Delta y=\frac{1}{32},输出6个节点(0.5i,0.25)(0.5i,0.50),i=1,2,3处的数值解,并给出误差,要求在各节点处最大误差的迭代误差限为0.5\times10^{-10}

代码如下:


#include <cmath>
#include <stdlib.h>
#include <stdio.h>
#define pi 3.14159265359int main(int argc, char*argv[])
{int m,n,i,j,k;double xa,xb,ya,yb,dx,dy,alpha,beta,gamma,maxerr;double *x,*y,**u,**v,**lambda,*d,kexi,eta,temp;double f(double x, double y);double lambda_function(double x, double y);double phi1(double y);double phi2(double y);double psi1(double x);double psi2(double x);double exact(double x, double y);xa=0.0;xb=2.0;ya=0.0;yb=1.0;m=64;n=32;printf("m=%d,n=%d.\n",m,n);dx=(xb-xa)/m;dy=(yb-ya)/n;beta=1.0/(dx*dx);gamma=1.0/(dy*dy);alpha=2*(beta+gamma);kexi=2.0/dx;eta=2.0/dy;x=(double*)malloc(sizeof(double)*(m+1));for(i=0;i<=m;i++)x[i]=xa+i*dx;y=(double*)malloc(sizeof(double)*(n+1));for(j=0;j<=n;j++)y[j]=ya+j*dy;u=(double**)malloc(sizeof(double*)*(m+1));v=(double**)malloc(sizeof(double*)*(m+1));lambda=(double**)malloc(sizeof(double*)*(m+1));for(i=0;i<=m;i++){u[i]=(double*)malloc(sizeof(double)*(n+1));v[i]=(double*)malloc(sizeof(double)*(n+1));lambda[i]=(double*)malloc(sizeof(double)*(n+1));}for(i=0;i<=m;i++){for(j=0;j<=n;j++){u[i][j]=0.0;v[i][j]=0.0;lambda[i][j]=lambda_function(x[i],y[j]);}}d=(double*)malloc(sizeof(double)*(m+1));k=0;do{maxerr=0.0;for(i=0;i<=m;i++)d[i]=f(x[i],y[0])-eta*psi1(x[i]);d[0]=d[0]-kexi*phi1(y[0]);d[m]=d[m]+kexi*phi2(y[0]);v[0][0]=(d[0]+2*gamma*u[0][1]+2*beta*u[1][0])/(alpha+(kexi+eta)*lambda[0][0]);for(i=1;i<m;i++)v[i][0]=(d[i]+2*gamma*u[i][1]+beta*(v[i-1][0]+u[i+1][0]))/(alpha+eta*lambda[i][0]);v[m][0]=(d[m]+2*gamma*u[m][1]+2*beta*v[m-1][0])/(alpha+(kexi+eta)*lambda[m][0]);for(j=1;j<n;j++){for(i=0;i<=m;i++){d[i]=f(x[i],y[j]);}d[0]=d[0]-kexi*phi1(y[j]);d[m]=d[m]+kexi*phi2(y[j]);v[0][j]=(d[0]+gamma*(u[0][j+1]+v[0][j-1])+2*beta*u[1][j])/(alpha+kexi*lambda[0][j]);for(i=1;i<m;i++){v[i][j]=(d[i]+gamma*(v[i][j-1]+u[i][j+1])+beta*(v[i-1][j]+u[i+1][j]))/alpha;}v[m][j]=(d[m]+gamma*(v[m][j-1]+u[m][j+1])+2*beta*v[m-1][j])/(alpha+kexi*lambda[m][j]);}for(i=0;i<=m;i++)d[i]=f(x[i],y[n])+eta*psi2(x[i]);d[0]=d[0]-kexi*phi1(y[n]);d[m]=d[m]+kexi*phi2(y[n]);v[0][n]=(d[0]+2*gamma*v[0][n-1]+2*beta*u[1][n])/(alpha+(kexi+eta)*lambda[0][n]);for(i=1;i<m;i++)v[i][n]=(d[i]+2*gamma*v[i][n-1]+beta*(v[i-1][n]+u[i+1][n]))/(alpha+eta*lambda[i][n]);v[m][n]=(d[m]+2*gamma*v[m][n-1]+2*beta*v[m-1][n])/(alpha+(kexi+eta)*lambda[m][n]);for(i=0;i<=m;i++){for(j=0;j<=n;j++){temp=fabs(u[i][j]-v[i][j]);if(temp>maxerr)maxerr=temp;u[i][j]=v[i][j];}}k=k+1;}while((maxerr>0.5*1e-10)&&(k<=1e+8));printf("k=%d\n",k);k=m/4;for(i=k;i<m;i=i+k){printf("(%.2f,0.25), y=%f, err=%.4e.\n",x[i],u[i][n/4],fabs(exact(x[i],y[n/4])-u[i][n/4]));}k=m/4;for(i=k;i<m;i=i+k){printf("(%.2f,0.50), y=%f, err=%.4e.\n",x[i],u[i][n/2],fabs(exact(x[i],y[n/2])-u[i][n/2]));}for(i=0;i<=m;i++){free(u[i]);free(v[i]);free(lambda[i]);}free(u);free(v);free(lambda);free(x);free(y);free(d);return 0;
}double f(double x, double y)
{return (pi*pi-1)*exp(x)*sin(pi*y);
}
double lambda_function(double x, double y)
{return x*x+y*y;
}
double phi1(double y)
{return (1-y*y)*sin(pi*y);
}
double phi2(double y)
{return (5.0+y*y)*exp(2.0)*sin(pi*y);
}
double psi1(double x)
{return pi*exp(x);
}
double psi2(double x)
{return -pi*exp(x);
}
double exact(double x, double y)
{return exp(x)*sin(pi*y);
}

\Delta x=\Delta y=\frac{1}{16}时,计算结果如下:

m=32,n=16.
k=4323
(0.50,0.25), y=1.152179, err=1.3643e-02.
(1.00,0.25), y=1.911016, err=1.1100e-02.
(1.50,0.25), y=3.162159, err=6.8738e-03.
(0.50,0.50), y=1.638607, err=1.0115e-02.
(1.00,0.50), y=2.711255, err=7.0265e-03.
(1.50,0.50), y=4.479936, err=1.7526e-03.

\Delta x=\Delta y=\frac{1}{32}时,计算结果如下:

m=64,n=32.
k=16007
(0.50,0.25), y=1.162412, err=3.4097e-03.
(1.00,0.25), y=1.919341, err=2.7745e-03.
(1.50,0.25), y=3.167313, err=1.7193e-03.
(0.50,0.50), y=1.646193, err=2.5286e-03.
(1.00,0.50), y=2.716524, err=1.7575e-03.
(1.50,0.50), y=4.481249, err=4.3972e-04.

四、结论

        从计算结果可知,当步长减小为1/2时,误差减小为原来的1/4,可见该数值格式是二阶收敛的。


http://www.mrgr.cn/p/57350064

相关文章

使用nmcli命令在各Linux系统上统一的配置网络

前言&#xff1a;原文在我的博客网站中&#xff0c;持续更新数通、系统方面的知识&#xff0c;欢迎来访&#xff01; 使用nmcli命令在各Linux系统上统一的配置网络https://myweb.myskillstree.cn/123.html 你是否会遇到在不同的Linux系统中配置网络时&#xff0c;修改的配置文…

深入探索JavaScript中的structuredClone:现代深拷贝的解密指南

在 JavaScript 中,实现深拷贝的方式有很多种,每种方式都有其优点和缺点。今天介绍一种原生 JavaScript 提供的structuredClone实现深拷贝。 下面列举一些常见的方式,以及它们的代码示例和优缺点: 1. 使用 JSON.parse(JSON.stringify(obj)) 代码示例:function deepClone(ob…

keycloak~登录皮肤动态切换的尝试

keycloak的登录皮肤theme,可以设置领域全局的,或者每个客户端进行单独设置,这种设计是没有问题的,但有时,一个客户端可能有多种主题,这时,你只能再加个客户端,对应新的主题,但这样不方便日后的统计,因为很多统计维度都是以client为基础的,所以,我们需要在进入登录页…

基于TRIZ理论的锂电池生产工艺优化思路

在能源科技迅猛发展的今天&#xff0c;锂电池作为重要的储能元件&#xff0c;其生产工艺的优化与革新显得尤为关键。本文将基于TRIZ理论&#xff0c;探讨锂电池生产工艺的优化路径&#xff0c;以期提升能源产业的效率与环保性。 TRIZ&#xff0c;即发明问题解决理论&#xff0…

爆爽,英语小白怒刷 50 课!像玩游戏一样学习英语~

### 重点!!!(先看这) 1. 清楚自己学英语的`目的`, 先搞清楚目标,再行动2. 自身现在最需要的东西:`词汇量`?`口语`?还是`阅读能力`?3. 找对应的书籍,学习资料4. 往`兴趣靠拢`:网上有大量的推荐美剧学习、小说学习,不要被他们迷了眼,适合他们的不一定适合你,找到适合…

【数据结构】 二叉树的顺序结构——堆的实现

普通的二叉树是不适合用数组来存储的&#xff0c;因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结构存储。现实中我们通常把堆(一种二叉树)使用顺序结构的数组来存储 。 一、堆的概念及结构 父节点比孩子结点大 是大堆 父节点比孩子结点小 是小堆 堆的性质 堆中某…

如何在ArcGIS Pro中添加无标注的底图

在ArcGIS 3.0中,新建一个地图会自带两个图层,分别是 World Topographic Map 和 World _Hillshade,也就是世界地形图和世界山体阴影,这套底图的颜色和符号的使用都非常赏心悦目。 但是我们在制图时,有时候想利用这个底图,却不想使用地图中的标注。而这个标注是没办法通过简…

Google搜索广告怎么开户?谷歌广告开户投放引流技巧、账户搭建、谷歌ads广告推广投放策略 #搜索引擎 #谷歌广告#互联网营销

Google搜索广告开户步骤&#xff1a; 选择代理商&#xff1a;首先&#xff0c;您需要选择一个经验丰富、信誉良好的Google广告代理商。可以选择上海上弦来广告开户和代运营。 初步咨询&#xff1a;与代理商进行初步沟通&#xff0c;了解他们的服务内容、成功案例、收费标准等。…

PyQt 入门

Qt hello - 专注于Qt的技术分享平台 Python体系下GUI框架也多了去了&#xff0c;PyQt算是比较受欢迎的一个。如果对Qt框架熟悉&#xff0c;那掌握这套框架是很简单的。 一&#xff0c;安装 1.PyQt5 pip3 install PyQt5 2.Designer UI工具 pip3 install PyQt5-tools 3.UI…

JL-杰理芯片-认识TA的SDK的第一天

编写不同SDK的软件用宏定义进行包含,方便知道它的效果,也方便删除不用,更容易知道是什么模块的 原理图决定软件板级根据板子名称决定板子的配置 板级文件的选择不注释哪个就使用哪个

SOLIDWORKS参数化设计的作用

SOLIDWORKS参数化设计软件,主要解决加工制造型企业普遍存在的系列化产品设计周期长和出图效率低。重复工作多、人员工作强度大的问题。传统的设计模式下大规模定制型产品结构设计周期长,问题多,以及大量重复性工作让工程师疲于应对,这些严重阻碍了公司订单承接能力和技术创…

使用Docker安装MySQL5.7.36

拉取镜像并查看 docker pull mysql:5.7.36拉取成功后查看&#xff08;非必须&#xff09; docker images创建并设置宿主机 mysql 配置文件目录和数据文件目录 创建相关文件夹将容器中的mysql数据保存到本地&#xff0c;这样即使容器被删除&#xff0c;数据也不会丢失。 mkd…

【IDEA神器插件推荐】国产崛起!地表最强API测试插件

1.前言 在开发SpringBoot网站应用的过程中,前端后端会对接口进行请求测试。相信很多小伙伴都用过Postman,但是在IDE和Postman切换难免令人心烦。所以今天给大家带来一款IDEA内置的接口测试插件。 2.简介 根据插件的简介:Restful Fast Request 是一个类似于 Postman 的 Intel…

京东手势验证码-YOLO姿态识别+Bézier curve轨迹拟合

这次给老铁们带来的是京东手势验证码的识别。 目标网站&#xff1a;https://plogin.m.jd.com/mreg/index 验证码如下图: 当第一眼看到这个验证码的时候&#xff0c;就头大了&#xff0c;这玩意咋识别&#xff1f;&#xff1f;&#xff1f; 静下心来细想后的一个方案&#xf…

django显示网页步骤

显示网页步骤 小白的django学习笔记 2024/5/6 8:30 文章目录 显示网页步骤创建输入框&#xff08;文本、单选、多选&#xff09;效果如何在django中显示网页写函数配置地址运行&#xff0c;要选择这个工程名的&#xff0c;使用socket复制ip&#xff0c;后面在加上名字,成功&…

linux安装python3.8

一、卸载损坏的yum并安装 本来想直接下载安装python3.8,结果过程中损坏了yum,导致yum无法使用。 参考了【故障】6、yum不可用_yum命令无法使用-CSDN博客 1、删除python #删除现有的python rpm -qa|grep python|sudo xargs rpm -ev --allmatches --nodeps #强制删除已安装程…

2024好用的网页客服系统推荐?

2024好用的网页客服系统推荐&#xff1f;Zoho SalesIQ是一款强大的实时聊天工具&#xff0c;专为网站和在线商店设计。它提供了一套全面的功能&#xff0c;帮助企业实时解决客户问题&#xff0c;提高转化率和客户满意度。 实时监控 Zoho SalesIQ能够实时监控网站的访问者活动&…

Spring添加注解读取和存储对象

5大注解 Controller 控制器 Service 服务 Repository 仓库 Componet 组件 Configuration 配置 五大类注解的使用 //他们都是放在同一个目录下&#xff0c;不同的类中 只不过这里粘贴到一起//控制器 Controller public class UserController {public void SayHello(){System.ou…

智启蒸汽时代:数字孪生锅炉的革新之旅

数字孪生,就是通过数字技术为物理世界中的物体创建一个数字化的“双胞胎”。对于蒸汽工厂锅炉来说,数字孪生系统能够实时模拟锅炉的运行状态,预测可能出现的问题,并通过数据分析和智能决策为工人提供精准的操作建议。在飞速发展的工业4.0时代,数字孪生技术已经深入到我们生…

python数据分析——数据预处理

数据预处理 前言一、查看数据数据表的基本信息查看info&#xff08;&#xff09;示例 查看数据表的大小shape&#xff08;&#xff09;示例 数据格式的查看type()dtype&#xff08;&#xff09;dtypes&#xff08;&#xff09;示例一示例二 查看具体的数据分布describe()示例 二…