在Matlab odeset()中使用非负设置

在Matlab odeset()中使用非负设置,matlab,ode,Matlab,Ode,我试图在MatLab中求解一些常微分方程,因为方程中的变量是总体,它们需要约束为正。因此,我尝试在调用方程求解器之前使用odeset(),使其非负,但在绘制之后的值时,它们有时实际上是负的(在下面的代码中是洋红色线)。我做错了什么 下面是一些代码: %Lots of variables includeJ=1; cullLIRate=1/2000; cullDIRate=1/2000; N = 16800; beta = 2e-7; delta = 0.5; gamma = 1/50; sigma

我试图在MatLab中求解一些常微分方程,因为方程中的变量是总体,它们需要约束为正。因此,我尝试在调用方程求解器之前使用odeset(),使其非负,但在绘制之后的值时,它们有时实际上是负的(在下面的代码中是洋红色线)。我做错了什么

下面是一些代码:

%Lots of variables
includeJ=1;
cullLIRate=1/2000;
cullDIRate=1/2000;
N = 16800;
beta = 2e-7;
delta = 0.5;
gamma = 1/50;
sigma = 1/400;
mu = 1/365;
maxTime = 30*365;
kappa = N;
gR = 0.05;
mJ = 1/3650;
initJPerAdult = 10;
numInitE = 1000;
TSpan = [0,maxTime];

initState = [N-numInitE,numInitE,0,0,0,initJPerAdult*N];

%IMPORTANT BIT HERE
options = odeset('NonNegative', 1:6)
scirSoln = ode45(@equation,TSpan,initState,[],beta,delta,gamma,sigma,mu,kappa,gR,mJ,cullLIRate,cullDIRate,includeJ);

scirVals = deval(scirSoln,timeToPlot);
plot(timeToPlot,scirVals(1,:));
hold on;
plot(timeToPlot,scirVals(3,:),'k');
plot(timeToPlot,scirVals(4,:),'g');
plot(timeToPlot,scirVals(6,:),'m');

timeToPlot = [0:max(TSpan)/1000:max(TSpan)];
方程式(…)的代码为:


您没有将定义的odeset(选项变量)传递给ODE45-解算器

ODE45的语法是:[T,Y]=ODE45(ODEFUN,TSPAN,Y0,OPTIONS,P1,P2…)


很高兴它成功了!:)

您没有将定义的odeset(选项变量)传递给ODE45-解算器。ODE45的语法是:[T,Y]=ODE45(ODEFUN,TSPAN,Y0,OPTIONS,P1,P2…)试试看,如果您还有问题,请与我联系,我会仔细查看。谢谢您的帮助!从另一个来源改编代码,但没有意识到。。。如果你把这个作为一个答案,我会很高兴地接受,并给你一些信用:)
function retVal = equation(t,y,beta,delta,gamma,sigma,mu,kappa,gR,mJ,cullLIRate,cullDIRate,includeJ)
retVal = zeros(6,1);

S = y(1);
E = y(2);
LI = y(3);
DI = y(4);
R = y(5);
J = y(6);

retVal(1)= mJ * J - beta * S * (delta * LI + DI);
retVal(2) = beta * S * (delta * LI + DI) - gamma * E;
retVal(3) = gamma * E - (cullLIRate + sigma) * LI;
retVal(4) = sigma * LI - (mu + cullDIRate) * DI;
retVal(5) = mu * DI + cullLIRate* LI + cullDIRate * DI;
retVal(6) = gR * S * (1 - S / kappa) - mJ * J;

end