1、%对于 d2u/dx2=f 的 FEM 解算器,其中 f=x*(1-x)%边界条件 u(0)=0, u(1)=0.%精确解用以比对xx=linspace(0,1,101);%产生 0-1 之间的均分指令,101 为元素个数uex=(1/6).*xx.3-(1/12).*xx.4-(1/12).*xx;%对力项设置高斯点的数目NGf=2;if (NGf=2)xiGf=-1/sqrt(3);1/sqrt(3);% 1、 2 的值aGf=1 1;else,NGf=1;xiGf=0.0;aGf=2.0;end%单元数目Ne=5;%建立网格节点x=linspace(0,1,Ne+1);%零刚性矩阵K=z
2、eros(Ne+1,Ne+1);b=zeros(Ne+1,1);%对所有单元循环计算刚性和残差for ii=1:Ne,kn1=ii;kn2=ii+1;x1=x(kn1);x2=x(kn2);dx=x2-x1;%每一个单元的长度dxidx=2/dx;%d/dxdxdxi=1/dxidx;%dx/ddN1dxi=-1/2;%d 1/ddN2dxi=1/2;%d 2/ddN1dx=dN1dxi*dxidx;%-1/(xj-xj-1)dN2dx=dN2dxi*dxidx;%1/(xj-xj-1)K(kn1,kn1)=K(kn1,kn1)-2*dN1dx*dN1dx*dxdxi;%Rj 的第二项K(kn
3、1,kn2)=K(kn1,kn2)-2*dN1dx*dN2dx*dxdxi;K(kn2,kn1)=K(kn2,kn1)-2*dN2dx*dN1dx*dxdxi;K(kn2,kn2)=K(kn2,kn2)-2*dN2dx*dN2dx*dxdxi;%用高斯积分估计力项的积分for nn=1:NGf%NGf=2xiG=xiGf(nn);%得到高斯点的 N1=0.5*(1-xiG);%求 N1 和 N2(即在 xiG 的权重/ 插值) 形状函数在 的值N2=0.5*(1+xiG);% 值fG=xiG*(1-xiG);%对 点求 fgG1=N1*fG*dxdxi;%在节点处估计权函数在高斯点的被积函数g
4、G2=N2*fG*dxdxi;%估计是个积分值b(kn1)=b(kn1)+aGf(nn)*gG1;% aGf 为 1b(kn2)=b(kn1)+aGf(nn)*gG2;endend%在 x=0 处设置 Dirichlet 条件kn1=1;K(kn1,:)=zeros(size(1,Ne+1);K(kn1,kn1)=1;b(kn1)=0;%在 x=1 处设置 Dirichlet 条件kn1=1;K(kn1,:)=zeros(size(1,Ne+1);K(kn1,kn1)=1;b(kn1)=0;%求解方程v=Kb;%v 为 Kx=b 的解plot(x,v,*-);%画图并比较hold on;plot(xx,uex);hold off;xlabel(x);ylabel(u);