1

我有一组高度非线性的隐式 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

4

0 回答 0