我正在尝试解决一个代表化学反应的微分方程组。其中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
绘制的函数显示预期的形状,但是在以非零值开头的三个函数中,零变化。这些方程是保守的,因此其他函数的微小增加应该表现为这三个函数的微小减少。