主要部分
麻雀虽小,五脏俱全
从程序的主函数入口开始看:
- 网格生成,这里调用了 matlab 的 pde 工具箱中的函数,设置了网格尺寸参数
- 定义了 pde,这里主要包括泊松方程的系数函数和右端项函数
- 循环是不断的在加密网格,然后在每一层网格上进行计算
- 组装刚度矩阵
- 组装右端向量
- 边界条件处理
- 求解线性方程组
- 画图
上述过程在任何一个有限元程序中都会有体现 麻雀虽小五脏俱全.
[p, e, t] = initmesh('squareg', 'hmax', 0.25);
coef = @(x, y) 1;
righthand = @(x, y) 2;
for i = 1: 5
[p,e,t] = refinemesh('squareg',p,e,t);
pdemesh(p, e, t);
boundarynodes = unique([e(1, :) e(2, :)]);
boundaryedges = boundarynodes;
A = assemble_matrix_2D2(coef, p, t);
b = assemble_vector_2D(righthand, p, t);
[A, b] = treat_boundary_condition(A, b, p, boundarynodes, e);
u = A b;
trisurf(t(1: 3, :)', p(1, :)', p(2, :)', u)
end
组装刚度矩阵
在下面给出了两种实现方式(看第二种更加能理解有限元组装的过程),但
有限元的组装只需要记住一个准则:act local, 就是在一个单元上思考程序的实施,所以会涉及
- 循环每个单元,每个单元上完成了组装就完成了所有
- local2global 单元到全局的过程(单元刚度矩阵到总刚度矩阵的组装)
- 雅克比行列式的计算,因为计算单刚的过程涉及到在单元上积分的问题
function A = assemble_matrix_2D(coef, p, t)
%获取单元个数和节点个数
number_of_elements = length(t);
number_of_nodes = length(p);
%初始化总刚度矩阵
A = zeros(number_of_nodes, number_of_nodes);