名词解释:
FEM:有限单元法( Finite Element Method, FEM)。
FVM:有限体积法( Finite Volume Methoc, FVM)。
FDM:有限差分法( Finite Difference Method, FDM)。
统称为有限元分析法。
核心思路:
将连续问题离散化为若干有限大小的单元问题进行求解。
基本步骤:
剖分---单元分析---求解近似方程。
具体方案--投影:
投影的意义在于将一个复杂的问题投影到已知的空间中,方便问题解决。当然一次投影只能解决一方面问题,可以多次投影达到毕竟最佳值的目的。
方案步骤:
设一个部分可知的函数 f(x) 在空间 V 上的投影为 fv(x) 。空间 V 的基函数为r_i(x)。那么可以得到
∫[f(x)-fv(x)]*r_i(x)dx=0 //投影定理
fv(x)=∑_(j=0)^n[aj*r_j(x)] //基函数性质
将第2行的式子代入第1行中
∫[f(x)-∑_(j=0)^n[aj*r_j(x)]r_i(x)dx=0
化简可得:
∫f(x)*r_i(x)dx-∑_(j=0)^n[aj∫r_i(x)*r_j(x)dx]=0
只要求出各个 aj 就可以知道 f(x) 在空间 V 上的投影 fv(x) 。
令 Mij = ∫r_i(x)*r_j(x)dx ;bi=∫f(x)*r_i(x)dx 。
那么 aj = Mij / bi 。
就转化为一个解矩阵的问题。
根据 j 的取值区间为[0,n]。可知 a 是一个 (n+1)*1 的矩阵,M 是一个(n+1)*(n+1) 的矩阵,b 是一个 (n+1)*1 的矩阵。
设基函数 r_i(x) 为帽子函数。
if x=[x_(i-1),x_i]
r_i(x)=(x-x_(i-1))/(x_i-x_(i-1))
else if x=[x_i,x_(i+1)]
r_i(x)=(x_(i+1)-x)/(x_(i+1)-x_i)
otherwise
r_i(x)=0
根据辛普森公式:
∫_(a,b) f(x)dx = (b-a)/6 * [f(a)+4*f((a+b)/2)+f(b)] //这里的=是近似等于
可得到 M 中各项的递推关系式
M_ii=(x_i-x_(i-1))/3+(x_(i+1)-x_i)/3
M_ij=(x_(i+1)-x_i)/6
根据递推法则:
∫_(a,b) f(x)dx = (b-a)/2* [f(a)+f(b)] //这里的=是近似等于
可得到 b 的各项表达式:
b_i=f(x_i)*0.5*(x_i-x_(i-1)+x_(i+1)-x_i)
这样就可以求得 a 。详细的演算可以在 www.lolplayer.club 上查看。
Matlab代码实现:
1. 求 M 部分
%代码来源:J Pan 《有限元分析(FEA)是个什么东东》. 知乎. 链接:https://zhuanlan.zhihu.com/p/56326567
function M = MassMat1D(x)
n = length(x)-1; % number of subintervals
M = zeros(n+1,n+1); % allocate mass matrix
for i = 1:n % loop over subintervals
h = x(i+1) - x(i); % interval length
M(i,i) = M(i,i) + h/3; % add h/3 to M(i,i)
M(i,i+1) = M(i,i+1) + h/6;
M(i+1,i) = M(i+1,i) + h/6;
M(i+1,i+1) = M(i+1,i+1) + h/3;
end
2. 求 b 部分
%代码来源:J Pan 《有限元分析(FEA)是个什么东东》. 知乎. 链接:https://zhuanlan.zhihu.com/p/56326567
function b = LoadVec1D(x,f)
n = length(x)-1;
b = zeros(n+1,1);
for i = 1:n
h = x(i+1) - x(i);
b(i) = b(i) + f(x(i))*h/2;
b(i+1) = b(i+1) + f(x(i+1))*h/2;
end
3. 自定义 f(x) 部分
%此m文件用来自定义你想要投影呈现的函数
%代码来源:J Pan 《有限元分析(FEA)是个什么东东》. 知乎. 链接:https://zhuanlan.zhihu.com/p/56326567
function y = Foo(x)
y=x; %这里的函数是y=x*sinx。可以自己修改。
4. 求 fv(x) 部分
%此m文件将原函数分解为各个分段函数,只需运行此文件,
%代码来源:J Pan 《有限元分析(FEA)是个什么东东》. 知乎. 链接:https://zhuanlan.zhihu.com/p/56326567
clear all
n = 5 ;% number of subintervals
h = 1/n; % mesh size
x = 0:h:1; % mesh
y = Foo(x);% calc f(x)
M = MassMat1D(x); % assemble mass
b = LoadVec1D(x,@Foo); % assemble load
Pf = M\b; % solve linear system
plot(x,Pf,x,y); % plot projection
grid on
legend('投影函数','原函数')
%可以在工作区中找到x和y对应的值,使用y=ax+b就可以计算出各个分段函数。
我们的公众号:认知无线电
我们的网站:www.lolplayer.club
欢迎关注和指正