【问题标题】:Matlab ODE45. How to change a function inside it while calling it?Matlab ODE45。如何在调用时更改其中的函数?
【发布时间】:2014-08-08 12:36:03
【问题描述】:

函数 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_dq 中的变量是否也会发生变化。我在 mathworks 网站 (link) 上找到了一种在循环中实现 ODE 求解器的方法。我找到了在需要更改 ODE 参数时提供的帮助 (link)。

我认为我的最终代码应该类似于:

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

谁能给我一个关于如何启动循环的想法,这将有助于我完成代码。

【问题讨论】:

  • 我不确定你的问题是什么。我不知道您所说的“关于如何启动循环的想法”是什么意思。您发布了许多可能对您很重要的特定代码,但最终只会使您的基本问题感到困惑和混乱。我只能建议您了解function handles,尤其是parametrizing functions。您可以在您的集成函数中从not using global variables 开始。

标签: matlab loops ode numerical-integration


【解决方案1】:

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

从您发布的代码中,我了解到您希望 w_dq 依赖于 X1Tm,对吗?我会假设情况就是这样。如果它们依赖于其他参数,请在我的解释中使用它们而不是 X1Tm
使gasstep1 依赖于X1Tm 并将它们传递给w_dq:你的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!

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

【讨论】:

  • 感谢您的回答/帮助,我最终在我发布的一个链接中找到了我的问题的答案。
  • @winoi 很高兴为您提供帮助,欢迎来到 Stack Overflow。如果此答案有助于解决您的问题,请将其标记为已接受!编码愉快!
  • 嗨@Etienne Pellegrini,如果我这样做,我不需要在ODE45中使用“插值”,对吧?
猜你喜欢
  • 2011-12-02
  • 2016-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-03
  • 2020-02-14
  • 1970-01-01
相关资源
最近更新 更多