我想使用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');
答案 0 :(得分:0)
问题似乎是由于您定义功能的方式。
function pdemodel
此定义表示它不接收任何输入,也不返回任何输出。
在函数体中,您实际获得了矩阵u
,p
,e
和t
(例如,您可以设置断点
u = get(findobj(pde_fig,'Tag','PDEPlotMenu'),'UserData');
逐步执行代码并检查值。
问题是scope of the variables of a function仅限于函数本身(除非你将它们定义为global - 这不是最好的),所以在你的函数执行结束时, MatLab u
中未提供p
,e
,t
和base workspace
(以及函数中的任何其他变量)的值。
一个简单的解决方案可以是通过指定一些输出来修改函数的定义,如下所示:
function [u,p,e,t]=pdemodel
其中[u,p,e,t]
是您想要返回的变量列表(在函数中计算)。
然后你可以按照以下方式调用该函数:
[u,p,e,t]=pdemodel
这样,您就可以在工作区中使用输出矩阵u
,p
,e
和t
。
以同样的方式,您可以在函数定义中定义一些输入变量,这样您就不必在函数体中对它们的值进行硬编码。
在这种情况下,函数的定义可以是这样的:
function [u,p,e,t]=pdemodel(var_1, var_2, var_3)
其中var_1
,var_2
和var_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)
您可以使用以下方法使您的功能定义更加“灵活”:
希望这有帮助,
Qapla'