在ode MATLAB求解器上使用中间值

时间:2019-04-08 14:49:13

标签: matlab ode

我正在使用刚性求解器(ode15s)对ODE系统进行时间积分。它正在运行,但是我想加快速度。

方程组以状态空间形式给出:

function [dx] = fun(t,x,M,C,K,other_parameters)
    % Mx'' + Cx' + Kx = F(t)
    % BUNCH OF CALCULATIONS
    F = solveP(x,t);

    A = [zeros(n) eye(n) ; -M\K -M\C];
    b = M\F;

    dx = A*x + b
end

这里的技巧部分是强制函数F。它是高度非线性的,取决于x和t参数。它使用x参数来求解泊松型2D方程(通过有限体积法)。力F与泊松方程解成比例。

function [F] = solveP(x,t)
    % initialize solution
    Phi = zeros(Ni,Nj);

    % solve iteratively
    % ...
    while (~converged)
         % some calculations

         % iterative solver
         Phi(i,j) = (aE*Phi(i,j+1) + aW*Phi(i,j-1) + aN*Phi(i+1,j) +...
                     aS*Phi(i-1,j) + S(i,j))/aP;
    end


    % calculate F
    F = sum(Phi(:)); % discrete integration over domain
end

通过迭代方法求解泊松方程需要一个初始条件,该条件设置为零(Phi=zeros(Ni,Nj))。我以为我可以通过提供更好的ϕ字段初始估计来提高计算速度(更好的初始条件将需要更快的时间才能找到所需的答案)。我可以想到的最佳初始条件(除ϕ = 0之外)是在ode求解器(ϕ(k)_initial=ϕ(k-1))的上一次迭代(最后一步)中获得的ϕ字段的值。

最重要的是:如何在ode解决方案中使用/保存中间值?

PS:我尝试使用持久变量,但这不是一个好的解决方案。 ode求解器会在时间提前之前在多个点上计算函数。每次ode调用odefun fun时,持久变量都会保存聚合的ϕ字段。那并不是我想要的,随着时间的推移,这实际上提供了错误的答案。

1 个答案:

答案 0 :(得分:0)

一种可能的解决方法是,在一次迭代后将找到的Phi解决方案写入基本工作区。首先,您必须在基本工作区中初始化Phi

Phi = zeros(Ni, Nj);

然后,您可以使用evalinPhi函数中调用此solveP。然后,找到Phi的更新解决方案后,请确保使用assignin在基础工作区中再次分配它。 solveP如下所示:

function [F] = solveP(x,t)
    % initialize solution
    Phi = evalin('base','Phi');

    % solve iteratively
    % ...
    while (~converged)
         % some calculations

         % iterative solver
         Phi(i,j) = (aE*Phi(i,j+1) + aW*Phi(i,j-1) + aN*Phi(i+1,j) +...
                     aS*Phi(i-1,j) + S(i,j))/aP;
    end


    % calculate F
    F = sum(Phi(:)); % discrete integration over domain

    % assign updated Phi in base workspace
    assignin('base', 'Phi2', Phi)
end