利用matlab的PDE工具箱求解Neumann边界的Poisson方程之3
针对于 利用matlab的PDE工具箱求解Neumann边界的Poisson方程之2 出现的问题,后面察觉是由于 对法向导数理解的误解。
首先明白:Poisson方程的第二边值问题:n是外法线方向向量.
例如:对于下图所示
下边界时条件为
对于左边边界为
在左边边界设定的时候,前面添加一负号。
原方程在PDE工具箱中的设置
上边界与下边界 sin(3*pi*x+pi/4)*sin(pi/4)
(注意:此处不能为'x',后同)
左边界 -3*pi*sin(2*pi*y+pi/4)*cos(pi/4)
右边界 -3*pi*sin(2*pi*y+pi/4)*cos(pi/4)
方程设置:13*pi*pi.*sin(3*pi*x+pi/4).*sin(2*pi*y+pi/4)
最后的数值结果为:
X-Y平面图为:
与精切解吻合比较好。
如果为一导数边界,而其他边界为第二类,具体代码实现如下:
View Code
function pdemodel [pde_fig,ax]=pdeinit; pdetool('appl_cb',1); set(ax,'DataAspectRatio',[1 2.583333333333333 1.6666666666666665]); set(ax,'PlotBoxAspectRatio',[1 1 1]); set(ax,'XLim',[-0.10000000000000001 1.1000000000000001]); set(ax,'YLim',[-0.10000000000000001 3]); set(ax,'XTickMode','auto'); set(ax,'YTickMode','auto'); pdetool('gridon','on'); % Geometry description: pderect([0 1 1 0],'R1'); set(findobj(get(pde_fig,'Children'),'Tag','PDEEval'),'String','R1') % Boundary conditions: pdetool('changemode',0) pdesetbd(4,... 'dir',... 1,... '1',... 'sin(3*pi*x+pi/4)*sin(pi/4)') pdesetbd(3,... 'neu',... 1,... '0',... '-2*pi.*sin(3*pi*x+pi/4)*sin(pi/4)') pdesetbd(2,... 'neu',... 1,... '0',... '-3*pi.*sin(2*pi.*y+pi/4)*cos(pi/4)') pdesetbd(1,... 'neu',... 1,... '0',... '2*pi.*sin(3*pi*x+pi/4)*sin(pi/4)') % Mesh generation: setappdata(pde_fig,'Hgrad',1.3); setappdata(pde_fig,'refinemethod','regular'); pdetool('initmesh') % PDE coefficients: pdeseteq(1,... '1.0',... '0.00',... '13*pi*pi.*sin(3*pi*x+pi/4).*sin(2*pi*y+pi/4)',... '1.0',... '0:10',... '0.0',... '0.0',... '[0 100]') setappdata(pde_fig,'currparam',... ['1.0 ';... '0.00 ';... '13*pi*pi.*sin(3*pi*x+pi/4).*sin(2*pi*y+pi/4)';... '1.0 ']) % Solve parameters: setappdata(pde_fig,'solveparam',... str2mat('0','1000','10','pdeadworst',... '0.5','longest','0','1E-4','','fixed','Inf')) % Plotflags and user data strings: setappdata(pde_fig,'plotflags',[1 1 1 1 1 1 1 1 0 0 0 1 1 1 1 0 0 1]); setappdata(pde_fig,'colstring',''); setappdata(pde_fig,'arrowstring',''); setappdata(pde_fig,'deformstring',''); setappdata(pde_fig,'heightstring','');