加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

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

(2012-06-14 16:20:38)
标签:

杂谈

分类: matlab

前一篇介绍了如何利用Matlab求解椭圆型方程,下面介绍如何确定求解的几何区域。PDE Toolbox中规定几何区域的m文件是pdegeom.m。但是pdegeom并不是一个可以调用的函数,它只是规定了应该何如定义区域,具体的区域则要根据研究的问题来决定。

函数pdegeom释义如下:

参数为0个时,即没有参数时,返回边界的段数;

参数为1个时,即只有bs,返回输出区域边界的参变量范围矩阵d

参数为2个时,返回每段边界长度为s时的坐标。

函数参数意义bs表示指定的边缘线段,如矩形边界为四段,三角开边界肯定为三段…。s为第bs段线段弧长的近似(估计)值,bss可以为向量,但是要一一对应,即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,表示选定左边区域,如果 
            % 是0,表示不选定左边区域 
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

    编辑完该函数后,可以利用pdeplot函数来测试设置的几何区域是否满足要求。在matlab命令窗口输入:

pdegplot('mygeom'), axis equal 
[p,e,t]=initmesh('mygeom');

pdemesh(p,e,t), axis equal

结果如下:

http://bbs.sciencenet.cn/upload/blog/images/2010/10/201010130358254.jpg 

         mygeomm文件放在附件里,大家可以下载。本篇写作时参考了刘平的博客,已在前面指出,另参考了《偏微分方程的MATLAB解法》及《MATLAB PDE Toolbox User Guide》,有兴趣的读者可以参阅。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有