有限元FEM求解一维电磁场问题 Rits法 Galerkin法

3.FEM

两块无线大的PEC板位于YOZ平面,一块位于x=0电位为0V,另一块位于x=4电位为20V,使用一维有限元方法求解板间电位。

1)求解电位的解析表达式

由泊松方程

clip_image002

两边积分2次得到

clip_image004

由边界条件clip_image006clip_image008,得到电位的解析表达式为:

clip_image010

2Ritz变分法FEM

利用讲义(21)式

clip_image012

将区域离散化后,在每个子区域上的clip_image014的表达式为:

clip_image016

代入(21)式得到

clip_image018

然后对clip_image020求偏导数,令其等于零,即

clip_image022

得到含有N-2个未知量的N-2个线性方程组,求解线性方程组即得到离散点上的解,然后由clip_image014[1]的表达式得到整个区域上的解。

编写Matlab程序如下:

clc; clear;

N=20;

xstart=0; xend=4; %x range

xx=linspace(xstart, xend, N);

syms x y F1 F2

%construct y

y=ones(1,N);

y=sym(y);

for i=1:N

y(i)=['y', num2str(i)];

end

y(1)=0; y(N)=20; %bound

f=x^2 + 1/2*x + 1/4;

tic

% Ritz method

for i=1:N-1

Fd(i) = 0.5*int( ( ( y(i+1)-y(i) ) / ( xx(i+1)-xx(i) ) )^2, x, xx(i), xx(i+1) )...

+int( f * ( y(i) * ( xx(i+1)-x ) / ( xx(i+1)-xx(i) ) + y(i+1) * ( x-xx(i) ) / ( xx(i+1)-xx(i) ) ) , x, xx(i), xx(i+1) );

end

F=sum(Fd);

for i=2:N-1

Fdiff(i)=collect(diff(F, y(i)));

for j=2:N-1

temp=coeffs(Fdiff(i), y(j)); % Extract the coefficient matrix A, Ax=b

if( size(temp) == 1 )

A(i-1,j-1) = 0;

else

A(i-1,j-1) = temp(2);

end

temp=coeffs(Fdiff(i)); % Extract the right matrix b

b(i-1)=temp(1);

end

end

A=double(A); b=double(b);

yy(2:N-1)=inv(A)*(-b');

t=toc

yy(1)=double( y(1) );

yy(N)=double( y(N) );

plot( xx, yy, 'b*'); hold on

plot( xx, yy,'b--');

%Analytic solution

ax=xstart:0.001:xend;

ay=1/12*ax.^4 + 1/12*ax.^3 + 1/8*ax.^2 - 13/6*ax;

plot(ax, ay, 'r')

title(['Ritz FEM 电位分布,N=', num2str(N)]);

xlabel('距离'); ylabel('电位');

legend('精确数值解','数值解', '解析解');

N=5,10,20,30时的电位分布分别如下图:

clip_image024clip_image026

clip_image028clip_image030

3GarlerkinFEM

利用讲义(29)式,加权余量为:

clip_image032

将区域离散化后,在每个子区域上的clip_image014[2]的表达式为:

clip_image016[1]

检验函数clip_image036取为:

clip_image038

clip_image014[3]clip_image036[1]代入(29)式得到:

clip_image042

clip_image044

得到含有N-2个未知量的N-2个线性方程组,求解线性方程组即得到离散点上的解,然后由clip_image014[4]的表达式得到整个区域上的解。

编写Matlab程序如下:

clc; clear;

N=20;

xstart=0; xend=4; %x range

xx=linspace(xstart, xend, N);

syms x F1 F2

%construct y

y=ones(1,N);

y=sym(y);

for i=1:N

y(i)=['y', num2str(i)];

end

y(1)=0; y(N)=20; %bound

f=x^2 + 1/2*x + 1/4;

tic

% Galerkin method

for i=2:N-1

F(i) = -int( ( ( y(i)-y(i-1) ) / ( xx(i)-xx(i-1) ) ) * 1 / ( xx(i)-xx(i-1) ), x, xx(i-1), xx(i) )...

-int( ( ( y(i+1)-y(i) ) / ( xx(i+1)-xx(i) ) ) * (-1) / ( xx(i+1)-xx(i) ), x, xx(i), xx(i+1) )...

-int( f * ( x-xx(i-1) ) / ( xx(i)-xx(i-1) ) , x, xx(i-1), xx(i) )...

-int( f * ( xx(i+1)-x ) / ( xx(i+1)-xx(i) ) , x, xx(i), xx(i+1) );

end

for i=2:N-1

Ff(i)=collect(F(i));

for j=2:N-1

temp=coeffs(Ff(i), y(j)); % Extract the coefficient matrix A, Ax=b

if( size(temp) == 1 )

A(i-1,j-1) = 0;

else

A(i-1,j-1) = temp(2);

end

temp=coeffs(Ff(i)); % Extract the right matrix b

b(i-1)=temp(1);

end

end

A=double(A); b=double(b);

yy(2:N-1)=inv(A)*(-b');

t=toc

yy(1)=double( y(1) );

yy(N)=double( y(N) );

plot( xx, yy, 'b*', xx, yy, 'b--'); hold on

%Analytic solution

ax=xstart:0.001:xend;

ay=1/12*ax.^4 + 1/12*ax.^3 + 1/8*ax.^2 - 13/6*ax;

plot(ax, ay, 'r')

title(['Galerkin FEM 电位分布,N=', num2str(N)]);

xlabel('距离'); ylabel('电位');

legend('精确数值解','数值解', '解析解');

N=5,10,20,30时的电位分布分别如下图:

clip_image046 clip_image048

clip_image050 clip_image052

4)比较RitzGarlerkinFEM的收敛性

两种方法均收敛。

收敛速度(使用Matlab的tic,toc计时积分、提取系数矩阵和解方程的时间):

N=10时,Ritz用时0.266,Garlerkin用时0.297

N=20时,Ritz用时0.953,Garlerkin用时1.078

N=30时,Ritz用时2.047,Garlerkin用时2.219

所以,Ritz方法收敛速度要快于Garlerkin方法。

转载于:https://www.cnblogs.com/yanhc/archive/2012/02/23/2364916.html

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值