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

目录

一、原方程的变分形式

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

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

四、相关量的数值计算

五、编程时的说明

六、算例实现

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.14159265359int 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;   //热的扩散率,原方程中的常系数axco=(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;elsez=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.rhkb.cn/news/335848.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Element-UI 入门指南:从安装到自定义主题的详细教程

Element-UI 是一个基于 Vue.js 的前端组件库&#xff0c;它提供了丰富的 UI 组件&#xff0c;可以帮助开发者快速构建高质量的用户界面。以下是使用 Element-UI 的快速入门指南&#xff1a; 安装 Element-UI Element-UI 是一个基于 Vue.js 的组件库&#xff0c;它提供了丰富的…

LangChain入门开发教程(一):Model I/O

官方文档&#xff1a;https://python.langchain.com/docs/get_started/introduction/ LangChain是一个能够利用大语言模型&#xff08;LLM&#xff0c;Large Language Model&#xff09;能力进行快速应用开发的框架&#xff1a; 高度抽象的组件&#xff0c;可以像搭积木一样&a…

LeetCode2336无限集中的最小数字

题目描述 现有一个包含所有正整数的集合 [1, 2, 3, 4, 5, …] 。实现 SmallestInfiniteSet 类&#xff1a;SmallestInfiniteSet() 初始化 SmallestInfiniteSet 对象以包含 所有 正整数。int popSmallest() 移除 并返回该无限集中的最小整数。void addBack(int num) 如果正整数 …

基于Python实现 HR 分析(逻辑回归和基于树的机器学习)【500010104】

介绍 数据集说明 此数据集包含与员工有关的综合属性集合&#xff0c;从人口统计细节到与工作相关的因素。该分析的主要目的是预测员工流动率并辨别导致员工流失的潜在因素。 在这个数据集中&#xff0c;有14,999行&#xff0c;10列&#xff0c;以及这些变量&#xff1a;满意度…

Python轻量级的插件框架库之pluginbase使用详解

概要 在软件开发中,插件系统是一个常见的需求。插件系统允许开发者动态加载和卸载功能模块,从而提高应用程序的灵活性和可扩展性。Python的pluginbase库是一个轻量级的插件框架,旨在简化插件系统的构建过程。pluginbase库提供了一套简单易用的API,使开发者能够快速集成插件…

leetCode-hot100-数组专题之子数组+二维数组

数组专题之子数组二维数组 子数组238.除自身以外数组的乘积560.和为K的子数组 二维数组48.旋转图像 子数组 数组的子数组问题是算法中常见的一类问题&#xff0c;通常涉及到数组的连续元素。在解决这类问题时&#xff0c;常用的方法有前缀和、滑动窗口、双指针&#xff0c;分治…

Sping源码(九)—— Bean的初始化(非懒加载)— getMergedLocalBeanDefinition

序言 前两篇文章介绍了Bean初始化之前的一些准备工作&#xff0c;包括设置BeanFacroty的ConversionService属性以及将Bean进行冻结。这篇文章将会进入到preInstantiateSingletons方法。进一步了解Bean的初始化流程。 preInstantiateSingletons public void preInstantiateSin…

一篇文章讲透排序算法之快速排序

前言 本篇博客难度较高&#xff0c;建议在学习过程中先阅读一遍思路、浏览一遍动图&#xff0c;之后研究代码&#xff0c;之后仔细体会思路、体会动图。之后再自己进行实现。 一.快排介绍与思想 快速排序相当于一个对冒泡排序的优化&#xff0c;其大体思路是先在文中选取一个…

装机必备——截图工具Snipaste安装教程

装机必备——截图工具Snipaste安装教程 软件下载 软件名称&#xff1a;Snipaste2.7 软件语言&#xff1a;简体中文 软件大小&#xff1a;15.37M 系统要求&#xff1a;Windows7或更高&#xff0c; 32/64位操作系统 硬件要求&#xff1a;CPU2GHz &#xff0c;RAM2G或更高 下载通…

数据结构(七)查找

2024年5月26日一稿&#xff08;王道P291&#xff09; 7.1 查找的基本概念 7.2 顺序查找和折半查找 7.2.1 顺序查找 7.2.2 折半查找 7.2.3 分块查找 7.3 树形查找 7.3.1 二叉排序树(BST) 7.3.2 平衡二叉树 7.4 B树和B树 7.4.1 B树及其基本操作 7.4.2 B树的基本概念 7.5 散列&…

