Matlab ODE45。调用它时如何更改其中的函数?

时间:2014-08-08 12:36:04

标签: 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(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

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

1 个答案:

答案 0 :(得分:0)

您指向的链接应该回答您的问题:您可以制作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,需要初始化!