如何使Matlab等到PDE工具箱计算解决方案?

时间:2016-06-06 08:41:09

标签: matlab user-interface pde

我想使用PDE工具箱中的脚本提取网格和解决方案数据但是,当我运行以下脚本时,代码确实提供了pde解决方案,但它似乎没有得到可能因为它没有& #39; t等待GUI完成。但是当我运行命令分别获取数据时,在我获得PDE解决方案后,它确实有效,但这意味着在另一个脚本或工作区中单独运行getdata命令。因此,我想将所有内容合并到一个脚本中,它应该在单次运行中提供PDE解决方案和数据。任何帮助将不胜感激。该脚本如下。

function pdemodel
[pde_fig,ax]=pdeinit;
pdetool('appl_cb',9);
set(ax,'DataAspectRatio',[1 1.5 1]);
set(ax,'PlotBoxAspectRatio',[1 0.66666666666666663 1]);
set(ax,'XLim',[0 2]);
set(ax,'YLim',[0 2]);
set(ax,'XTickMode','auto');
set(ax,'YTickMode','auto');

% 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,...
'neu',...
1,...
'0',...
'sin(2*t)')
pdesetbd(3,...
'neu',...
1,...
'0',...
'0')
pdesetbd(2,...
'neu',...
1,...
'0',...
'0')
pdesetbd(1,...
'neu',...
1,...
'0',...
'0')

% Mesh generation:
setappdata(pde_fig,'Hgrad',1.3);
setappdata(pde_fig,'refinemethod','regular');
setappdata(pde_fig,'jiggle',char('on','mean',''));
pdetool('initmesh')
pdetool('refine')

% PDE coefficients:
pdeseteq(2,...
'1.0',...
'0',...
'(0)+(0).*(0.0)',...
'(1.0).*(1.0)',...
'0:0.1:10',...
'0.0',...
'0.0',...
'[0 100]')
setappdata(pde_fig,'currparam',...
['1.0';...
'1.0';...
'1.0';...
'0  ';...
'0  ';...
'0.0'])

% Solve parameters:
setappdata(pde_fig,'solveparam',...
str2mat('0','1872','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 101 1 0 0 0 0 1]);
setappdata(pde_fig,'colstring','');
setappdata(pde_fig,'arrowstring','');
setappdata(pde_fig,'deformstring','');
setappdata(pde_fig,'heightstring','');

% Solve PDE:
pdetool('solve')

%Get mesh data p,e,t and solution u from the PDE toolbox:
pde_fig=findobj(allchild(0),'flat','Tag','PDETool');
if isempty(pde_fig)
    error('PDE Toolbox GUI not active.')
end
u = get(findobj(pde_fig,'Tag','PDEPlotMenu'),'UserData');
h=findobj(get(pde_fig,'Children'),'flat','Tag','PDEMeshMenu');
hp=findobj(get(h,'Children'),'flat','Tag','PDEInitMesh');
he=findobj(get(h,'Children'),'flat','Tag','PDERefine');
ht=findobj(get(h,'Children'),'flat','Tag','PDEMeshParam');
p=get(hp,'UserData'); 
e=get(he,'UserData');
t=get(ht,'UserData');

1 个答案:

答案 0 :(得分:0)

问题似乎是由于您定义功能的方式。

function pdemodel

此定义表示它不接收任何输入,也不返回任何输出。

在函数体中,您实际获得了矩阵upet(例如,您可以设置断点

u = get(findobj(pde_fig,'Tag','PDEPlotMenu'),'UserData');

逐步执行代码并检查值。

问题是scope of the variables of a function仅限于函数本身(除非你将它们定义为global - 这不是最好的),所以在你的函数执行结束时, MatLab u中未提供petbase workspace(以及函数中的任何其他变量)的值。

一个简单的解决方案可以是通过指定一些输出来修改函数的定义,如下所示:

function [u,p,e,t]=pdemodel

其中[u,p,e,t]是您想要返回的变量列表(在函数中计算)。

然后你可以按照以下方式调用该函数:

[u,p,e,t]=pdemodel

这样,您就可以在工作区中使用输出矩阵upet

以同样的方式,您可以在函数定义中定义一些输入变量,这样您就不必在函数体中对它们的值进行硬编码。

在这种情况下,函数的定义可以是这样的:

function [u,p,e,t]=pdemodel(var_1, var_2, var_3)

其中var_1var_2var_3是您可以在函数中使用的三个值。

例如,您可以指定dataaspectratio

的值作为输入
function [u,p,e,t]=pdemodel(var_1, var_2, var_3)
% some code
% set(ax,'DataAspectRatio',[1 1.5 1]);
set(ax,'DataAspectRatio',[var_1 var_2 var_3]);

您可以调用您的函数:

[u,p,e,t]=pdemodel(1, 1.5, 1)

您可以使用以下方法使您的功能定义更加“灵活”:

  • varargin允许为您的函数提供可变数量的输入参数
  • nargin获取提供的输入数量
  • varargout允许为您的函数提供可变数量的输出参数
  • nargout获取调用
  • 中指定的输出参数的数量

希望这有帮助,

Qapla'