当前位置: 首页 > news >正文

偏微分方程算法之混合边界差分

目录

一、研究对象

二、差分格式

2.1 向前欧拉格式

1. 中心差商

1.1.1 理论推导

1.1.2 算例实现

2. x=0处向前差商,x=1处向后差商

1.2.1 理论推导

1.2.2 算例实现

2.2 Crank-Nicolson格式

2.2.1 理论推导

2.2.2 算例实现


一、研究对象

        这里我们以混合边界(导数边界)条件下的抛物型方程初边值问题:

\left\{\begin{matrix} \frac{\partial u}{\partial t}-a\frac{\partial^{2}}{\partial x^{2}}=f(x,t), \space\space 0<x<1,\space\space 0<t \leqslant T,\\ u(x,0)=\varphi(x),\space\space\space\space 0 \leqslant x \leqslant 1, \space\space\space\space(1)\\ \frac{\partial u}{\partial x}(0,t)-\lambda u(0,t)=\alpha(t), \frac{\partial u}{\partial x}(1,t)+\mu u(1,t)=\beta(t),0<t\leqslant T \end{matrix}\right.

其中,\lambda \geqslant 0,\mu \geqslant 0且当\lambda,\mu同时为0时公式(1)中的边界条件是诺依曼条件。

二、差分格式

        这里我们用向前欧拉法显格式和Crank-Nicolson格式进行差分格式建立。

2.1 向前欧拉格式

1. 中心差商

1.1.1 理论推导

        网格剖分参照偏微分方程算法之向前欧拉法(Forward Euler)-CSDN博客。在节点(x_{i},t_{k})处得到节点离散方程:

\left\{\begin{matrix} \frac{\partial u}{\partial t}|_{({x_{i},t_{k}})}-a\frac{\partial^{2}u}{\partial x^{2}}|_{({x_{i},t_{k}})}=f(x_{i},t_{k}),\\ u(x_{i},t_{0})=\varphi(x_{i}),\space\space\space\space (2)\\ \frac{\partial u}{\partial x}(x_{0},t_{k})-\lambda u(x_{0},t_{k})=\alpha(t_{k}),\frac{\partial u}{\partial x}(x_{m},t_{k})+\mu u(x_{m},t_{k})=\beta(t_{k}) \end{matrix}\right.

        利用一阶向前差商代替微商,可得:

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

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

        边界条件采用中心差商

\frac{\partial u}{\partial x}|_{(x_{0},t_{k})}\approx \frac{u(x_{1},t_{k})-u(x_{-1},t_{k})}{2h},\frac{\partial u}{\partial x}|_{(x_{m},t_{k})}\approx \frac{u(x_{m+1},t_{k})-u(x_{m-1},t_{k})}{2h}

其中u(x_{-1},t_{k}),u(x_{m+1},t_{k})中x变量都已经越界,属于虚拟数值,将在下文单独处理。将上面各式带入公式(2)中,将数值解代替精确解并忽略高阶项,可得到离散差分格式:

\left\{\begin{matrix} \frac{u^{k+1}_{i}-u^{k}_{i}}{\tau}-a\frac{u^{k}_{i+1}-2u^{k}_{i}+u^{k}_{i-1}}{h^{2}}=f(x_{i},t_{k}),\space\space 1\leqslant i \leqslant m-1,\space\space 0 \leqslant k \leqslant n-1,\\ u^{0}_{i}=\varphi(x_{i}),\space\space\space\space(3) \\ \frac{u^{k}_{1}-u^{k}_{-1}}{2h}-\lambda u^{k}_{0}=\alpha(t_k),\frac{u^{k}_{m+1}-u^{k}_{m-1}}{2h}+\mu u^{k}_{m}=\beta(t_k), 1 \leqslant k \leqslant n \end{matrix}\right.

        公式(3)中第1式可以写成:

u^{k+1}_{i}-u^{k}_{i}-r(u^{k}_{i+1}-2u^{k}_{i}+u^{k}_{i-1})=\tau f(x_{i},t_{k}),\space\space 1 \leqslant i \leqslant m-1,0 \leqslant k \leqslant n-1 \space\space\space\space (4)

其中r=\frac{a\tau}{h^{2}}。为处理越界问题,设公式(4)对i=0和i=1都成立,即:

u^{k+1}_{0}-u^{k}_{0}-r(u^{k}_{1}-2u^{k}_{0}+u^{k}_{-1})=\tau f(x_{0},t_{k}),u^{k+1}_{m}-u^{k}_{m}-r(u^{k}_{m+1}-2u^{k}_{m}+u^{k}_{m-1})=\tau f(x_{m},t_{k}) \space\space\space\space(5)

        将上式与公式(3)中的第3式以及u^{k}_{-1}=u^{k}_{1}-2\lambda h u^{k}_{0}-2h\alpha(t_{k})u^{k}_{m+1}=u^{k}_{m-1}-2\mu h u^{k}_{m}+2h\beta(t_{k})联立,可得:

\left\{\begin{matrix} u^{k+1}_{0}=(1-2r-2r\lambda h)u^{k}_{0}+2ru^{k}_{1}-2rh\alpha(t_{k})+\tau f(x_{0},t_{k}), \space\space (6)\\ u^{k+1}_{m}=2ru^{k}_{m-1}+(1-2r-2r\mu h)u^{k}_{m}+2rh\beta(t_{k})+\tau f(x_{m},t_{k}) \end{matrix}\right.

        联合公式(5)、(6)可得:

\left\{\begin{matrix} u^{k+1}_{0}=(1-2r-2r\lambda h)u^{k}_{0}+2ru^{k}_{1}-2rh\alpha(t_{k})+\tau f(x_{0},t_{k}) , [1]\\ u^{k+1}_{i}=ru^{k}_{i-1}+(1-2r)u^{k}_{i}+ru^{k}_{i+1}+\tau f(x_{i},t_{k}),1\leqslant i\leqslant m-1,0\leqslant k\leqslant n-1,[2]\\ u^{k+1}_{m}=2ru^{k}_{m-1}+(1-2r-2r\mu h)u^{k}_{m}+2rh\beta(t_{k})+\tau f(x_{m},t_{k}),[3]\\ u^{0}_{i}=\varphi(x_{i}),0\leqslant i\leqslant, m[4] \end{matrix}\right.

1.1.2 算例实现

        抛物型初边值问题:

\left\{\begin{matrix} \frac{\partial u}{\partial t}=\frac{\partial ^{2}u}{\partial x^{2}},\space\space 0<x<1,0<t \leqslant 1,\\ u(x,0)=1,\space\space\space\space 0\leqslant x\leqslant 1,\\ \frac{\partial u}{\partial x}(0,t)=u(0,t),\frac{\partial u}{\partial x}(1,t)=-u(1,t),0<t \leqslant 1, \end{matrix}\right.

已知精确解为u(x,t)=4\sum_{n=1}^{\infty}[\frac{sec\alpha_{n}}{(3+4\alpha^{2}_{n})}e^{-4\alpha^{2}_{n}t}cos2\alpha_{n}(x-\frac{1}{2})],其中\alpha_{n}是方程\alpha tan\alpha=\frac{1}{2}的根。取h=0.1,\tau=0.0025

代码如下:


#include<cmath>
#include<stdio.h>
#include<stdlib.h>int main(int argc, char* argv[])
{int m, n, i, k;double h, tau, a,lambda,mu,r;double *x, *t,**u;double f(double x, double t);double phi(double x);double alpha(double t);double beta(double t);m=10;n=400;h=1.0/m;tau=1.0/n;a=1.0;lambda=1.0;mu=1.0;r=a*tau/(h*h);printf("r=%.4f.\n", r);x=(double *)malloc(sizeof(double)*(m+1));for(i=0;i<=m;i++)x[i]=i*h;t=(double *)malloc(sizeof(double)*(n+1));for(k=0;k<=n;k++)t[k]=k*tau;u=(double **)malloc(sizeof(double *)*(m+1));for(i=0;i<=m;i++)u[i]=(double *)malloc(sizeof(double)*(n+1));for(i=0;i<=m;i++)u[i][0]=phi(x[i]);for(k=0;k<n;k++){u[0][k+1]=(1.0-2*r-2*r*lambda*h)*u[0][k]+2*r*u[1][k]-2*r*h*alpha(t[k])+tau*f(x[0], t[k]);for(i=1;i<m;i++)u[i][k+1]=r*u[i-1][k]+(1-2*r)*u[i][k]+r*u[i+1][k]+tau*f(x[i],t[k]);u[m][k+1]=2*r*u[m-1][k]+(1.0-2*r-2*r*mu*h)*u[m][k]+2*r*h*beta(t[k])+tau*f(x[m],t[k]);}printf("t/x     0          0.1       0.2       0.3       0.4       0.5\n");for(k=1;k<=8;k++){printf("%.4f  ", t[k]);for(i=0;i<=m/2;i++)printf("%.4f    ", u[i][k]);printf("\n");}printf("\n");printf("……\n");printf("\n");printf("0.1000  ");for(i=0;i<=m/2;i++)printf("%.4f    ", u[i][40]);printf("\n");for(k=1; k<=4; k=2*k){printf("%.4f  ", t[k*100]);for(i=0;i<=m/2;i++)printf("%.4f    ", u[i][k*100]);printf("\n");}return 0;
}double f(double x, double t)
{return 0;
}
double phi(double x)
{return 1.0;
}
double alpha(double t)
{return 0.0;
}
double beta(double t)
{return 0.0;
}

 结果如下:

r=0.2500.
t/x     0          0.1       0.2       0.3       0.4       0.5
0.0025  0.9500    1.0000    1.0000    1.0000    1.0000    1.0000
0.0050  0.9275    0.9875    1.0000    1.0000    1.0000    1.0000
0.0075  0.9111    0.9756    0.9969    1.0000    1.0000    1.0000
0.0100  0.8978    0.9648    0.9923    0.9992    1.0000    1.0000
0.0125  0.8864    0.9549    0.9872    0.9977    0.9998    1.0000
0.0150  0.8764    0.9459    0.9818    0.9956    0.9993    0.9999
0.0175  0.8673    0.9375    0.9762    0.9931    0.9985    0.9996
0.0200  0.8590    0.9296    0.9708    0.9902    0.9974    0.9991……0.1000  0.7175    0.7829    0.8345    0.8718    0.8942    0.9017
0.2500  0.5541    0.6048    0.6452    0.6745    0.6923    0.6983
0.5000  0.3612    0.3942    0.4205    0.4396    0.4512    0.4551
1.0000  0.1534    0.1674    0.1786    0.1867    0.1917    0.1933

2. x=0处向前差商,x=1处向后差商

1.2.1 理论推导

        利用一阶向前差商代替微商,可得:

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

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

        边界条件处理如下:

\frac{\partial u}{\partial x}|_{(x_{0},t_{k})}\approx \frac{u(x_{1},t_{k})-u(x_{0},t_{k})}{h},\frac{\partial u}{\partial x}|_{(x_{m},t_{k})}\approx \frac{u(x_{m},t_{k})-u(x_{m-1},t_{k})}{h}

        将上式带入公式(2),将数值解代替精确解并忽略高阶项,可得离散格式:

\left\{\begin{matrix} \frac{u^{k+1}_{i}-u^{k}_{i}}{\tau}-a\frac{u^{k}_{i+1}-2u^{k}_{i}+u^{k}_{i-1}}{h^{2}}=f(x_{i},t_{k}),\space\space 1\leqslant i \leqslant m-1,\space\space 0 \leqslant k \leqslant n-1,\\ u^{0}_{i}=\varphi(x_{i}),0 \leqslant i \leqslant m,\space\space\space\space(7) \\ \frac{u^{k}_{1}-u^{k}_{0}}{h}-\lambda u^{k}_{0}=\alpha(t_k),\frac{u^{k}_{m}-u^{k}_{m-1}}{h}+\mu u^{k}_{m}=\beta(t_k), 1 \leqslant k \leqslant n \end{matrix}\right.

整理可得:

\left\{\begin{matrix} u^{k+1}_{i}=ru^{k}_{i-1}+(1-2r)u^{k}_{i}+ru^{k}_{i+1}+\tau f(x_{i},t_{k}),1 \leqslant i\leqslant m-1,0\leqslant k\leqslant n-1,[1] \\ u^{0}_{i}=\varphi(x_{i}),0\leqslant i\leqslant m,[2] \\u^{k}_{0}=\frac{u^{k}_{1}-h\alpha(t_{k})}{1+\lambda h},[3] \\ u^{k}_{m}=\frac{u^{k}_{m-1}+h\beta(t_{k})}{1+\mu h},1\leqslant k\leqslant n,[4] \end{matrix}\right.

1.2.2 算例实现

        抛物型初边值问题:

\left\{\begin{matrix} \frac{\partial u}{\partial t}=\frac{\partial ^{2}u}{\partial x^{2}},\space\space 0<x<1,0<t \leqslant 1,\\ u(x,0)=1,\space\space\space\space 0\leqslant x\leqslant 1,\\ \frac{\partial u}{\partial x}(0,t)=u(0,t),\frac{\partial u}{\partial x}(1,t)=-u(1,t),0<t \leqslant 1, \end{matrix}\right.

已知精确解为u(x,t)=4\sum_{n=1}^{\infty}[\frac{sec\alpha_{n}}{(3+4\alpha^{2}_{n})}e^{-4\alpha^{2}_{n}t}cos2\alpha_{n}(x-\frac{1}{2})],其中\alpha_{n}是方程\alpha tan\alpha=\frac{1}{2}的根。取h=0.1,\tau=0.0025

代码如下:


#include<cmath>
#include<stdio.h>
#include<stdlib.h>int main(int argc, char* argv[])
{int m, n, i, k;double h, tau, a,lambda,mu,r;double *x, *t,**u;double f(double x, double t);double phi(double x);double alpha(double t);double beta(double t);m=10;n=400;h=1.0/m;tau=1.0/n;a=1.0;lambda=1.0;mu=1.0;r=a*tau/(h*h);printf("r=%.4f.\n", r);x=(double *)malloc(sizeof(double)*(m+1));for(i=0;i<=m;i++)x[i]=i*h;t=(double *)malloc(sizeof(double)*(n+1));for(k=0;k<=n;k++)t[k]=k*tau;u=(double **)malloc(sizeof(double *)*(m+1));for(i=0;i<=m;i++)u[i]=(double *)malloc(sizeof(double)*(n+1));for(i=0;i<=m;i++)u[i][0]=phi(x[i]);for(k=0;k<n;k++){for(i=1;i<m;i++)u[i][k+1]=r*u[i-1][k]+(1-2*r)*u[i][k]+r*u[i+1][k]+tau*f(x[i],t[k]);u[0][k+1]=(u[1][k+1]-h*alpha(t[k]))/(1.0+lambda*h);u[m][k+1]=(u[m-1][k+1]+h*beta(t[k]))/(1.0+mu*h);}printf("t/x     0          0.1       0.2       0.3       0.4       0.5\n");for(k=1;k<=8;k++){printf("%.4f  ", t[k]);for(i=0;i<=m/2;i++)printf("%.4f    ", u[i][k]);printf("\n");}printf("\n");printf("……\n");printf("\n");printf("0.1000  ");for(i=0;i<=m/2;i++)printf("%.4f    ", u[i][40]);printf("\n");for(k=1; k<=4; k=2*k){printf("%.4f  ", t[k*100]);for(i=0;i<=m/2;i++)printf("%.4f    ", u[i][k*100]);printf("\n");}return 0;
}double f(double x, double t)
{return 0;
}
double phi(double x)
{return 1.0;
}
double alpha(double t)
{return 0.0;
}
double beta(double t)
{return 0.0;
}


结果如下:

r=0.2500.
t/x     0          0.1       0.2       0.3       0.4       0.5
0.0025  0.9091    1.0000    1.0000    1.0000    1.0000    1.0000
0.0050  0.8884    0.9773    1.0000    1.0000    1.0000    1.0000
0.0075  0.8734    0.9607    0.9943    1.0000    1.0000    1.0000
0.0100  0.8612    0.9473    0.9873    0.9986    1.0000    1.0000
0.0125  0.8507    0.9358    0.9801    0.9961    0.9996    1.0000
0.0150  0.8415    0.9256    0.9730    0.9930    0.9989    0.9998
0.0175  0.8331    0.9164    0.9662    0.9895    0.9976    0.9993
0.0200  0.8255    0.9080    0.9596    0.9857    0.9960    0.9985……0.1000  0.6901    0.7591    0.8140    0.8537    0.8778    0.8859
0.2500  0.5230    0.5753    0.6170    0.6474    0.6658    0.6720
0.5000  0.3298    0.3627    0.3890    0.4082    0.4198    0.4237
1.0000  0.1311    0.1442    0.1547    0.1623    0.1669    0.1685

2.2 Crank-Nicolson格式

        边界条件采用中心差商。 

2.2.1 理论推导

        在虚拟节点(x_{i},t_{k+\frac{1}2{}})处得离散方程:

\left\{\begin{matrix} \frac{\partial u}{\partial t}|_{({x_{i},t_{k+\frac{1}{2}}})}-a\frac{\partial^{2}u}{\partial x^{2}}|_{({x_{i},t_{k+\frac{1}{2}}})}=f(x_{i},t_{k+\frac{1}{2}}),\\ u(x_{i},t_{0})=\varphi(x_{i}),\space\space\space\space (8)\\ \frac{\partial u}{\partial x}(x_{0},t_{k})-\lambda u(x_{0},t_{k})=\alpha(t_{k}),\frac{\partial u}{\partial x}(x_{m},t_{k})+\mu u(x_{m},t_{k})=\beta(t_{k}) \end{matrix}\right.

        利用差商代替微商:

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

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

\frac{\partial u}{\partial x}|_{(x_{0},t_{k})}\approx \frac{u(x_{1},t_{k})-u(x_{-1},t_{k})}{2h},\frac{\partial u}{\partial x}|_{(x_{m},t_{k})}\approx \frac{u(x_{m+1},t_{k})-u(x_{m-1},t_{k})}{2h}

其中u(x_{-1},t_{k}),u(x_{m+1},t_{k})同样越界,将上式代入公式(8),用数值解代替精确解并忽略高阶项,可得离散格式:

\left\{\begin{matrix} \frac{u^{k+1}_{i}-u^{k}_{i}}{\tau}-a\frac{u^{k}_{i+1}-2u^{k}_{i}+u^{k}_{i-1}+u^{k+1}_{i+1}-2u^{k+1}_{i}+u^{k+1}_{i-1}}{2h^{2}}=f(x_{i},t_{k+\frac{1}{2}}),\space\space 1\leqslant i \leqslant m-1,\space\space 0 \leqslant k \leqslant n-1,\\ u^{0}_{i}=\varphi(x_{i}),0 \leqslant i \leqslant m,\space\space\space\space(9) \\ \frac{u^{k}_{1}-u^{k}_{-1}}{2h}-\lambda u^{k}_{0}=\alpha(t_k),\frac{u^{k}_{m+1}-u^{k}_{m-1}}{2h}+\mu u^{k}_{m}=\beta(t_k), 1 \leqslant k \leqslant n \end{matrix}\right.

        公式(9)中第1式可写为

-\frac{r}{2}u^{k+1}_{i-1}+(1+r)u^{k+1}_{i}-\frac{r}{2}u^{k+1}_{i+1}=\frac{r}{2}u^{k}_{i-1}+(1-r)u^{k}_{i}+\frac{r}{2}u^{k}_{i+1}+\tau f(x_{i},t_{k+\frac{1}{2}}),\space\space 1 \leqslant i \leqslant m-1,0 \leqslant k \leqslant n-1 \space\space\space\space (10)

        为处理越界问题,设公式(10)对i=0和i=m都成立,即:

-\frac{r}{2}u^{k+1}_{-1}+(1+r)u^{k+1}_{0}-\frac{r}{2}u^{k+1}_{1}=\frac{r}{2}u^{k}_{-1}+(1-r)u^{k}_{0}+\frac{r}{2}u^{k}_{1}+\tau f(x_{0},t_{k+\frac{1}{2}})

-\frac{r}{2}u^{k+1}_{m-1}+(1+r)u^{k+1}_{m}-\frac{r}{2}u^{k+1}_{m+1}=\frac{r}{2}u^{k}_{m-1}+(1-r)u^{k}_{m}+\frac{r}{2}u^{k}_{m+1}+\tau f(x_{m},t_{k+\frac{1}{2}})

        将上式与公式(9)中的第3式以及u^{k}_{-1}=u^{k}_{1}-2\lambda h u^{k}_{0}-2h\alpha(t_{k})u^{k}_{m+1}=u^{k}_{m-1}-2\mu h u^{k}_{m}+2h\beta(t_{k})联立,可得:

\left\{\begin{matrix} (1+r+r\lambda h)u^{k+1}_{0}-ru^{k+1}_{1} =(1-r-r\lambda h)u^{k}_{0}+ru^{k}_{1}-rh\alpha(t_{k})-rh\alpha(t_{k+1})+\tau f(x_{0},t_{k+\frac{1}{2}})\\ (1+r+r\mu h)u^{k+1}_{m}-ru^{k+1}_{m-1} =(1-r-r\mu h)u^{k}_{m}+ru^{k}_{m-1}+rh\beta(t_{k})+rh\beta(t_{k+1})+\tau f(x_{m},t_{k+\frac{1}{2}}) \end{matrix}\right.

        联合上面两式与公式(10)可得:

\left\{\begin{matrix} (1+r+r\lambda h)u^{k+1}_{0}-ru^{k+1}_{1}=(1-r-r\lambda h)u^{k}_{0}+ru^{k}_{1}-rh\alpha(t_{k})-rh\alpha(t_{k+1})+\tau f(x_{0},t_{k+\frac{1}{2}}),0\leqslant k\leqslant n-1\\ -\frac{r}{2}u^{k+1}_{i-1}+(1+r)u^{k+1}_{i}-\frac{r}{2}u^{k+1}_{i+1}=\frac{r}{2}u^{k}_{i-1}+(1-r)u^{k}_{i}+\frac{r}{2}u^{k}_{i+1}+\tau f(x_{i},t_{k+\frac{1}{2}}),1\leqslant i\leqslant m-1,0\leqslant k\leqslant n-1,\\ -ru^{k+1}_{m-1}+(1+r+r\mu h)u^{k+1}_{m}=ru^{k}_{m-1}+(1-r-r\mu h)u^{k}_{m}+rh\beta(t_{k})+rh\beta(t_{k+1})+\tau f(x_{m},t_{k+\frac{1}{2}}),0\leqslant k\leqslant n-1,\\ u^{0}_{i}=\varphi(x_{i}),0\leqslant i\leqslant m\end{matrix}\right.

        上式可写出矩阵形式:

\begin{pmatrix} 1+r+r\lambda h & -r & & & & \\ -\frac{r}{2} & 1+r & -\frac{r}{2} & & 0 & \\ & & \ddots & & & \\ & & & \ddots & & \\ & 0 & & -\frac{r}{2} & 1+r &-\frac{r}{2} \\ & & & & -r & 1+r+r\mu h \end{pmatrix}\begin{pmatrix} u^{k+1}_{0}\\ u^{k+1}_{1}\\ \vdots\\ \vdots\\ u^{k+1}_{m-1}\\ u^{k+1}_{m} \end{pmatrix}=

\begin{pmatrix} 1-r-r\lambda h & r & & & & \\ \frac{r}{2} & 1-r & \frac{r}{2} & & 0 & \\ & & \ddots & & & \\ & & & \ddots & & \\ & 0 & & \frac{r}{2} & 1-r &\frac{r}{2} \\ & & & & r & 1-r-r\mu h \end{pmatrix}\begin{pmatrix} u^{k}_{0}\\ u^{k}_{1}\\ \vdots\\ \vdots\\ u^{k}_{m-1}\\ u^{k}_{m} \end{pmatrix}+\begin{pmatrix} -rh\alpha(t_{k})-rh\alpha(t_{k+1})+\tau f(x_{0},t_{k+\frac{1}{2}})\\ \tau f(x_{1},t_{k+\frac{1}{2}})\\ \vdots\\ \vdots\\ \tau f(x_{m-1},t_{k+\frac{1}{2}})\\ rh\beta(t_{k})+rh\beta(t_{k+1})+\tau f(x_{m},t_{k+\frac{1}{2}}) \end{pmatrix}

        上式可用追赶法求解。

2.2.2 算例实现

        抛物型初边值问题:

\left\{\begin{matrix} \frac{\partial u}{\partial t}=\frac{\partial ^{2}u}{\partial x^{2}},\space\space 0<x<1,0<t \leqslant 1,\\ u(x,0)=1,\space\space\space\space 0\leqslant x\leqslant 1,\\ \frac{\partial u}{\partial x}(0,t)=u(0,t),\frac{\partial u}{\partial x}(1,t)=-u(1,t),0<t \leqslant 1, \end{matrix}\right.

已知精确解为u(x,t)=4\sum_{n=1}^{\infty}[\frac{sec\alpha_{n}}{(3+4\alpha^{2}_{n})}e^{-4\alpha^{2}_{n}t}cos2\alpha_{n}(x-\frac{1}{2})],其中\alpha_{n}是方程\alpha tan\alpha=\frac{1}{2}的根。取h=0.1,\tau=0.0025

代码如下:


#include<cmath>
#include<stdio.h>
#include<stdlib.h>int main(int argc, char* argv[])
{int m, n, i, k;double h, tau, a, lambda,mu,r;double *x, *t, *a1, *b, *c, *d, *ans, **u, tkmid;double f(double x, double t);double phi(double x);double alpha(double t);double beta(double t);double * chase_algorithm(double *a, double *b, double *c, double *d, int n);m=10;n=400;h=1.0/m;tau=1.0/n;a=1.0;lambda=1.0;mu=1.0;r=a*tau/(h*h);printf("r=%.4f\n", r);x=(double *)malloc(sizeof(double)*(m+1));for(i=0;i<=m;i++)x[i] = i*h;t=(double *)malloc(sizeof(double)*(n+1));for(k=0;k<=n;k++)t[k] = k*tau;u=(double **)malloc(sizeof(double *)*(m+1));for(i=0;i<=m;i++)u[i]=(double *)malloc(sizeof(double)*(n+1));for(i=0;i<=m;i++)u[i][0]=phi(x[i]);a1=(double *)malloc(sizeof(double)*(m+1));b=(double *)malloc(sizeof(double)*(m+1));c=(double *)malloc(sizeof(double)*(m+1));d=(double *)malloc(sizeof(double)*(m+1));ans=(double *)malloc(sizeof(double)*(m+1));for(k=0;k<n;k++){tkmid=(t[k]+t[k+1])/2.0;for(i=1;i<m;i++){d[i]=r*u[i-1][k]/2.0+(1.0-r)*u[i][k]+r*u[i+1][k]/2.0+tau*f(x[i],tkmid);a1[i]=-r/2.0;b[i]=1.0+r;c[i]=a1[i];}b[0]=1.0+r+r*lambda*h;b[m]=1.0+r+r*mu*h;c[0]=-r;a1[m]=-r;d[0]=(1.0-r-r*lambda*h)*u[0][k]+r*u[1][k]-r*h*alpha(t[k])-r*h*alpha(t[k+1])+tau*f(x[0],tkmid);d[m]=r*u[m-1][k]+(1.0-r-r*mu*h)*u[m][k]+r*h*beta(t[k])+r*h*beta(t[k+1])+tau*f(x[m],tkmid);ans=chase_algorithm(a1,b,c,d,m+1);for(i=0;i<=m;i++)u[i][k+1]=ans[i];}free(a1);free(b);free(c);free(d);printf("t/x     0          0.1       0.2       0.3       0.4       0.5\n");for(k=1;k<=8;k++){printf("%.4f  ", t[k]);for(i=0;i<=m/2;i++)printf("%.4f    ", u[i][k]);printf("\n");}printf("\n");printf("……\n");printf("\n");printf("0.1000  ");for(i=0;i<=m/2;i++)printf("%.4f    ", u[i][40]);printf("\n");for(k=1;k<=4;k=2*k){printf("%.4f  ", t[k*100]);for(i=0;i<=m/2;i++)printf("%.4f    ", u[i][k*100]);printf("\n");}return 0;
}double f(double x, double t)
{return 0;
}
double phi(double x)
{return 1.0;
}
double alpha(double t)
{return 0.0;
}
double beta(double t)
{return 0.0;
}
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;
}

结果如下:

r=0.2500
t/x     0          0.1       0.2       0.3       0.4       0.5
0.0025  0.9600    0.9960    0.9996    1.0000    1.0000    1.0000
0.0050  0.9347    0.9868    0.9980    0.9997    1.0000    1.0000
0.0075  0.9164    0.9765    0.9950    0.9991    0.9999    1.0000
0.0100  0.9021    0.9663    0.9910    0.9980    0.9996    0.9999
0.0125  0.8900    0.9567    0.9864    0.9964    0.9992    0.9997
0.0150  0.8795    0.9478    0.9813    0.9944    0.9985    0.9993
0.0175  0.8701    0.9394    0.9762    0.9920    0.9975    0.9988
0.0200  0.8616    0.9315    0.9709    0.9893    0.9963    0.9981……0.1000  0.7180    0.7834    0.8350    0.8720    0.8943    0.9017
0.2500  0.5547    0.6054    0.6458    0.6751    0.6929    0.6989
0.5000  0.3618    0.3949    0.4213    0.4404    0.4520    0.4559
1.0000  0.1540    0.1681    0.1793    0.1874    0.1924    0.1940

相关文章:

偏微分方程算法之混合边界差分

目录 一、研究对象 二、差分格式 2.1 向前欧拉格式 1. 中心差商 1.1.1 理论推导 1.1.2 算例实现 2. x0处向前差商&#xff0c;x1处向后差商 1.2.1 理论推导 1.2.2 算例实现 2.2 Crank-Nicolson格式 2.2.1 理论推导 2.2.2 算例实现 一、研究对象 这里我们以混合边界…...

中国八大古都,分别是哪8个?

中国历史上统一王朝或者在全局范围内看呈鼎立之势的大的政权的首都&#xff0c;称古都&#xff0c;又称都城、国都等&#xff0c;是古代王朝的政治中心&#xff0c;也是经济和文化中心。 1、西安 西安&#xff0c;古称长安&#xff0c;是中国历史上建都时间最长、建都朝代最多…...

财务信息化与财务软件有何区别与联系?

财务产品与财务信息化&#xff0c;两者究竟有何不同&#xff0c;又有何相通之处&#xff1f;或许&#xff0c;你心中也充满了这样的疑惑。那么&#xff0c;让我用一则小故事&#xff0c;为你揭晓其中的秘密。 想象这样一个场景&#xff0c;长尾狐狸&#xff0c;作为饭团公司的…...

ssm052游戏攻略网站的设计与实现+vue

游戏攻略网站设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本游戏攻略网站就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处…...

SAP Credit Memo 到期日设置技巧

当我们用FB60, MIRO或者FB70 记账vendor或者customer 的Credit Memo的时候&#xff0c;我们发现Credit Memo的Due Date不受付款条款的影响&#xff0c;默认为跟baseline date是同一天&#xff0c;并且无法手工更改&#xff0c;那么如果要设置到期日怎么操作呢&#xff1f; 首先…...

软件开发安全设计方案

2.1.应用系统架构安全设计要求 2.2.应用系统软件功能安全设计要求 2.3.应用系统存储安全设计要求 2.4.应用系统通讯安全设计要求 2.5.应用系统数据库安全设计要求 2.6.应用系统数据安全设计要求 软件开发全资料获取&#xff1a;软件开发全套资料_软件开发资料-CSDN博客https://…...

【Zabbix】zabbix 软件监控

使用zabbix监控系统查看服务器状态以及网站流量指标&#xff0c;利用监控系统的数据去了解上线发布的结果&#xff0c;和网站的健康状态 利用一个优秀的监控软件&#xff0c;我们可以: ●通过一个友好的界面进行浏览整个网站所有的服务器状态 ●可以在 Web 前端方便的查看监控…...

Vue Router 路由动态缓存组件

文章目录 一、简介基本用法生命周期钩子 二、定义是否缓存组件三、缓存组件1. 通过 :include 属性实现vue2.x中vue3.x中 2. 通过 v-slot 功能实现3. 通过 v-if 来实现 四、注意事项 一、简介 Vue Router 允许你缓存路由组件&#xff0c;这样在用户导航回之前的页面时&#xff…...

数据结构:线性表————单链表专题

&#x1f308;个人主页&#xff1a;小新_- &#x1f388;个人座右铭&#xff1a;“成功者不是从不失败的人&#xff0c;而是从不放弃的人&#xff01;”&#x1f388; &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd; &#x1f3c6;所属专栏&#xff1…...

多线程(54)JMM中的内存屏障

Java内存模型&#xff08;JMM&#xff09;中的内存屏障是一种保证内存可见性、顺序性的底层机制。它们是一组指令&#xff0c;用于在多线程环境中确保内存操作的有序性和可见性。内存屏障主要分为四类&#xff1a;LoadLoad、StoreStore、LoadStore和StoreLoad。 内存屏障的类型…...

什么是流量清洗?

随着网络企业的迅速发展&#xff0c;越来越多的用户都开始关注关于网络流量的问题&#xff0c;同时&#xff0c;随着网络流量的增多&#xff0c;网络上也出现了大量的垃圾信息和恶意攻击&#xff0c;给网络带来了很大的困扰&#xff0c;而流量清洗则能够解决这个问题。 流量清洗…...

淘宝API(通过商品详情接口采集商品页面数据)请求说明文档|可接入测试key

淘宝商品详情数据接口&#xff08;taobao.item_get&#xff09;是天猫开放平台提供的一种API接口&#xff0c;旨在帮助开发者获取天猫平台上的商品详情信息。通过调用这个接口&#xff0c;开发者可以获取包括商品ID、标题、价格、库存量、图片等在内的详细数据&#xff0c;从而…...

示例说明闭包函数

示例说明闭包函数 闭包函数是指在一个函数内部定义另一个函数&#xff0c;并且内部函数可以访问外部函数的局部变量&#xff0c;即使外部函数已经执行完毕。 这种功能使得闭包函数可以捕获外部函数的状态&#xff0c;提供了一种保留局部变量值的方式。闭包函数在编程中常用于…...

【自媒体创作利器】AI白日梦+ChatGPT 三分钟生成爆款短视频

AI白日梦https://brmgo.com/signup?codey5no6idev 引言 随着人工智能&#xff08;AI&#xff09;技术的快速发展&#xff0c;AI在各个领域都展现出了强大的应用潜力。其中&#xff0c;自然语言处理技术的进步使得智能对话系统得以实现&#xff0c;而ChatGPT作为其中的代表之一…...

把握零碎时间,开启长期副业兼职之旅!在家也能轻松赚钱!

转眼间&#xff0c;2024年已悄然走过三分之一。这一年&#xff0c;外界环境似乎并不那么友好&#xff0c;但对我而言&#xff0c;我的月收入仍然相对稳定。我找到的副业让我每月能赚到3000元以上&#xff0c;这让我深感庆幸。 现实中&#xff0c;只依赖主业工资的日子确实艰辛…...

HarmonyOS开发实例:【数字管家app】

样例简介 数字管家场景需要手机端、设备端和服务端三方协同完成&#xff0c;本文档介绍的demo是数字管家大场景中的手机端应用&#xff1b;用户注册登录后可创建我的家庭并管理家庭成员&#xff1b;可以添加设备&#xff08;包括智能台灯&#xff0c;智能窗帘&#xff0c;智能…...

人工智能_大模型033_LangChain003_记忆封装Memory上下文控制机制_LCEL表达式语言---人工智能工作笔记0168

## 三、记忆封装:Memory ### 3.1、对话上下文:ConversationBufferMemory from langchain.memory import ConversationBufferMemory, ConversationBufferWindowMemoryhistory = ConversationBufferMemory() history.save_context({"input": "你好啊"}…...

持安科技与顺丰正式签约!共建零信任应用安全最佳实践

近日&#xff0c;北京持安科技有限公司与顺丰科技有限公司基于零信任“应用数据网关产品”签署了合作协议&#xff0c;持安科技创始人兼CEO何艺、顺丰科技底盘领域负责人刘潭仁出席活动并签署协议。 根据协议&#xff0c;双方将基于持安科技的零信任应用数据网关产品展开合作与…...

Elasticsearch分布式搜索

实用篇-ES-环境搭建 ES是elasticsearch的简称。我在SpringBoot学习 数据层解决方案 的时候&#xff0c;写过一次ES笔记&#xff0c;可以结合一起看一下。 之前在SpringBoot里面写的相关ES笔记是基于Windows的&#xff0c;现在我们是基于docker容器来使用&#xff0c;需要你们提…...

【Unity 实用工具篇】 | UIEffect 实现一系列UGUI特效,灰度、负片、像素化特效

前言 【Unity 实用工具篇】 | UIEffect 实现一系列UGUI特效&#xff0c;灰度、负片、像素化特效一、UGUI特效插件&#xff1a;UIEffect1.1 介绍1.2 效果展示1.3 使用说明及下载 二、组件属性面板三、代码操作组件四、组件常用方法示例4.1 使用灰度特效做头像(关卡)选择 总结 前…...

ECMA进阶1之从0~1搭建react同构体系项目1

ECMA进阶 ES6项目实战前期介绍SSRpnpm 包管理工具package.json 项目搭建初始化配置引入encode-fe-lint 基础环境的配置修改package.jsonbabel相关tsconfig相关postcss相关补充scripts脚本webpack配置base.config.tsclient.config.tsserver.config.ts src环境server端&#xff1…...

【回溯】Leetcode 22. 括号生成【中等】

括号生成 数字 n 代表生成括号的对数&#xff0c;请你设计一个函数&#xff0c;用于能够生成所有可能的并且 有效的 括号组合。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;[“((()))”,“(()())”,“(())()”,“()(())”,“()()()”] 解题思路 1、使用回溯…...

Java生成带数字的图片

Java生成带数字的图片示例 在Java中&#xff0c;你可以使用java.awt和javax.imageio等图形库来生成带有数字的图片。下面是一个简单的示例代码&#xff0c;展示了如何创建并保存一张带有数字的图片。 示例代码 import javax.imageio.ImageIO; import java.awt.*; import…...

FreeSWITCH 1.10.10 简单图形化界面17 - ubuntu22.04或者debian12 安装FreeSWITCH(IamFree)

FreeSWITCH 1.10.10 简单图形化界面17 - ubuntu22.04或者debian12 安装FreeSWITCH 界面预览00、先看使用手册0、安装操作系统1、下载脚本2、开始安装3、登录网页 FreeSWITCH界面安装参考&#xff1a;https://blog.csdn.net/jia198810/article/details/132479324 界面预览 htt…...

【数据结构】06图

图 1. 定义1.1 无向图和有向图1.2 度、入度和出度1.3 图的若干定义1.4 几种特殊的图 2. 图的存储2.1 邻接矩阵-顺序存储&#xff08;数组&#xff09;2.2 邻接表-顺序存储链式存储&#xff08;数组链表&#xff09;2.3 十字链表-适用于有向图2.4 邻接多重表-适用于无向图 3. 图…...

Flink作业 taskmanager.numberOfTaskSlots 这个参数有哪几种设置方式

Flink作业 taskmanager.numberOfTaskSlots 这个参数有哪几种设置方式 taskmanager.numberOfTaskSlots 参数用于设置每个TaskManager上的任务槽&#xff08;task slot&#xff09;数量&#xff0c;决定了TaskManager可以并行执行的任务数量。这个参数可以通过多种方式进行设置。…...

京东详情比价接口优惠券(2)

京东详情API接口在电子商务中的应用与作用性体现在多个方面&#xff0c;对于电商平台、商家以及用户都带来了显著的价值。 首先&#xff0c;从应用的角度来看&#xff0c;京东详情API接口为开发者提供了一整套丰富的功能和工具&#xff0c;使他们能够轻松地与京东平台进行交互。…...

Python knn算法

KNN&#xff08;K-Nearest Neighbors&#xff09;算法&#xff0c;即K最近邻算法&#xff0c;是一种基本且广泛使用的分类和回归方法。在分类问题中&#xff0c;KNN通过查找一个样本点的K个最近邻居&#xff0c;然后根据这些邻居的类别通过多数投票或加权投票来预测该样本点的类…...

[大模型]Langchain-Chatchat安装和使用

项目地址&#xff1a; https://github.com/chatchat-space/Langchain-Chatchat 快速上手 1. 环境配置 首先&#xff0c;确保你的机器安装了 Python 3.8 - 3.11 (我们强烈推荐使用 Python3.11)。 $ python --version Python 3.11.7接着&#xff0c;创建一个虚拟环境&#xff…...

K8S之资源管理

关于资源管理&#xff0c;我们会从计算机资源管理&#xff08;Computer Resources&#xff09;、服务质量管理&#xff08;Qos&#xff09;、资源配额管理&#xff08;LimitRange、ResourceQuota&#xff09;等方面来进行说明 Kubernetes集群里的节点提供的资源主要是计算机资源…...

公司管理系统网站模板下载/百度青岛代理公司

1 --1.通过RAISE弹出框&#xff08;调试时使用&#xff09; 2 --2.通过sqlcode , sqlerrm 这两个内置变量来查看&#xff0c;例如&#xff1a; 3 4 DECLARE 5 --声明异常 6 some_kinds_of_err EXCEPTION; -- Exception to indicate an error…...

北京网站备案拍照地点/怎样制作网站教程

什么是C&#xff03;中的泛型&#xff1f;(What are generics in C#? [closed])什么是C&#xff03;中的泛型&#xff0c;用一个简单的例子来说明&#xff1f; 这个主题有哪些相关文章或网站&#xff1f;What are generics in C#, illustrated with a simple example? What a…...

海南网站设计/深圳网络公司推广平台

用“卷影副本服务”实现网络共享还原——“以前的版本”使用说明内容&#xff1a;功能适用范围&#xff1b;操作方法&#xff1b;注意事项。此功能适用于&#xff1a;恢复意外删除的文件。如果意外删除了某个文件&#xff0c;您可以打开以前的版本&#xff0c;然后将其复制到安…...

镇江网站建设 的公司/百家联盟推广部电话多少

&#x1f4d6;摘要 今天分享下 —— VSCode 更新失败解决 的一些基本知识&#xff0c;欢迎关注&#xff01; 我的VS Code 是1.3.0版本&#xff0c;并且是把同事那已经安装好的Vs Code文件夹拷贝到本机&#xff0c;直接使用的&#xff0c;以此为背景。 &#x1f302;分享 今日 &…...

域名推荐网站/谷歌关键词搜索工具

/// /// 获取某一列的所有值/// /// 列数据类型/// 数据表/// 列名/// public static List GetColumnValues(DataTable dtSource,string filedName){return (from r in dtSource.AsEnumerable() select r.Field("ID")).ToList();}方法调用&#xff1a;获取字段ID的所…...

哪些网站是用php编写的/百度推广代理公司哪家好

今天小编在网上看到一群程序员们在集体探讨自己曾经给自己的电脑文件夹起过怎么样“清新脱俗”的名称&#xff0c;其实不乏老司机们教授各种经验&#xff0c;希望能对大家有用呦&#xff01; 程序员0号 Java(Japanese action video of adult&#xff09; 程序员1号 课程演讲…...