如何提高ODE求解器的求解精度?

时间:2019-04-06 21:27:07

标签: matlab system precision ode differential-equations

我正在尝试解决一个代表化学反应的微分方程组。其中3个功能(代表浓度)需要具有相对于其经历的变化而言非常高的值。因此,在给定点y1(t1)= 0.1且dy1(t2)= 10 ^ -53,结果y1(t2)= 0.1。这种舍入误差导致用于求解的矩阵变得接近奇异。我知道通常可以通过使用digits()和vpa()函数来解决此问题,但是我不确定如何使ode求解器使用此级别的精度。

我尝试在输入上使用可变精度,但是ode求解器仅接受双精度输入。我已经通过dsolve尝试过符号解决方案,但是没有一个明确的解决方案。相对公差的增加不会产生有意义的变化。

n = 10000;
tspan = [0 logspace(-12,-4, n)];

y0 = [0, 0, 0.05, 0.101, 0.1, 0];
options = odeset('RelTol',1e-8,'AbsTol',1e-10);
[T,unper(:,:)] = ode23s(@CombODE, tspan, y0, options);

function dy = CombODE(t, y, flag)

  K = [4.45740519775544e-08;194796303866372;4.71e+15;3.8e+16]
  Km = [8.46547310572481e+47;1.43069785956689e-49;7.41464500062955e- 
  40;1.83447707114187e-47]

    H = y(1);
    O = y(2);
    O2 = y(3);
    H2 = y(4);
    OH = y(5);
    H2O = y(6);

    R1 = K(1)*H2;
    R2 = K(2)*O*O;
    R3 = K(3)*O*H;
    R4 = K(4)*H*OH;
    Rm1 = Km(1)*H*H;
    Rm2 = Km(2)*O2;
    Rm3 = Km(3)*OH;
    Rm4 = Km(4)*H2O;

    dy = [2*R1-2*Rm1-R3-R4+Rm3+Rm4;
        -2*R2+2*Rm2-R3+Rm3;    
        R2-Rm2;
        -R1+Rm1;
        R3-Rm3-R4+Rm4;
        R4-Rm4;
        ];
end

绘制的函数显示预期的形状,但是在以非零值开头的三个函数中,零变化。这些方程是保守的,因此其他函数的微小增加应该表现为这三个函数的微小减少。

0 个答案:

没有答案