二维三角形元有限元的MATLAB实现

%% 主程序
%% 自定的各变量参数
%%
Lx = 2;
Ly = 2;
numnodx =10;
numnody =10;
numel = (numnodx-1)*(numnody-1)*2; %总的三角形单元数
X = linspace(0,Lx,numnodx);
Y = linspace(0,Ly,numnody);
Ke = sparse(numnodx*numnody,numnodx*numnody);
Fe = sparse(numnodx*numnody,1);
%% 边界条件
bpoint = [(1:1:numnodx),(numnodx*numnody-numnodx+1:1:numnodx*numnody)];   % 强制性边界点的编号,本例子中是两端
bvalue = [50.*ones(1,numnodx),100.*ones(1,numnodx)];  %强制性边界条件的取值,在第一个点的地方为u0,最后一个点为u1
%% 组装整体刚度矩阵和整体荷载向量
NOD = connect_m(numnodx, numnody);
for k = 1 : numel
    ke = Stiffness_matrix(k,numnodx, numnody, X, Y,NOD);
    fe = load_vector(k,numnodx, numnody, X, Y,NOD);
    sctr = NOD(:,k);
    Ke(sctr,sctr) = Ke(sctr,sctr) + ke;
    Fe(sctr) = Fe(sctr) + fe;
end 
 K0 = Ke;
%% 约束条件处理
%% 处理已知部分
for i = 1:length(bpoint)
   n = bpoint(i);
   Ke(n,:) = 0;
   Ke(n,n) = 1;
   Fe(n) = bvalue(i);
   
end
  u_coeff = Ke\Fe; 

%% 绘图,可视化
u_cal = u_coeff;
u_cal_re = reshape(u_coeff,numnody,numnodx);
u_cal_re = full(u_cal_re);
h = mesh(linspace(0,Lx,numnodx)',linspace(0,Ly,numnody)',u_cal_re);
title([' FE Solutions ','(',num2str(numnodx),'×',num2str(numnody),')']);%标题

%%  调用的函数 
%% 关联矩阵
function NOD = connect_m(numnodx, numnody) %nel可以省略,因为在二维有限元中三角形元的nel是3
  Snumnelx = numnodx - 1; %横向矩形形单元数
  Snumnely = numnody - 1; %纵向矩形单元数
  n = 1 : numnodx * numnody; %总结点数
  A = reshape(n, numnodx, numnody);  %节点同形状的矩阵
  NOD = zeros(3, 2*(Snumnelx * Snumnely));
  for k = 1:2*(Snumnelx * Snumnely)
  k0 = ceil(k/2); %向上取整,算出i在第几个矩形元
    xnum = rem(k0, Snumnelx ); %往左数第几个矩形单元
    if xnum == 0
        xnum = Snumnelx;%余为零时,即为最右边那一个
    end
    ynum = ceil(k0/Snumnelx ); %ceil向上取整得到单元i是从下往上数第几个
    a = A(xnum:xnum + 1,ynum:ynum + 1); %一个矩形元对应四个节点
    a1 = a(:);
    erem2 = rem(k,2);
    if erem2 == 1 %找出这个单元在矩形元中是哪种类型的三角元
        NOD0 = a1([3 1 4])';
    else
        NOD0 = a1([2 4 1])';
    end
    NOD(:,k) = [NOD0(1),NOD0(2),NOD0(3)];
  end
end

%% 节点坐标
function pi = Node_coordinate(i,numnodx,numnody,X,Y)
    xnum = rem(i, numnodx ); %往左数第几个点
    if xnum == 0
        xnum = numnodx; %余为零时,即为最右边那一个
    end
    ynum = ceil(i/numnodx ); %ceil向上取整得到单元i是从下往上数第几个
    pi=[X(xnum),Y(ynum)];
end


function f = fun(x0,y0)
f = 0;
end

%% 单元荷载向量程序
function Fe = load_vector(i,numnodx, numnody, X, Y,NOD)
%% 单元各节点所对应的坐标
 Lnod = NOD(:,i);%节点的编号

p(1,:) = Node_coordinate(Lnod(1),numnodx,numnody,X,Y);%编号为i的节点的横纵坐标
p(2,:) = Node_coordinate(Lnod(2),numnodx,numnody,X,Y);
p(3,:) = Node_coordinate(Lnod(3),numnodx,numnody,X,Y);

%% 计算单元荷载向量所需要的a(1,2,3),b(1,2,3),c(1,2,3)
E = [p(1,1), p(1,2),1;p(2,1), p(2,2),1;p(3,1), p(3,2),1];
detE = det(E);
E0 = (detE)^(-1);
a1 = det([p(2,1),1;p(3,1),1]); b1 = (-1) * det([p(2,1),1;p(3,1),1]);
c1 = det([p(2,1),p(2,1);p(3,1),p(3,2)]);
a2 = det([p(3,1),1;p(1,1),1]); b2 = (-1) * det([p(3,1),1;p(1,1),1]); 
c2 = det([p(3,1),p(3,2);p(1,1),p(1,2)]);
a3 = det([p(1,2),1;p(2,1),1]); b3 = (-1) * det([p(1,2),1;p(2,2),1]); 
c3 = det([p(1,1),p(1,2);p(2,1),p(2,1)]);

