Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/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 第45页。如何在调用函数时更改其中的函数?_Matlab_Loops_Ode_Numerical Integration - Fatal编程技术网

Matlab 第45页。如何在调用函数时更改其中的函数?

Matlab 第45页。如何在调用函数时更改其中的函数?,matlab,loops,ode,numerical-integration,Matlab,Loops,Ode,Numerical Integration,函数w_d(Y,T)和q(tg,tm)用于下面描述的ODE解算器调用的函数中: function dPdh=gasstep1(~,P) global rho_solid W_B S e height_dryer c_a c_b tm_o dPdh=zeros(size(P)); Y=P(1);tg=P(2); % Mass Balance dPdh(1)=rho_solid*(1-e)*S*height_dryer/W_B*w_d(Y,tg); % Enthalpy balance dPdh

函数
w_d(Y,T)
q(tg,tm)
用于下面描述的ODE解算器调用的函数中:

function dPdh=gasstep1(~,P)
global rho_solid W_B S e height_dryer c_a c_b tm_o

dPdh=zeros(size(P));
Y=P(1);tg=P(2);

% Mass Balance
dPdh(1)=rho_solid*(1-e)*S*height_dryer/W_B*w_d(Y,tg);
% Enthalpy balance
dPdh(2)=-rho_solid*(1-e)*S*height_dryer/W_B*(1/(c_b+c_a*Y))...
         *(q(tg,tm_o)+(c_a*(tg-tm_o)*w_d(Y,tg)));

dPdh=[dPdh(1)
      dPdh(2)];

end
ODE解算器的调用方式如下:

tspan=linspace(0,height_dryer,100);
format long
[h,P]=ode45(@(h,P)gasstep1(h,P),tspan,[Y_o tg_o]);
生成的数组和
p
中的值在
for
循环中用于计算变量:

X1=zeros(1,Nh);Tm=zeros(1,Nh);
X1(1,1)=X_o;Tm(1,1)=tm_o;

for i=1:Nh-1
    % Mass balance
    X1(1,i+1)=X1(1,i)-dt*((P(i+1,1)-P(i,1))/(h(i+1)-h(i)))*(W_B/S)*(1/(rho_solid*(1-e)));
    % Enthalpy balance
    Tm(1,i+1)=Tm(1,i)+dt*(1/(c_s+c_al*X1(1,i)))*(q(((P(i+1,2)+P(i,2))/2),Tm(1,i))-...
              ((c_a-c_al)*(Tm(1,i))+hv(Tm(1,i)))*w_d((P(i+1,1)-P(i,1)),     ((P(i+1,2)+P(i,2))/2)));
end
我的疑问是,当我在循环中调用ODE解算器时,函数
w_d
q
中的变量是否也会改变。我在mathworks网站()上找到了一种在循环中实现ODE解算器的方法。我发现在需要更改ODE参数时提供了帮助()

我认为我的最终代码应该是这样的:

for j=2:Nt
    for i=1:Nh-1
        % compute X1 & Tm
    end
    % change variables in function w_d and q
    % [call the ODE]
end

任何人都可以告诉我如何启动循环,这将有助于我完成代码。

您指向的链接应该回答您的问题:您可以为gasstep函数设置w_d和q参数,并使用您发布的第二个链接中的函数参数化

从您发布的代码中,我了解到您希望
w\u d
q
依赖于
X1
Tm
,对吗?我假设情况就是这样。如果它们依赖于其他参数,只需使用这些参数,而不是在我的解释中使用
X1
Tm
: 使
gasstep1
依赖于
X1
Tm
并将它们传递给
w_d
q
:您的gasstep1函数现在有4个参数:
gasstep1(h,P,X1,Tm)
,还有w_d和q(
w_d(Y,tg,X1,Tm)
)。那么您只需要创建gasstep2:

gasstep2 = @(h,P) gasstep1(h,P,X1,Tm) 
您可以在gasstep2上调用ode45


请注意,在您的最终代码中,如果您像上面介绍的那样编写,
X1
Tm
将依赖于p,p需要初始化

我不确定你的问题是什么。我不知道你所说的“关于如何启动循环的想法”是什么意思。你已经发布了很多对你来说可能很重要的特定代码,但最终却混淆了你的基本问题。我只能建议你学习,尤其是。您可以从集成函数内部开始。感谢您的回答/帮助,我最终在我发布的一个链接中找到了我问题的答案。@winoi很乐意提供帮助,欢迎使用Stack Overflow。如果此答案有助于解决您的问题,请将其标记为已接受!快乐编码!嗨@Etienne Pellegrini,如果我这样做,我不需要在ODE45中使用“插值”,对吗?