二维有限元,线性插值

设置u=-(x*x+y*y),c=(x+y),可得f=6*(x+y),设置所有边界条件为dirichlet边界条件,其他条件应该也不复杂。boundaryedge矩阵是自己对着生成网格给出来的。感觉最难的地方就是在计算单元刚度矩阵的时候,因为使用了坐标变换,变成\zeta \eta平面的标准三角形。(xi,yi),(xj,yj),(xm,ym)分别对应到(0,0),(1,0),(0,1)。

clc
clear all
n=10;
m=10;
%%计算一个二维网格,长度,宽度都为1,均分成10份,一共200个单元,121格节点,采用线性插值
%%P矩阵
for i=1:n+1
    for j=1:m+1
        p(1,(i-1)*(m+1)+j)=1/m*(i-1);
        p(2,(i-1)*(m+1)+j)=(j-1)*1/m;
    end
end
%%T矩阵
a=1;
b=2;
for i=1:n
    for j=1:m
        T(:,2*((i-1)*n+j)-1)=[a,a+11,a+12];
        T(:,2*((i-1)*n+j))=[b,b-1,b+11];
        a=a+1;
        b=b+1;
    end
    a=a+1;
    b=b+1;
end
%%边界边矩阵
    boundaryedge=[1,1,1,12;1,21,12,23;1,41,23,34;1,61,34,45;1,81,45,56;1,101,56,67;1,121,67,78;
        1,141,78,89;1,161,89,100;1,181,100,111;1,181,111,112;1,183,112,113;1,185,113,114;1,187,114,115;
        1,189,115,116;1,191,116,117;1,193,117,118;1,195,118,119;1,197,119,120;1,199,120,121;
        1,200,121,110;1,180,110,99;1,160,99,88;1,140,88,77;1,120,77,66;1,100,66,55;1,80,55,44;1,60,44,33;1,40,33,22;1,20,22,11;
        1,20,11,10;1,18,10,9;1,16,9,8;1,14,8,7;1,12,7,6;1,10,6,5;1,8,5,4;1,6,4,3;1,4,3,2;1,2,2,1];
%%构造基函数
K=zeros((n+1)*(m+1),(n+1)*(m+1));
F=zeros((n+1)*(m+1),1);
for  element=1:2*n*m
    i=T(1,element);
    j=T(2,element);
    m=T(3,element);  
    xi=p(1,i);
    yi=p(2,i);
    xj=p(1,j);
    yj=p(2,j);
    xm=p(1,m);
    ym=p(2,m);
    %%单元面积
    delta=[xi,yi,1;xj,yj,1;xm,ym,1];
    delta_s=det(delta);
    s=0.5; 
    DELTA_S=(xi-xm)*(yj-ym);
%%    
syms x y

fun_c =@(x,y) (xi-xm)*x+(xj-xm)*y+xm+(yi-ym)*x+(yj-ym)*y+ym;

fun_ni= @(x, y)  6*((xi-xm)*x+(xj-xm)*y+xm+(yi-ym)*x+(yj-ym)*y+ym).*(x)/(2*s);  

fun_nj = @(x, y) 6*((xi-xm)*x+(xj-xm)*y+xm+(yi-ym)*x+(yj-ym)*y+ym).*(y)/(2*s); 

fun_nm = @(x, y) 6*((xi-xm)*x+(xj-xm)*y+xm+(yi-ym)*x+(yj-ym)*y+ym).*(-x - y + 1)/(2*s);

% 定义形状函数 (线性形状函数)
N1 = 1 - x - y;
N2 = x;
N3 = y;
% 计算形状函数的梯度
B = [diff(N1, x), diff(N2, x), diff(N3, x); 
     diff(N1, y), diff(N2, y), diff(N3, y)];

% 定义雅可比矩阵及其行列式
J = [xj - xi, xm - xi; yj - yi, ym - yi];
%J = [xi - xm, xj - xm; yi - ym, yj - ym];
detJ = det(J);
invJ = inv(J);

ymax=@(x) 1-x;
% 计算Ke (使用局部坐标系)
Ke = detJ * integral2(fun_c, 0, 1, 0,ymax)* B'*invJ'*invJ*B;

% 计算Fe
f1 = detJ * integral2(fun_ni, 0, 1, 0, ymax);
f2 = detJ * integral2(fun_nj, 0, 1, 0, ymax);
f3 = detJ * integral2(fun_nm, 0, 1, 0,ymax);
    
    %%
    Fe = [f1, f2, f3];
    K(T(:,element),T(:,element))= K(T(:,element),T(:,element))+Ke;
    F(T(:,element)) = F(T(:,element))+ Fe';

end
%%
for i=1:40
    if boundaryedge(i,1)==1
        j=boundaryedge(i,3);
        k=boundaryedge(i,4);
        K(j,:)=0;
        K(k,:)=0;
        K(j,j)=1;
        K(k,k)=1;
        F(j)=-p(1,j)^2-p(2,j)^2;
        F(k)=-p(1,k)^2-p(2,k)^2;
    end
end
u=K\F;
%%
matrix = reshape(u, 11, 11);
clear x,y
x=0:0.1:1;
y=0:0.1:1;
subplot(1,2,1);
[x,y]=meshgrid(x,y);
mesh(x,y,matrix);
hold on 
yy=-x.^2-y.^2;
subplot(1,2,2);
mesh(x,y,yy);

不知道是什么原因,计算结果有些误差

下面是数据第一个是计算结果,第二张是精确解

欢迎讨论。

  • 7
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
二维Stokes有限元是一种用于求解流体力学问题的数值计算方法。它基于有限元理论,将求解区域离散化为许多小的单元,然后通过求解单元内的局部方程来逼近整个问题。在二维Stokes方程中,涉及到速度场和压力场的求解。 对于速度场,我们通过定义速度场在每个单元内的插值函数,并引入一个离散化的速度场,利用这些插值函数对速度场进行逼近。具体地,我们在每个单元上选取一个有限元空间,常用的有线性元、二次元和三次元等。然后,在每个单元上构建速度场的数学模型,通过求解线性或非线性代数方程组得到离散化的速度场。 对于压力场,我们选取一个压力空间,并使用离散化的压力场逼近真实压力场。通过定义压力在每个单元内的插值函数,并利用这些插值函数对压力值进行逼近。同样地,我们在每个单元上构建压力的数学模型,通过求解代数方程组得到离散化的压力场。 最后,我们通过将速度场和压力场代入二维Stokes方程,利用有限元离散化的速度场和压力场,在整个求解区域上建立一个代数方程组。通过求解这个方程组,我们可以得到整个问题的数值解。 二维Stokes有限元方法在求解流体力学问题中具有广泛的应用。由于其离散化的特点,可以有效地处理复杂的流动现象,如湍流和界面问题。通过不断改进离散化方法和计算算法二维Stokes有限元方法在流体力学领域取得了许多重要的突破,为工程实践和科学研究提供了有力的数值工具。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值