Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使Matlab等待PDE工具箱计算出解决方案?_Matlab_User Interface_Pde - Fatal编程技术网

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

如何使Matlab等待PDE工具箱计算出解决方案?,matlab,user-interface,pde,Matlab,User Interface,Pde,我想使用PDE工具箱中的脚本提取网格和解决方案数据,但是,当我运行以下脚本时,代码确实提供了PDE解决方案,但它似乎没有获得数据,这可能是因为它没有等待GUI完成。但是,当我运行命令分别获取数据时,在获得PDE解决方案后,它确实可以工作,但这意味着在另一个脚本或工作区中分别运行getdata命令。因此,我想将所有内容合并到一个脚本中,它应该在一次运行中提供PDE解决方案和数据。任何帮助都将不胜感激。剧本如下 function pdemodel [pde_fig,ax]=pdeinit; pdet

我想使用PDE工具箱中的脚本提取网格和解决方案数据,但是,当我运行以下脚本时,代码确实提供了PDE解决方案,但它似乎没有获得数据,这可能是因为它没有等待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');

这个问题似乎是由于您定义函数的方式造成的

function pdemodel
这个定义意味着它不接收任何输入,也不返回任何输出

在函数体中,实际上可以得到矩阵
u
p
e
t
(例如,可以在

u = get(findobj(pde_fig,'Tag','PDEPlotMenu'),'UserData');
逐步执行代码并检查值)

问题在于,该值仅限于函数本身(除非您将其定义为-这不是最好的),因此在函数执行结束时,
u
p
e
t
(以及函数中的任何其他变量)的值在MatLab
基本工作区中不可用

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

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
是可以在函数中使用的三个值

function pdemodel
例如,您可以指定
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)
您可以使用以下方法使函数的定义更“灵活”:

  • 允许向函数提供数量可变的输入参数
  • 获取所提供输入的数量
  • 允许向函数提供可变数量的outputparameters
  • 获取调用中指定的输出参数数
希望这有帮助


Qapla’

问题似乎是由于您定义函数的方式造成的

function pdemodel
这个定义意味着它不接收任何输入,也不返回任何输出

在函数体中,实际上可以得到矩阵
u
p
e
t
(例如,可以在

u = get(findobj(pde_fig,'Tag','PDEPlotMenu'),'UserData');
逐步执行代码并检查值)

问题在于,该值仅限于函数本身(除非您将其定义为-这不是最好的),因此在函数执行结束时,
u
p
e
t
(以及函数中的任何其他变量)的值在MatLab
基本工作区中不可用

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

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
是可以在函数中使用的三个值

function pdemodel
例如,您可以指定
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)
您可以使用以下方法使函数的定义更“灵活”:

  • 允许向函数提供数量可变的输入参数
  • 获取所提供输入的数量
  • 允许向函数提供可变数量的outputparameters
  • 获取调用中指定的输出参数数
希望这有帮助


Qapla'

你好,拉法。我已经试着像您描述的那样调用函数[u,p,e,t]=pdemodel。它确实起作用,但是输出只有一个变量,在本例中首先写入变量“u”。所以基本上,在定义函数时,哪一个变量是先写的,只有那个变量是输出,而不是下面的变量,在这个例子中是p,e,t。其次,变量“u”的输出矩阵在工作区中被命名为“ans”,而不是“u”?对不起,我只能在今晚晚些时候回答你的问题。我在这里。如果将函数的定义修改如下:
function[u,p,e,t]=pdemodel
以获取工作区中的输出值
u
p
e
t
,则必须按如下方式调用函数:
[u,p,e,t]=pdemodel
,否则,即使修改了函数的定义,如果按如下方式调用它:
pdemodel
(即不指定任何输出),您将只在工作区中获得输出规范的第一个