使用MATLAB的“decic”函数实现一致初始条件的收敛失败

时间:2013-05-24 07:42:51

标签: matlab ode nonlinear-functions

我有一组高度非线性的隐式ODE,我需要使用ode15i等隐式求解器来积分方程。为了使用ode15i,您必须获得衍生物和因变量的一致初始条件。 MATLAB有一个内置函数'decic',可以计算一致的IC,但是,当我执行函数时,我得到以下错误:

“DECIC的融合失败。”

现在,一般来说,如果你的方程式不一致,'decic'会给你一个警告,要求你释放一些Y0的变量。但在我的情况下,我不认为我有不一致的方程,但我不确定为什么会出现收敛失败错误以及如何解决它。网上没有很多关于它的文档。我在下面包含一个包含所有必要值的自包含代码来运行它。由于这是一个非常具体的问题,我无法真正缩短代码或提供简化的示例。任何建议/帮助表示赞赏。

function [Y0,YP0] = droplet_momentum_IC(theta,K,G,P,Z0,Y0)

YP0 = [0;0;0;0];
[Y0,YP0] = decic(@momentum,Z0,Y0,[1;1;1;1],YP0,[0;0;0;0]);

function RES = momentum(z,y,yp)

    RES = zeros(4,1);

    %Entrained Total Velocity
    Ve = sin(theta)*(0.5*z*yp(4) + y(4));

    %Total Relative Velocity
    Urs = sqrt((y(1) - y(4))^2 + (y(2) - Ve*cos(theta))^2 + (y(3))^2);

    %Coefficients
    PSI = K*Urs/y(1);
    PHI = P*Urs/y(1);

    %Liquid Axial Velocity
    RES(1) = yp(1) - PSI*sign(y(1) - y(4))*(1 + (1/6)*(abs(y(1) - y(4))*G)^(2/3));

    %Liquid Radial Velocity
    RES(2) = yp(2) - PSI*sign(y(2) - Ve*cos(theta))*(1 + (1/6)*(abs(y(2) - ...
        Ve*cos(theta))*G)^(2/3));

    %Liquid Tangential Velocity
    RES(3) = yp(3) - PSI*sign(y(3))*(1 + (1/6)*(abs(y(3))*G)^(2/3));

    %Gaseous Axial Velocity
    RES(4) = yp(4) - (1/z/y(4))*((PHI/z)*sign(y(1) - y(4))*(1 + ...
        (1/6)*(abs(y(1) - y(4))*G)^(2/3)) + Ve*Ve - y(4)*y(4));

end

end

可以使用以下命令调用上述函数:

theta = 0.48;
K = -8.99*10^(-4);
G = 251.6818;
P = 0.1780;
Y0 = [0.7884;0.6145;0.0272;0.0079];
Z0 = 10.4105;
[Y0,YP0] = droplet_momentum_IC(theta,K,G,P,Z0,Y0);

可以在这里找到'decic'的文档(虽然关于我的问题没有太多有用的信息):

http://www.mathworks.com/help/matlab/ref/decic.html

0 个答案:

没有答案