idea、datagrip注册记录下

一、DataGrip注册 DataGrip版本号&#xff1a;DataGrip 2023.2 访问地址&#xff1a;https://3.jetbra.in/ 点击“hardbin.com”&#xff0c;下载“jetbra.zip” 在vm里面添加上&#xff1a; -javaagent:D:\work\idea\jetbra\ja-netfilter.jarjetbrains重启datagrip 在刚刚…

【408真题】2009-28

“接”是针对题目进行必要的分析&#xff0c;比较简略&#xff1b; “化”是对题目中所涉及到的知识点进行详细解释&#xff1b; “发”是对此题型的解题套路总结&#xff0c;并结合历年真题或者典型例题进行运用。 涉及到的知识全部来源于王道各科教材&#xff08;2025版&…

WebGL技术在教育培训中的应用

WebGL技术在教育培训中的应用非常广泛&#xff0c;通过其强大的三维图形处理能力&#xff0c;能够为教育培训提供更加生动、互动和沉浸式的学习体验。以下是WebGL在教育培训中的几个主要应用及其具体实现。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xf…

奶奶也能看懂的耦合协调度分析

不会计算&#xff1f;跟着文献学起来~ 案例数据连接&#xff08;复制链接后粘贴到浏览器中&#xff09;&#xff1a; 耦合协调度数据​spssau.com/spssaudata.html?shareDataF363000CD033FF15E557BB75B9B0D412 假如你有这样一组数据&#xff1a; 如何进行计算分析耦合协调度…

蓝桥楼赛第30期-Python-第三天赛题 统计学习数据题解

楼赛 第30期 Python 模块大比拼 统计学习数据 介绍 JSON&#xff08;JavaScript Object Notation, /ˈdʒeɪsən/&#xff09;是一种轻量级的数据交换格式&#xff0c;最初是作为 JavaScript 的子集被发明的&#xff0c;但目前已独立于编程语言之外&#xff0c;成为了通用的…

淘宝API探秘:一键获取店铺所有商品的魔法之旅

在数字时代的今天&#xff0c;数据已经成为了商业世界中的魔法石。而对于淘宝店主或者那些想要深入探索淘宝数据的人来说&#xff0c;淘宝API就像是打开阿里巴巴宝藏库的钥匙。今天&#xff0c;我们就来一起探索如何使用淘宝API&#xff0c;特别是如何获取店铺所有商品的接口&a…

ElasticSearch学习篇12_《检索技术核心20讲》基础篇

背景 学习极客实践课程《检索技术核心20讲》https://time.geekbang.org/column/article/215243 课程分为基础篇、进阶篇、系统案例篇 主要记录企业课程学习过程课程大纲关键点&#xff0c;以文档形式记录笔记。 内容 检索技术&#xff1a;它是更底层的通用技术&#xff0c…

芝加哥大学最新研究:GPT-4与财务预测,重塑财务分析的未来

最近&#xff0c;芝加哥大学的研究团队发表了一篇突破性的研究&#xff0c;展示了大型语言模型&#xff08;LLM&#xff09;&#xff0c;特别是 OpenAI 开发的 GPT-4&#xff0c;如何在财务报表分析领域取得了与专业分析师相匹配甚至超越的表现。这项研究不仅凸显了人工智能在高…

鸿蒙开发接口图形图像:【WebGL】

WebGL WebGL提供图形绘制的能力&#xff0c;包括对当前绘制图形的位置、颜色等进行处理。 WebGL标准图形API&#xff0c;对应OpenGL ES 2.0特性集。 说明&#xff1a; 开发前请熟悉鸿蒙开发指导文档&#xff1a; gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md…

dp秒杀优惠券

1、全局id生成器 当用户抢购时&#xff0c;就会生成订单并保存到tb_voucher_order这张表中&#xff0c;而订单表如果使用数据库自增ID就存在一些问题&#xff1a; id的规律性太明显受单表数据量的限制 场景分析&#xff1a;如果我们的id具有太明显的规则&#xff0c;用户或者…