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

MATLAB求解PDE问题(3)——确定边界条件

(2012-06-14 22:26:13)
标签:

杂谈

分类: matlab

 前一篇给出了如何确定几何区域,本篇接着给出如何确定边界条件,在几何区域和边界条件都确定好之后,就可以利用PDE Toolbox对给定的PDE进行计算了。先回忆下前面的边界条件:

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

    上面的四个边界条件中,前两个是Dirichlet边界,后两个是Neumann边界。我们先了解下PDE Toolbox中规定有三种边界条件,一是Dirichlet边界条件,一是广义Neumann条件,一是混合边界条件(只用于方程组)。这和传统的定义有所不同,按照传统的观点,PDE Toolbox中的广义Neumann条件应该是混合边界条件(Robin边界条件),而传统的Neumann边界条件是指边界处的法向导数为零。我们先不考虑方程组,Dirichlet边界条件和广义Neumann条件写成如下形式:

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

 

其中http://bbs.sciencenet.cn/upload/math/20101017155820683.gif是边界法向量与x轴的夹角。

规定边界条件的m文件是pdebound函数,该函数并不提供边界条件,而是要求用户按照规定的方法给出边界条件,用户可以自己给定函数的名字。我们计算中给出的边界条件函数是mybound。调用格式为[q,g,h,r]=mybound(p,e,u,time)

    pdebound函数中最主要的内容是bl矩阵,bl包括了所有的边界信息。bl的每一列都是边界条件矩阵的对应列,每一列都必须满足下面的规则:

第一行是方程的维数N,一个方程N=1,两个方程构成的方程组,N=2,…;

第二行是Dirichlet边界条件数MDirichlet边界条件时M=N,广义Neumann边界条件时M=0,如果是方程组,0<M<N之间表示混合边界条件;

第三行到第3+N2-1行是表示q的字符串的长度,这个长度按与q有关的列方向的次序储存;

3+N2行到第3+N2+N-1是表示g的字符串的长度;

3+N2+N行到第3+N2+N+MN-1是表示h的字符串的长度,这个长度按与h有关的列方向的次序储存;

3+N2+N+MN行到第3+N2+N+MN+M-1是表示r的字符串的长度;

接下来的行是包括MATLAB文本表达式所表示的真实边界条件函数。文本表达式是将实际的表达式通过double函数转化为ASCII码后的表达式。文本字符串的长度与前面四行规定的长度是一致的,两个字符串之间没有分隔符。可以插入含有下列变量的文本表达式:

二维坐标xy

边界线段参数s,弧长的比例。在边界线段的起始处s=0,向着线段的终点处增加到s=1

外法向量分量nxny。如果要用到切向量,可以用txty表示,其中tx=-nyty=nx

u(除非已指定输入参数u);

时间t(除非已指定输入参数time)。

注意,在只有一个方程的时候,即N=1,如果M=0时,即是广义Neumann边界条件,此时不需要表示表示Dirichlet边界条件的hr两行,因此表示qg的字符串从第5行开始(前四行分别为N,M,q,g的指示行);如果M=1,此时表示hr的字符串从第9行开始(前六行分别是N,M,q,g,h,r的指示行,第七八行表示qg,它们均为0ASCII码为48

下面看下我们计算你的例子中边界mybound函数的内容:

function [q,g,h,r]=mybound(p,e,u,time)


% upper=double('2-2*x-x.^2');% y=1上边界条件函数 
% down =double('x.^2'); % y=0下边界条件函数 
% left =double('y.^2'); % x=0左边界条件函数 
% right=double('2-2*y-y.^2'); % x=1右边界条件函数 
% upper=upper'; % 转化为列向量 
% down =down'; 
% left =left'; 
% right=right'; 

bl=[ 
1 1 1 1       % N 表示方程维数的指示行 
0 0 1 1       % M 表示Dirichlet边界条件的指示行,M=0为广义Neumann边界条件 
1 1 1 1       % q 表示q的字符串的长度,根据实际长度确定, 
10 10 1 1   % g 表示g的字符串的长度,如1表示字符串的长度为1 
48 48 1 1   % h 表示h的字符串的长度,这是针对M=1的列,本例子是三四列 
50 50 4 4   % r 表示r的字符串的长度,规则同上。 
45 45 48 48     % 本行以下是边界条件函数的字符串表达式,字符串的长度与上面 
50 50 48 48     % 规定的一致。注意,这些都是将表达式转化为ASCII码后的数 
42 42 49 49     % 例如x的ASCII码是120,ASCII码的0表示null(空) 
120 121 120 121      % 需要注意的还有,M=0的列,字符表达式从g的下一行开始, 
45 45 46 46            % 即从第5行开始。M=1的列,从r的下一行开始,即7,8两行是 
120 121 94 94        % 表示q,g的字符串的长度,此时认为q,g均为0, 0的ASCII 
46 46 50 50            % 码是48,因此7,8两行均为48。在往下,按照h,r的长度排列。 
94 94 0 0                % 由此造成的行数不匹配,可以由任意ASCII码补齐,一般以0 
50 50 0 0                % (表示null,空)表示,不容易引起歧义。 
]; 

if any(size(u)) 
[q,g,h,r]=pdeexpd(p,e,u,time,bl); 
else 
[q,g,h,r]=pdeexpd(p,e,time,bl); 
end

规定边界条件的矩阵bl较为复杂,详细的解释可以使大家省不少时间,但是也容易把大家整晕,我也是在这方面花费了不少功夫。下面具体分析下bl中的两列。第一列对应着上边界条件(Neumann边界条件):

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

与边界条件的标准形式比较,有,q=0g=2-2*x-x.^2,于是第一列可以写为

[1 10  '0'  '2-2*x-x.^3']'

其中1表示N=1,即一个方程,0表示Neumann边界条件;1表示q的长度;10表示g的长度,'0'表示q=0,长度为1'2-2*x-x.^3'表示g=2-2*x-x.^2,转化为ASCII码后长度为10。因此第一列最终写为

[1 0 1 10 48 50 45 50 42 120 45 120 46 94 50 ]'

第三列对应着下边界条件,是Dirichlet边界条件:

                             http://bbs.sciencenet.cn/upload/math/2010101716341277.gif

 

 

与标准形式比较,有,h=1r=x.^2,于是第三列可以写为

[1 1 1 1 1 4 '0' '0' '1' 'x.^2']'

按顺序依次为,1表示N=1,一个方程;1表示Dirichlet边界条件;1表示q的长度,此时必为11表示g的长度,此时也必为11表示h的长度是14表示r的长度为4'0'表示q的值为00的字符串长度是1);'0'表示g的值是0'1'表示h=11ASCII码是49);'x.^2'表示r=x.^2,转化为ASCII码后长度是4。于是第三列可以写为

[1 1 1 1 1 4 48 48 49 120 46 94 50]'

此时第三列的长度小于第一列的长度,缺几个长度就可以添加几个ASCII码的0,表示空,这样第三列就是mybound中的第三列了,如下

[1 1 1 1 1 4 48 48 49 120 46 94 50 0 0]' 
  

    最后附上myboundm文件,有需要的可以下载。

0

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

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

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

新浪公司 版权所有