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

标签:
杂谈 |
分类: matlab |
其中http://bbs.sciencenet.cn/upload/math/20101017155820683.gif是边界法向量与x轴的夹角。
规定边界条件的m文件是pdebound函数,该函数并不提供边界条件,而是要求用户按照规定的方法给出边界条件,用户可以自己给定函数的名字。我们计算中给出的边界条件函数是mybound。调用格式为[q,g,h,r]=mybound(p,e,u,time)。
第一行是方程的维数N,一个方程N=1,两个方程构成的方程组,N=2,…;
第二行是Dirichlet边界条件数M,Dirichlet边界条件时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码后的表达式。文本字符串的长度与前面四行规定的长度是一致的,两个字符串之间没有分隔符。可以插入含有下列变量的文本表达式:
二维坐标x和y;
边界线段参数s,弧长的比例。在边界线段的起始处s=0,向着线段的终点处增加到s=1;
外法向量分量nx,ny。如果要用到切向量,可以用tx和ty表示,其中tx=-ny,ty=nx;
解u(除非已指定输入参数u);
时间t(除非已指定输入参数time)。
注意,在只有一个方程的时候,即N=1,如果M=0时,即是广义Neumann边界条件,此时不需要表示表示Dirichlet边界条件的h,r两行,因此表示q和g的字符串从第5行开始(前四行分别为N,M,q,g的指示行);如果M=1,此时表示h,r的字符串从第9行开始(前六行分别是N,M,q,g,h,r的指示行,第七八行表示q,g,它们均为0,ASCII码为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
0 0 1
1
1 1 1
1
10 10 1 1
48 48 1 1
50 50 4 4
45 45 48
48
50 50 48
48
42 42 49
49
120 121 120
121
45 45 46
46
120 121 94
94
46 46 50
50
94 94 0
0
50 50 0
0
];
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边界条件):
与边界条件的标准形式比较,有,q=0,g=2-2*x-x.^2,于是第一列可以写为
[1
其中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边界条件:
与标准形式比较,有,h=1,r=x.^2,于是第三列可以写为
[1 1 1 1 1 4 '0' '0' '1' 'x.^2']'
按顺序依次为,1表示N=1,一个方程;1表示Dirichlet边界条件;1表示q的长度,此时必为1;1表示g的长度,此时也必为1;1表示h的长度是1;4表示r的长度为4;'0'表示q的值为0(0的字符串长度是1);'0'表示g的值是0;'1'表示h=1(1的ASCII码是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]'