MATLAB求解PDE问题(2)——确定几何区域

标签:
杂谈 |
分类: matlab |
前一篇介绍了如何利用Matlab求解椭圆型方程,下面介绍如何确定求解的几何区域。PDE
函数pdegeom释义如下:
参数为0个时,即没有参数时,返回边界的段数;
参数为1个时,即只有bs,返回输出区域边界的参变量范围矩阵d;
参数为2个时,返回每段边界长度为s时的坐标。
函数参数意义bs表示指定的边缘线段,如矩形边界为四段,三角开边界肯定为三段…。s为第bs段线段弧长的近似(估计)值,bs与s可以为向量,但是要一一对应,即bs为几个值,s也得为几个值。输出变量[x,y]是每条线段起点和终点所对应的坐标。这个函数编制的关键是,函数内边界上的坐标((x(t),y(t))是用参变量t表示的,返回值是求得边界任意长度时的坐标(x(t),y(t))值,参量可以有很多种选法。
回到前一篇中,给定的方程的求解区域是[0,1,0,1]的一个正方形,我们将它命名为mygeom。下面我们来看下mygeom是怎么编写的。
function
[x,y]=mygeom(bs,s)
nbs=4; % 表示边界的段数
if nargin==0,
x=nbs; % 不给定输入变量时,输出表示几何区域边界的线段数
return
end
d=[
0 0 0 0 % 表示每条线段起始值的参量值t(四条边界,所以有四列)
1 1 1 1 % 表示每条线段的终点值参量值t
0 0 0 0 %
沿线段方向左边区域的标识值,如果是1,表示选定左边区域,如果
1 1 1 1 % 沿线段方向右边区域的标识值,规则同上。
];
bs1=bs(:)';
if find(bs1<1 |
bs1>nbs),
error('PDE:squareg:InvalidBs', 'Non existent boundary segment
number.')
end
if nargin==1,
x=d(:,bs1); % 给定一个输入变量时,输出区域边界数据的矩阵
return
end
x=zeros(size(s));
y=zeros(size(s));
[m,n]=size(bs);
if m==1 &&
n==1,
bs=bs*ones(size(s)); % expand bs
elseif m~=size(s,1) || n~=size(s,2),
error('PDE:squareg:SizeBs', 'bs must be scalar or of same size as
s.');
end
if ~isempty(s),
%
ii=find(bs==1);
if length(ii)
x(ii)=interp1([d(1,1),d(2,1)],[0 1],s(ii));%
通过参量来确定边界上的值
y(ii)=interp1([d(1,1),d(2,1)],[1
1],s(ii));%
end
%
ii=find(bs==2);
if length(ii)
x(ii)=interp1([d(1,2),d(2,2)],[1
1],s(ii));
y(ii)=interp1([d(1,2),d(2,2)],[1
0],s(ii));
end
%
ii=find(bs==3);
if length(ii)
x(ii)=interp1([d(1,3),d(2,3)],[1
0],s(ii));
y(ii)=interp1([d(1,3),d(2,3)],[0
0],s(ii));
end
%
ii=find(bs==4);
if length(ii)
x(ii)=interp1([d(1,4),d(2,4)],[0
0],s(ii));
y(ii)=interp1([d(1,4),d(2,4)],[0
1],s(ii));
end
end
pdegplot('mygeom'),
axis equal
[p,e,t]=initmesh('mygeom');
pdemesh(p,e,t),
结果如下:
http://bbs.sciencenet.cn/upload/blog/images/2010/10/201010130358254.jpg