有限元之抛物型方程初边值问题解法

目录

一、原方程的变分形式

二、有限元法进行空间半离散

三、差分法进行时间全离散

四、相关量的数值计算

五、编程时的说明

六、算例实现

6.1 C++代码

6.2 计算结果


        本节我们将采用有限元法联合差分法来数值求解抛物型方程的初边值问题:

\left\{\begin{matrix} \frac{\partial u}{\partial t}-a\frac{\partial^{2}u}{\partial x^{2}}=f(x,t),\;0<x<1,0<t\leqslant T,\\ u(x,0)=\Psi(x),\;0\leqslant x \leqslant1,\\ u(0,t)=u(1,t)=0,\;0<t\leqslant T. \end{matrix}\right. \;\;\;(1)

其中常数a>0

一、原方程的变分形式

        将公式(1)中的第1个方程两边同时乘以函数v(x)并在区间[0,1]上积分,可得

\int_{0}^{1}\frac{\partial u(x,t)}{\partial t}v(x)dx-a\int_{0}^{1}\frac{\partial^{2}u(x,t)}{\partial x^{2}}v(x)dx=\int_{0}^{1}f(x,t)v(x)dx

若取v(x)\in H_{0}^{1}([0,1]),从而v(0)=v(1)=0,再利用分部积分,上式变成为

\int_{0}^{1}\frac{\partial u(x,t)}{\partial t}v(x)dx+a\int_{0}^{1}\frac{\partial u(x,t)}{\partial x}v^{'}(x)dx=\int_{0}^{1}f(x,t)v(x)dx

同样,由公式(1)第2个方程可得

\int_{0}^{1}u(x,0)v(x)dx=\int_{0}^{1}\Psi(x)v(x)dx

这样,就得到原问题的变分形式

        在任意时刻t\in (0,T],求函数u(x,t)\in H_{0}^{1}([0,1])(指的是在固定的时刻t,关于x的函数u(x,t)\in H_{0}^{1}([0,1])),使得

\int_{0}^{1}\frac{\partial u(x,t)}{\partial t}v(x)dx+a\int_{0}^{1}\frac{\partial u(x,t)}{\partial x}v^{'}(x)dx=\int_{0}^{1}f(x,t)v(x)dx,\; \forall v \in H_{0}^{1}([0,1]) \;\;(2)

\int_{0}^{1}u(x,0)v(x)dx=\int_{0}^{1}\Psi(x)v(x)dx,\;\forall v \in H_{0}^{1}([0,1])\;\;(3)

二、有限元法进行空间半离散

        首先对空间区域进行剖分离散,为简单起见,对[0,1]进行等距剖分,步长为h,节点坐标为x_{i}=ih,0\leqslant i\leqslant m\;\;and\;\;h=\frac{1}{m}。设V_{h}H_{0}^{1}([0,1])中的分片连续线性函数空间,其基函数为\phi_{0}(x),\phi_{1}(x),\cdots,\phi_{m}(x)\in V_{h},其定义式为

\varphi_{i}(x)=\left\{\begin{matrix} \frac{x-x_{i-1}}{h},x_{i-1}\leqslant x \leqslant x_{i},\\ \frac{x_{i+1}-x}{h},x_{i}<x\leqslant x_{i+1}=\left\{\begin{matrix} 1-\frac{|x-x_{i}|}{h},x_{i-1}\leqslant x \leqslant x_{i+1},\\ 0,\;else \end{matrix}\right. 1 \leqslant i \leqslant m-1\\ 0,\;else \end{matrix}\right.

\varphi_{0}(x)=\left\{\begin{matrix} \frac{x_{1}-x}{h},x\in[x_{0},x_{1}]\\ 0,\;else \end{matrix}\right.,\varphi_{m}(x)=\left\{\begin{matrix} \frac{x-x_{m-1}}{h},x\in[x_{m-1},x_{m}]\\ 0,\;else \end{matrix}\right.

可知有

\varphi_{i}(x_{j})=\left\{\begin{matrix} 1,i=j,\\ 0,i\neq j. \end{matrix}\right.

        现在假设数值解具有可分离变量的性质,即

u_{h}(x,t)=\sum_{i=0}^{m}\alpha_{i}(t)\phi_{i}(x)

则原来的连续型问题(公式2、公式3)可以相应的离散为:

\int_{0}^{1}\frac{\partial u_{h}(x,t)}{\partial t}v_{h}(x)dx+a\int_{0}^{1}\frac{\partial u_{h}(x,t)}{\partial x}v^{'}_{h}(x)dx=\int_{0}^{1}f(x,t)v_{h}(x)dx,

\int_{0}^{1}u_{h}(x,0)v_{h}(x)dx=\int_{0}^{1}\Psi(x)v_{h}(x)dx,\;\forall v \in V_{h}

\sum_{i=0}^{m}\alpha^{'}_{i}(t)\int_{0}^{1}\varphi_{i}(x)\varphi_{j}(x)dx+a\sum_{i=0}^{m}\alpha_{i}(t)\int_{0}^{1}\varphi^{'}_{i}(x)\varphi^{'}_{j}(x)dx=\int_{0}^{1}f(x,t)\varphi_{j}(x)dx,\;\;(4)

\sum_{i=0}^{m}\alpha_{i}(0)\int_{0}^{1}\varphi_{i}(x)\varphi_{j}(x)dx=\int_{0}^{1}\Psi(x)\varphi_{j}(x)dx,j=0,1,2,\cdots,m.\;\;(5)

如果引入记号

a_{i,j}=\int_{0}^{1}\varphi_{i}(x)\varphi_{j}(x)dx       b_{i,j}=\int_{0}^{1}\varphi^{'}_{i}(x)\varphi^{'}_{j}(x)dx     c_{j}=\int_{0}^{1}\Psi(x)\varphi_{j}(x)dx

F_{j}(t)=\int_{0}^{1}f(x,t)\varphi_{j}(x)dx   ,j=0,1,2,\cdots,m\;\;\;\;(6)

则有a_{i,j}=a_{j,i},b_{i,j}=b_{j,i},且公式(4)和公式(5)可以简写为

\left\{\begin{matrix} A\mathbf{\alpha}^{'}(t)+aB\mathbf{\alpha}(t)=\mathbf{F}(t),\\ A\mathbf{\alpha}(0)=\mathbf{C}. \end{matrix}\right.\;\;\;(7)

其中m+1方阵A,B定义为A=(a_{i,j}),B=(b_{i,j}),且向量\mathbf{C},\mathbf{F}(t),\mathbf{\alpha}(t)分别定义为

\mathbf{C}=\begin{pmatrix} c_{0}\\ c_{1}\\ \vdots\\ c_{m-1}\\ c_{m} \end{pmatrix}   \mathbf{F}(t)=\begin{pmatrix} F_{0}(t)\\ F_{1}(t)\\ \vdots\\ F_{m-1}(t)\\ F_{m} (t)\end{pmatrix}   \mathbf{\alpha}(t)=\begin{pmatrix} \alpha_{0}(t)\\ \alpha_{1}(t)\\ \vdots\\ \alpha_{m-1}(t)\\ \alpha_{m}(t) \end{pmatrix}

        在结构力学中,A称为总质量矩阵,B称为总刚度矩阵,F(t)称为总荷载。

三、差分法进行时间全离散

        经过有限元法离散后得到的离散结构式公式(7)只是在空间上进行了离散,时间变量依然是连续的,这种离散称为半离散,还需要对时间变量进行离散,这样最后得到的离散形式称为全离散。此处采用差分离散,即关于时间的导数用差商近似代替,于是需要对时间区域进行剖分,仍采用等距剖分,对时间区间[0,T]进行剖分。设时间步长为τ,节点坐标为t_{k}=k\tau,0\leqslant k\leqslant n\;\;\;and\;\;\; \tau=\frac{T}{n}。对于半离散方程系统公式(7),在离散节点上应有A\mathbf{\alpha}^{'}(t_{\beta})+aB\alpha(t_{\beta})=\mathbf{F}(t_{\beta})

        特别的:

        (1)若取\beta=k,\alpha^{'}(t_{k})=\frac{\mathbf{\alpha}(t_{k+1})-\mathbf{\alpha}(t_{k})}{\tau}+O(\tau),用数值解\alpha^{k}=(\alpha_{0}^{k},\alpha_{1}^{k},\cdots,\alpha_{m}^{k})^{T}代替精确解\alpha(t_{k})并忽略高阶小项,可得向前欧拉法

A\frac{\mathbf{\alpha}^{k+1}-\mathbf{\alpha}^{k}}{\tau}+aB\mathbf{\alpha}^{k}=\mathbf{F}(t_{k}),局部截断误差为O(\tau)

        (2)若取\beta=k+\frac{1}{2},其中

t_{k+\frac{1}{2}}=\frac{t_{k}+t_{k+1}}{2}\;\;and\;\;\mathbf{\alpha}^{'}(t_{k+\frac{1}{2}})=\frac{\mathbf{\alpha}(t_{k+1})-\mathbf{\alpha}(t_{k})}{\tau}+O(\tau^{2})

再利用数值解\alpha^{k}=(\alpha_{0}^{k},\alpha_{1}^{k},\cdots,\alpha_{m}^{k})^{T}代替精确解\alpha(t_{k})并忽略高阶小项,可得Crank-Nicolson方法

A\frac{\mathbf{\alpha}^{k+1}-\mathbf{\alpha}^{k}}{\tau}+aB\frac{\mathbf{\alpha}^{k+1}+\mathbf{\alpha}^{k}}{2}=\mathbf{F}(\frac{t_{k}+t_{k+1}}{2}),局部截断误差为O(\tau^{2})

        (3)若取\beta=k+1,\alpha^{'}(t_{k+1})=\frac{\mathbf{\alpha}(t_{k+1})-\mathbf{\alpha}(t_{k})}{\tau}+O(\tau)再利用数值解\alpha^{k}=(\alpha_{0}^{k},\alpha_{1}^{k},\cdots,\alpha_{m}^{k})^{T}代替精确解\alpha(t_{k})并忽略高阶小项,可得向后欧拉法

A\frac{\mathbf{\alpha}^{k+1}-\mathbf{\alpha}^{k}}{\tau}+aB\mathbf{\alpha}^{k+1}=\mathbf{F}(t_{k+1}),局部截断误差为O(\tau)

整理以后可以得到全离散格式:

       k=0,1,\cdots,n-1,

(A+\theta a \tau B)\mathbf{\alpha}^{k+1}=(A-(1-\theta)a\tau B)\mathbf{\alpha}^{k}+\tau \mathbf{F}((1-\theta)t_{k}+\theta t_{k+1}) \;\;(8)

        取\theta =0,\frac{1}{2},1分别对应向前欧拉有限元格式Crank-Nicolson有限元格式、向后欧拉有限元格式。

        由公式(7)第2式,上述格式都可以取初始值:

\mathbf{\alpha}^{0}=\mathbf{\alpha}(0)=A^{-1}\mathbf{C}\;\;\;(9)

        采用追赶法求解公式(8)即可。

四、相关量的数值计算

        1、a_{i,j}的计算。

        直接计算可得总质量矩阵

A=(a_{ij})=\frac{h}{6}\begin{pmatrix} 2 & 1 & & 0 & \\ 1 & 4 & 1 & & \\ & \ddots & \ddots & \ddots & \\ & & 1 & 4 & 1\\ & 0 & & 1 & 2 \end{pmatrix}_{(m+1)\times(m+1)}

        2、b_{i,j}的计算。

        直接计算可得总刚度矩阵

B=(b_{ij})=\frac{1}{h}\begin{pmatrix} 1 & -1 & & 0 & \\ -1 & 2 & -1 & & \\ & \ddots & \ddots & \ddots & \\ & & -1 & 2 & -1\\ & 0 & & -1 & 1 \end{pmatrix}_{(m+1)\times(m+1)}

        3、c_{j}F_{j}(t)的计算。

        可以利用数值节分公式\int_{a}^{b}g(x)dx \approx \frac{b-a}{2}(g(\frac{a+b}{2}-\frac{b-a}{2\sqrt{3}})+g(\frac{a+b}{2}+\frac{b-a}{2\sqrt{3}}))近似计算得到。

        4、边界条件的处理。

        由于对连续问题有边界条件u(0,t)=u(1,t)=0,离散情况下则为u_{h}(0,t)=u_{h}(1,t)=0,从而利用

u_{h}(x_{i},t)=\sum_{j=0}^{m}\alpha_{j}(t)\varphi_{j}(x)|_{x=x_{i}}=\alpha_{i}(t)

得到\alpha_{0}(t)=\alpha_{m}(t)=0,即有\alpha_{0}(t_{k})=\alpha_{m}(t_{k})=0,k=1,2,\cdots,n,因此可以取边界条件为\alpha_{0}^{k}=\alpha_{m}^{k}=0,k=1,2,\cdots,n

五、编程时的说明

        1、初始值。

        上文中初始值取成公式(9),因此在实际计算中需要求解一个三对角线性方程组,计算比较复杂。事实上还可以这样考虑,由于初始条件为u(x,0)=\Psi(x),所以

u_{h}(x_{i},0)=\sum_{j=0}^{m}\alpha_{j}(0)\varphi_{j}(x_{i})=\alpha_{i}(0)\approx\Psi(x)

可以将\alpha_{i}^{0}取成\Psi(x_{i}),i=0,1,\cdots,m从而简化初始值的计算。

        2、线性方程组的系数矩阵。

        原则上线性方程组(公式 8)中的矩阵A,B和向量F的计算都可以利用小的剖分单元上的单元质量矩阵、单元刚度矩阵和单元荷载来合成。具体操作可以参考专栏第一篇文章内容。

有限元之初探门径-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/L_peanut/article/details/139091636        3、数值格式(公式 8)是一个时间渐进格式,在第0个时间层,初始信息为\mathbf{\alpha}^{0},可以用公式(9)来计算,也可以直接取\alpha_{i}^{0}\Psi(x_{i}),i=0,1,\cdots,m,然后利用公式(8)计算第1个时间层上的信息\mathbf{\alpha}^{1},但是在计算\mathbf{\alpha}^{1}时,由于边界信息已知,即\mathbf{\alpha}_{0}^{1}=\alpha_{m}^{1}=0,所以需要修改线性方程组(公式 8)左边的系数矩阵A+\theta a \tau B,使它的第0行元素和第0列元素除了第0行第0列这一个元素取成1以外,其它元素都取成0。同样,第m行元素和第m列元素除了第m行第m列这一个元素取成1以外,其它元素都取成0。最后修改公式(8)右边的列向量(A-(1-\theta)a\tau B)\mathbf{\alpha}^{k}+\tau \mathbf{F}((1-\theta)t_{k}+\theta t_{k+1}),使其第0个元素及第m个元素均为0。这样,线性方程组(公式 8)求解完以后可以保证边界条件\mathbf{\alpha}_{0}^{1}=\alpha_{m}^{1}=0成立,这样得到完整的第1个时间层上的信息\mathbf{\alpha}^{1}。然后按照同样的方法继续计算后面第2,3,…,n个时间层上的信息。最终,可以得到数值解在第k,k=0,1,…,n个时间层上的近似式

u_{u}(x,t_{k})=\sum_{j=0}^{m}\alpha_{j}(t_{k})\varphi_{j}(x)\approx\sum_{j=0}^{m}\alpha^{k}_{j}\varphi_{j}(x)

显然,有限元离散后x方向每个位置都有数值解,但差分离散后t方向只在节点处有信息。

六、算例实现

        用有限元求解抛物型方程的初边值问题:

\left\{\begin{matrix} \frac{\partial u}{\partial t}-2\frac{\partial ^{2}u}{\partial x^{2}}=0,0<x<\pi,0<t\leqslant1,\\ u(x,0) =5sin(2x)-30sin(3x),0\leqslant x\leqslant \pi,\\ u(0,t)=u(1,t)=0,0<t\leqslant 1. \end{matrix}\right.

已知其精确解为u(x,t)=5e^{-8t}sin(2x)-30e^{-18t}sin(3x)。分别取第一种剖分数m=n=16和第二种剖分数m=n=32,输出在节点(\frac{i\pi}{8},\frac{1}{2}),i=1,2,\cdots,7处的数值解并给出误差。

6.1 C++代码


#include <cmath>
#include <stdio.h>
#include <stdlib.h>
#define pi 3.14159265359

int m,n;
double h,tau,T,*xco,**alpha;
double gauss=0.5773502692;   //数值积分中的高斯点

int main(int argc, char *argv[])
{
        int i,k;
        double a1,*t,*a,*b,*c,*d,*ans,tmid,temp1,temp2;
        double f(double x, double t);
        double phi(int i, double x);
        double psi(double x);
        double fun1(int i, double x, double t);
        double integral(double a, double b, int i, double t, double(*fun)(int, double, double));
        double exact(double x, double t);
        double *chase_algorithm(int n, double *a, double *b, double *c, double *d);

        m=16;
        n=16;
        printf("m=%d, n=%d.\n",m,n);

        h=pi/m;    //空间步长
        T=1.0;    //时间终点
        tau=T/n;   //时间步长
        a1=2.0;   //热的扩散率,原方程中的常系数a

        xco=(double *)malloc(sizeof(double)*(m+1));   //位移x方向上的剖分节点坐标
        for(i=0;i<=m;i++)
                xco[i]=i*h;

        t=(double *)malloc(sizeof(double)*(n+1));   //时间t方向上的剖分节点坐标
        for(k=0;k<=n;k++)
                t[k]=k*tau;

        alpha=(double **)malloc(sizeof(double *)*(m+1));   //设置二维数组alpha(i,k), i表示空间分量,k表示时间分量
        for(i=0;i<=m;i++)
                alpha[i]=(double *)malloc(sizeof(double)*(n+1));
        for(i=0;i<=m;i++)
                alpha[i][0]=psi(xco[i]);   //用简化的方法计算初始值

        a=(double *)malloc(sizeof(double)*(m+1));   //计算线性方程组的系数矩阵(三对角)
        b=(double *)malloc(sizeof(double)*(m+1));
        c=(double *)malloc(sizeof(double)*(m+1));
        temp1=h/6.0-a1*tau/(2*h);
        temp2=2*h/3.0+a1*tau/h;
        for(i=0;i<=m;i++)
        {
                a[i]=temp1;   //下次对角线上的元素
                b[i]=temp2;   //主对角线上的元素
                c[i]=temp1;   //上次对角线上的元素
        }
        b[0]=b[0]/2.0;
        b[m]=b[m]/2.0;

        d=(double *)malloc(sizeof(double)*(m+1));   //计算线性方程组的右端项
        for(k=0;k<n;k++)
        {
                tmid=(t[k]+t[k+1])/2.0;   //计算向量tau*F(tmid)
                for(i=1;i<m;i++)
                {
                        d[i]=integral(xco[i-1],xco[i],i,tmid,fun1)+integral(xco[i],xco[i+1],i,tmid,fun1);
                }
                d[0]=integral(xco[0],xco[1],0,tmid,fun1);
                d[m]=integral(xco[m-1],xco[m],m,tmid,fun1);

                temp1=2.0*h/3.0-a1*tau/h;
                temp2=h/6.0+a1*tau/(2*h);
                //计算(A-a*tau*B/2.0)*alpha[k]
                for(i=1;i<=m-1;i++)
                {
                        d[i]=d[i]+temp2*(alpha[i-1][k]+alpha[i+1][k])+temp1*alpha[i][k];
                }
                d[0]=d[0]+temp1*alpha[0][k]/2.0+temp2*alpha[1][k];
                d[m]=d[m]+temp2*alpha[m-1][k]+temp1*alpha[m][k]/2.0;

                //处理零边界条件
                d[0]=0.0; d[m]=0.0;
                b[0]=1.0; c[0]=0.0;
                a[1]=0.0; a[m]=0.0;
                c[m-1]=0.0; b[m]=1.0;

                ans=chase_algorithm(m+1,a,b,c,d);
                for(i=0;i<=m;i++)
                        alpha[i][k+1]=ans[i];
                free(ans);
        }

        free(a);free(b);free(c);free(d);
        k=m/8;
        for(i=k;i<m;i=i+k)
        {
                printf("alpha[%d][%d]=%f, err=%.4e.\n", i, n/2, alpha[i][n/2], fabs(exact(xco[i], T/2.0)-alpha[i][n/2]));
        }
        for(i=0;i<=m;i++)
                free(alpha[i]);
        free(xco);free(alpha);free(t);

        return 0;
}



//右端项函数f(x,t)
double f(double x, double t)
{
        return 0.0;
}
//基函数
double phi(int i, double x)
{
        double temp, z;

        temp=fabs(x-xco[i]);
        if(temp<=h)
                z=1.0-temp/h;
        else
                z=0.0;

        return z;
}
double psi(double x)
{
        return 5*sin(2*x)-30*sin(3*x);
}
//计算单元荷载时的被积函数
double fun1(int i, double x, double t)
{
        return f(x,t)*phi(i,x);
}
//在区间[a,b]上对被积函数fun(i,x,t)进行数值积分(两点高斯公式)
double integral(double a, double b, int i, double t, double(*fun)(int, double, double))
{
        double mid, w, ans;
        mid=(b+a)/2.0;
        w=(b-a)/2.0;
        ans=w*((*fun)(i,mid+w*gauss,t)+(*fun)(i,mid-w*gauss,t));

        return ans;
}
double exact(double x, double t)
{
        return 5*exp(-8.0*t)*sin(2*x)-30*exp(-18.0*t)*sin(3*x);
}
//追赶法
double * chase_algorithm(int n, double *a, double *b, double *c, double *d)
{
        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;
}

6.2 计算结果

(1)当m=n=16时,计算结果如下:

m=16, n=16.
alpha[2][8]=0.055488, err=5.8471e-03.
alpha[4][8]=0.078932, err=1.0029e-02.
alpha[6][8]=0.056490, err=9.6821e-03.
alpha[8][8]=0.000767, err=2.9351e-03.
alpha[10][8]=-0.055903, err=7.4356e-03.
alpha[12][8]=-0.080017, err=1.4179e-02.
alpha[14][8]=-0.056905, err=1.1271e-02.

(2)当m=n=32时,计算结果如下:

m=32, n=32.
alpha[4][16]=0.060101, err=1.2341e-03.
alpha[8][16]=0.086607, err=2.3533e-03.
alpha[12][16]=0.063613, err=2.5593e-03.
alpha[16][16]=0.002688, err=1.0143e-03.
alpha[20][16]=-0.061556, err=1.7830e-03.
alpha[24][16]=-0.090408, err=3.7876e-03.
alpha[28][16]=-0.065068, err=3.1082e-03.

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

达梦数据库安装手册

首先了解达梦数据库相关内容&#xff1a; 达梦在线服务平台 下载windows版本开发版&#xff0c;将下载的文件解压。进行安装 2、安装流程&#xff0c;默认选择下一步。 3、安装引导&#xff0c;默认下一步&#xff0c;安装实例可以进行修改 4、最后一步记录一下创建的摘要 …

六西格玛项目课题决策权归属:谁来做主更明智?

在实施六西格玛的过程中&#xff0c;一个关键的问题摆在了我们面前&#xff1a;应该由谁决定六西格玛的项目课题&#xff1f;这个问题不仅关系到项目能否顺利实施&#xff0c;更直接影响到企业整体绩效的提升。深圳天行健企业管理咨询公司解析如下&#xff1a; 首先&#xff0…

基于Java实现的图书管理系统

前言&#xff1a;该图书管理系统实现了查找、添加、删除、显示、借阅、归还等功能&#xff0c;分为两个用户群体&#xff1a;管理者和普通用户。使用了类与对象&#xff0c;封装继承多态&#xff0c;抽象类和接口等Java基础知识。 一.思路 面向对象三部曲&#xff1a;找对象&…

JavaDS-学习数据结构之如果从零开始手搓顺序表,顺带学习自定义异常怎么用!

前言 笔者开始学习数据结构了,虽然笔者已经会用了,不管是C 中的stl亦或是Java 中的集合,为了算法比赛多少都突击过,但只知其然而不知其所以然,还是会限制发展的,因此,笔者写下这篇博客.内容是手搓一个顺序表.顺带加一点异常的使用,大伙看个乐子就好了.有错误直接私信喷我就好了…

【AI赋能】香橙派OrangePi AIpro初体验

【AI赋能】香橙派OrangePi AIpro初体验 1、初识香橙派1.1、仪式感开箱1.2、OrangePi AIpro(8T)介绍 2、上电开机2.1、开机2.2、串口调试2.2.1 两种方式登录2.2.2 相关信息 2.3、启动系统2.4、网络配置 3、连接摄像头4、目标检测4.1、Jupyter Lab模式4.2、 目标检测测试4.2.1 视…

花钱学谢宁DOE培训,投入产出比到底如何?

在当今这个快速发展的时代&#xff0c;无论是职场人士还是创业者&#xff0c;都渴望通过不断学习来提升自我能力&#xff0c;以便在竞争激烈的市场中脱颖而出。其中&#xff0c;谢宁DOE培训因其独特的理念和方法&#xff0c;吸引了众多求学者的目光。然而&#xff0c;面对不菲的…

多条文本转二维码怎么做?一键批量建码的使用技巧

怎么快速的制作多条文本信息的二维码&#xff1f;随着二维码的广泛使用&#xff0c;现在很多内容都可以通过生成二维码扫码的方式来获取信息&#xff0c;其他文本二维码就是比较常用的一种类型。那么当需要将多条不同的文本内容每条单独生成二维码时&#xff0c;有什么方法可以…

如何借VR之手,让展厅互动更精彩?

VR虚拟现实技术以其卓越的沉浸式体验为特点&#xff0c;引领用户踏入一个全新的虚拟世界&#xff0c;正因如此&#xff0c;它开始被广泛应用于展厅、商业等多个领域。那么&#xff0c;今天&#xff0c;让我们就来了解一下这种技术是如何为展厅带来精彩互动体验的吧&#xff01;…

Hudi之数据读写探究

Hudi之数据读写深入探究 1. Hudi数据写入 1-1. 写操作 Hudi数据湖中的数据更新、插入和删除操作&#xff0c;是一个基于Apache Hadoop的库&#xff0c;为数据湖提供了一种有效的方法来处理更新和增量数据&#xff0c;并支持基于时间的快照和增量数据处理。Hudi支持三种主要的…

可道云网盘的URL链接能干什么?小白必看的teamOS使用技巧

在繁复的工作日常里&#xff0c;我们每天都在与各种文件和资料打交道。由于文件夹太多&#xff0c;常常会陷入那种死活找不到想要的文件的困境中。 比如询问同事&#xff0c;合同模板在哪&#xff0c;直接发微信当然是很快的&#xff0c;但是事后想归档总是格外麻烦。比如&…

英飞凌24GHz毫米波雷达-BGT24LTR11N16家用机器人应用

BGT24LTR11N16基础描述&#xff1a; 关于BGT24LTR11N16&#xff0c;它是一款用于信号生成和接收的硅锗雷达MMlC&#xff0c;工作频率为24.00GHz至24.25GHz ISM频段。它基于24GHz基本电压控制振荡器&#xff08;VCO&#xff09;。 这颗芯片是属于1T1R&#xff0c;也就是一发一收…

10年老运营人吐血整理,给新媒体运营人的20条建议!沈阳新媒体运营培训

对于企业&#xff0c;在新媒体平台开设官方账号应该是已经成为标配。不仅是对企业新媒体运营需求量提高&#xff0c;新媒体人的薪资也是水涨船高。 另外值得注意的是&#xff0c;企业对资深新媒体运营人才尤为重视&#xff0c;这表现在他们不惜重金招聘高薪新媒体运营人才&…

Android Studio中xml预览不显示问题解决办法

具体表现&#xff1a; Android Studio的XML中可以看到视图的相对位置结构&#xff0c;但是看不到具体的模样&#xff0c;全黑&#xff0c;等于半摸黑调UI&#xff08;由于我已经修好了所以没有截图&#xff09;。不是所有的项目都会这样&#xff0c;一部分项目是正常的。 或许…

OrangePi_Kunpeng_Pro开发板测验——性能巨人

文章目录 &#x1f4d1;前言一、开箱初体验的愉悦二、产品规格概述三、前置工作四、性能测试4.1 CPU 性能测试4.1.1 单线程 CPU 测试4.1.2 多线程 CPU 测试 4.2 内存性能测试4.2.1 内存读写性能测试4.2.2 高负载内存测试 4.3 I/O 性能测试4.4 网络性能测试4.5 测试小结4.5.1 CP…

跨域的解决方案

1. 计算机更改跨域 1.C盘->Windows->System32->drivers->etc 2.修改hosts 文件2. Chrome浏览器的跨域设置 操作步骤&#xff1a;1.打开我的电脑——C盘 新建一个文件夹&#xff0c;命名为MyChromeDevUserData2.右键——Chrome——快捷方式——目标&#xff0c;在…

使用python绘制一个五颜六色的爱心

使用python绘制一个五颜六色的爱心 介绍效果代码 介绍 使用numpy与matplotlib绘制一个七彩爱心&#xff01; 效果 代码 import numpy as np import matplotlib.pyplot as plt# Heart shape function def heart_shape(t):x 16 * np.sin(t)**3y 13 * np.cos(t) - 5 * np.cos…

高级软件工程师带你解决MySQL死锁问题Deadlock found when trying to get lock实战案例全网唯一

高级软件工程师带你解决MySQL死锁问题Deadlock found when trying to get lock实战 前言 笔者我实际工作中&#xff0c;经常遇到mysql数据库死锁问题&#xff01;CSDN上面也有很多大神刨析解决方法&#xff01; 我在实际工作中的MySQL数据库架构很复杂&#xff0c;又涉及到主…

「异步魔法:Python数据库交互的革命」(一)

Hi&#xff0c;我是阿佑&#xff0c;今天将和大家一块打开异步魔法的大门&#xff0c;进入Python异步编程的神秘领域&#xff0c;学习如何同时施展多个咒语而不需等待。了解asyncio的魔力&#xff0c;掌握Async SQLAlchemy和Tortoise-ORM的秘密&#xff0c;让你的数据库操作快如…

Linux新增磁盘挂载分区

1. 查看磁盘分区名称 lsblk 可见&#xff0c;新增的分区为 sdb 2.格式化磁盘 mkfs.xfs -f /dev/sdb 3.挂在磁盘到 /ocean目录&#xff0c;挂在前先创建空目录 /ocean mkdir /oceanmount /dev/sdb /ocean 执行后&#xff0c;可用 df -h 查看分区是否成功 4.持久化磁盘分区&a…

如何让物理服务器可以运行多个虚拟机:VMware ESXi系统安装-详细介绍

目录 一、虚拟机&#xff08;比如VMware ESXi上的虚拟机&#xff09;及其优势 &#xff08;一&#xff09;虚拟机 &#xff08;二&#xff09;虚拟机应用和优势 1、硬件资源利用率提升 2、灵活性和可扩展性 3、高可用性 4、简化管理 5、绿色节能 6、快速响应业务需求 …