首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Matlab odeset()中使用NonNegative设置

在Matlab odeset()中使用NonNegative设置
EN

Stack Overflow用户
提问于 2013-02-25 00:18:46
回答 1查看 4.1K关注 0票数 0

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

下面是一些代码:

代码语言:javascript
复制
%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)];

方程式的代码(...)是:

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-25 02:32:59

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

ODE45的语法为: T,Y= ODE45(ODEFUN,TSPAN,Y0,OPTIONS,P1,P2...)

很高兴它成功了!:)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15053732

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档