%% 计算N(i,j,m)
N1=@(x,y)E0 * (a1 * x + b1 * y + c1) * fun(x,y);
N2=@(x,y)E0 * (a2 * x + b2 * y + c2) * fun(x,y);
N3=@(x,y)E0 * (a3 * x + b3 * y + c3) * fun(x,y);

%% 积分 
Fe = zeros(3,1);
t = @(x)2-x;
Fe(1) = integral2(N1,0,2,0,t); 
Fe(2) = integral2(N2,0,2,0,t); 
Fe(3) = integral2(N3,0,2,0,t); 
end

%% 单元刚度矩阵
function Ke = Stiffness_matrix(i,numnodx, numnody, X, Y,NOD)
%% 单位各节点所对应的坐标
Lnod = NOD(:,i); %节点的编号
p1 = Node_coordinate(Lnod(1),numnodx,numnody,X,Y);%编号为i的节点的横纵坐标
p2 = Node_coordinate(Lnod(2),numnodx,numnody,X,Y);
p3 = Node_coordinate(Lnod(3),numnodx,numnody,X,Y);
x1 = p1(1); y1 = p1(2); 
x2 = p2(1); y2 = p2(2);
x3 = p3(1); y3 = p3(2); 
%% 计算单元刚度矩阵所需要的a(i,j,m),b(i,j,m),c(i,j,m)
E = [x1, y1,1;x2, y2,1;x3, y3,1];
detE = det(E);
a1 = det([y2,1;y3,1]); a2 = det([y3,1;y1,1]); a3 = det([y1,1;y2,1]);
b1 = (-1) * det([x2,1;x3,1]); 
b2 = (-1) * det([x3,1;x1,1]); 
b3 = (-1) * det([x1,1;x2,1]);
% c1 = det([x2,y2;x3,y3]); c2 = det([x3,x3;x1,y1]); c3 = det([x1,y1;x2,y2]);
B = [a1, b1; a2, b2; a3,b3];
%% 计算准单元刚度矩阵
Ke = (2 * detE)^(-1) .* (B * B');
end

  • 1
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
### 回答1: 有限元方法是一种常用的求解微分方程数值解的方法之一。在二维问题的数值解中,我们需要首先将连续问题转化为离散问题,即将求解域分割成许多小面积或小体积的单元,并在每个单元内近似求解微分方程。 具体而言,我们需要先建立二维有限元模型,即确定单元的类型、大小、自由度等。一般常用的有限元类型包括三角形单元和四边形单元,其中三角形单元比较常用,因其计算简单、适用范围广。 接着,我们需要根据具体的微分方程式,建立离散方程组,常用的有限元离散方案包括Galerkin法、Least Squares法等。通常情况下,使用Galerkin法得到的离散方程组较为常用。 最后,在MATLAB实现求解步骤,即完成离散方程组的组装、求解和结果后处理。MATLAB提供了许多有限元求解工具箱,如FEATool、FEMM等,可直接调用进行求解。另外,MATLAB也提供了部分无需安装工具箱的函数库,可供自行编写MATLAB程序求解。 总之,二维问题的有限元方法微分方程数值解MATLAB需要建立离散模型、离散化微分方程、实现求解步骤,并结合具体问题进行调试和优化。 ### 回答2: 二维问题的有限元方法微分方程数值解matlab是一种通过离散化连续问题并在离散化后的问题上计算数值解来解决二维问题的数值方法。实际上,它是一种将区域分割成小素的方法,然后求解每个素内的微分方程,再根据素之间的关系得出整个区域的解。 在求解过程中,需要将微分方程转化为离散形式,这可以通过选定一组合适的基函数来实现。然后,可以使用矩阵运算计算离散化问题的数值解。最后,通过将解转换回连续形式来得出原问题的数值解。 在使用matlab求解二维问题的有限元方法微分方程数值解时,需要进行以下步骤: 1. 建立模型并进行离散化,即将区域分割为小素并定义基函数。 2. 计算刚度矩阵和载荷向量,这可以通过对每个素进行数值积分来实现。 3. 结合边界条件和初始条件,形成完整的线性方程组。 4. 解线性方程组,从而计算出每个节点的解。 5. 将节点解插值回连续形式得到原问题的数值解,并进行误差分析。 总之,使用有限元方法结合matlab可以方便地求解二维问题的微分方程数值解,具有高效、准确和灵活等优点。 ### 回答3: 二维问题是指在平面内的问题,有限元方法是一种数值计算方法,用于求解大型非线性和线性微分方程。有限元方法适用于各种物理应用领域,包括机械工程、土木工程、航空航天工程、地质工程、生物医学工程等。 先来简述一下有限元方法的基本思想。首先将原问题转化成在一个有界区域上的偏微分方程组,然后在定义在区域内的离散网格上近似求出解。由于偏微分方程一般是无法求出解析解的,因此需要进行数值求解。这就是有限元方法。 在研究二维问题的有限元方法微分方程数值解时,Matlab是一个非常好用的工具。Matlab可以实现离散化求解、标量泊松方程、热传导问题、结构力学问题等。在进行有限元分析时,Matlab可以自动生成离散化网格和素,并能快速计算每个素的刚度矩阵及负载向量。通过这些计算,可以得到整个系统的刚度矩阵和负载向量,然后通过求解这个线性方程组,就可以得到更精确的解法。 总之,二维问题的有限元方法微分方程数值解Matlab是一个十分实用且高效的数学计算工具。它从理论上证明了有限元分析方法的可行性,并能在实际工程中取得很好的应用效果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值