这个例子展示了如何通过构造一个非线性的MPC问题来寻找最优的策略来处理一个双菌株结核病(TB)种群。非线性MPC控制器然后使用默认解算器和自定义解算器来计算最优解。
在[1]中介绍了两种菌株结核模型。该模型描述如下:
“在没有有效的疫苗的情况下,TB的当前控制程序专注于化疗。活性TB(用药物敏感菌株)患者的抗生素治疗需要更长的时间和更高的成本,而不是那些感染敏感的TB,但尚未开发这种疾病。缺乏抑制药物治疗不仅可能导致复发,而且对抗生素抗性TB的发育 - 今天面临的社会最严重的公共卫生问题之一。案件的减少可以通过“壳体持有”来实现药物敏感的TB,这是指用于确保药物摄入量规律的活动和技术,以获得治愈的持续时间,或者通过“案例发现”是指识别(通过例如,筛选的个体潜伏期患有敏感的TB,患有高风险的疾病,可能会受益于第一代码BLOC的预防性干预描述k。这些预防治疗将减少药物敏感TB的发病率(每单位时间新的案例),因此间接降低耐药性TB的发生率。“
在该示例中使用的动态模型中,总宿主N.
(这是一个常数)被分为六种不同的流行病学课程。其中五个类被定义为状态变量:
x (1) =S.
,易感个体数量
x(2)=T.
,有效治疗的人数
x(3)=L2
,潜伏,感染抗性Tb但不传染性
x(4)=I1
,典型的结核病
x(5)=I2
,具有抗性TB的感染性
第六堂课,L1
(潜伏的,感染典型结核病但不具传染性)计算为n - (S + T + L2 + I1 + I2)
.
您可以使用两个操纵变量(MVS)来减少抗性TB案例:
U(1) - “案例发现”,相对廉价的努力占识别需要治疗的努力。
U(2) - “案例持有”,相对昂贵的努力维持有效治疗。
有关动态模型的更多信息,请参阅ResistantTBStateFcn.m
.
结核病治疗的目标是在五年期间减少潜伏(L2)和传染性(I2)耐药结核病患者,同时保持低成本。为了实现这一目标,使用一个成本函数,它在五年内合计以下价值。
F = L2 + I2 + 0.5*B1*u1^2 + 0.5*B2*u2^2
在这里,重量B1
是50.
,权重B2是500.
.由于其成本影响,这些权重强调了查找案件比保存案件更优先。
总人口是N.
=30000
.在初始条件下:
S.
= 19000T.
= 250.L2
= 500I1
= 1000.I2
= 250.
哪个叶子L1
= 9000。
N = 30000;x0 = [76;1;2;4;1) * N / 120;
在此示例中,使用非线性MPC控制器找到最佳控制策略。创造nlmpc.
具有正确数量状态,输出和输入的对象。
nx = 5;纽约= nx;ν= 2;nlobj = nlmpc (nx、纽约、ν);
在标准成本函数中,默认情况下,零重量施加到一个或多个OV,因为没有比OVS更少。
假设治疗政策只能每三个月调整一次。因此,请将控制器采样时间设置为0.25年。因为您想要在5年内找到最优的政策,所以将预测范围设置为20步(5年除以0.25)。
年= 5;t = 0.25;p =年/ Ts;nlobj。T.s = Ts; nlobj.PredictionHorizon = p;
对于此规划问题,您希望使用最大决策变量数。为此,将控制视线设置为等于预测地平线。
nlobj。ControlHorizon = p;
预测模型是定义的ResistantTBStateFcn.m
.将此功能指定为控制器状态功能。
nlobj.model.statefcn =.“ResistantTBStateFcn”;
最好的做法是指定用于预测模型和成本/约束函数的分析雅加诺函数。有关状态方程的雅可比计算的详细信息,请参阅ResistantTBStateJacFcn.m
.将此文件设置为状态雅可比函数。
nlobj.jacobian.statefcn =.“ResistantTBStateJacFcn”;
因为所有国家都是个人的数量,所以它们必须是非负值。指定最小的限制0.
对于所有国家。
为了ct = 1:nx nlobj.States。最小值= 0;结尾
由于组(状态)之间存在大的人口变化,因此使用各自的标称值缩放状态变量。这样做提高了优化问题的数值稳健性。
为了ct = 1:nx nlobj.states(ct).scalefactor = x0(ct);结尾
“寻找”和“保持”控件的操作范围都在0.05
和0.95
.将这些值设置为MV的较低和上限。
nlobj.mv(1).min = 0.05;nlobj.mv(1).max = 0.95;nlobj.mv(2).min = 0.05;nlobj.mv(2).max = 0.95;
使结核病人口和治疗成本最小化的成本函数定义为ResistantTBCostFcn.m
.由于这个规划问题不需要参考跟踪或干扰抑制,所以用这个代价函数代替标准代价。
nlobj.optimization.customcostfcn =.“抵抗bcostfcn”;nlobj.optimization.replacestandardcost = true;
为加快仿真速度,给出了代价的解析雅可比矩阵抵制抵抗
.
nlobj.jacobian.customcostfcn =.“ResistantTBCostJacFcn”;
自L1
人口定义为N.
减去所有国家的总和,必须确保(s + t + l2 + i1 + i2) - n < 0
总是满意。在里面nlmpc.
对象,使用匿名函数将此条件指定为不等式约束。
nlobj.optimization.customineqconfcn = @(x,u,e,data)sum(x(2:结束,:),2)-30000;
方法验证预测模型、自定义函数和雅可比矩阵来检查潜在的数值问题validateFcns
命令。
validateFcns (nlobj x0, [0.5, 0.5])
model.statefcn是好的。jacobian.statefcn还可以。没有指定输出函数。假设预测模型中的“y = x”。优化.customcostfcn是可以的。jacobian.customcostfcn还可以。优化.customineqconfcn是可以的。分析用户提供的模型,成本和约束函数完成。
要计算最优控制策略,请使用nlmpcmove.
功能。在初始条件下,MV为零。默认情况下,fmincon
使用最优化工具箱™作为默认的NLP求解器。
lastmv = zeros(nu,1);[〜,〜,Info] = nlmpcmove(nlobj,x0,lastmv);
在您的自定义成本函数中松弛变量未使用或零加权。所有约束都将很难。
绘图并检查最佳解决方案。
抵抗力(Info,TS)
最优成本= 5194.8 Final L2 = 175.9 Final I2 = 862.9
最佳解决方案产生成本5195.
,最终感染耐药结核病的总人数为L2
+I2
=1037.
.
如果要在仿真中使用第三方NLP解算器,请写一个接口文件,该文件转换由定义的输入nlmpc.
输入NLP求解器定义的输入,并将其指定为CustomSolverFcn
在里面nlmpc.
对象。
在这个例子中,假设你有一个“XYZ”求解器,它的用户界面不同于fmincon
.一种ResistantTBSolver.m
文件的创建是为了转换定义的优化问题nlmpc.
对象“XYZ”求解器所需的适当接口。点评审查ResistantTBSolver.m
.
函数[zopt,cost,ExitFlag] =抵制(乐趣,Z0,A,B,AEQ,BEQ,LB,UB,非林肯)%这是一个接口函数,调用XYZ非线性编程%求解器解决NLMPC控制器定义的NLP问题。这此函数的%输入和输出定义与Fmincon相同。%%此接口功能将Fmincon输入转换为所需的格式XYZ求解器的%并将结果转换回Fmincon输出。%%的输入%有趣:非线性成本。有趣接受输入Z(决策variabls)和%返回代价f(在z处求值的标量值)及其%梯度g(在z时评估的NZ-BY-1载体)。% z0: z的初始猜想%a,b:a * z <= b% Aeq,说真的:Aeq * z = =说真的%LB,UB:Z的下限和上限%非林肯:非线性约束。nonlilincon接受输入z并返回%vector c和ceq作为前两个输出,代表%非线性不等式和平等分别在哪里将%乐趣最小化为C(Z)<= 0且CEQ(z)= 0。%nonlincon还返回c的雅各族矩阵(nz-by-ncin%稀疏矩阵)和Ceq(一个nz-by-nceq稀疏矩阵)。%%输出z的最优解%成本:最佳z的最佳成本% exitflag:% 1满足一阶最优性条件。% 0函数求值或迭代太多。% -1停止输出/绘图功能。% 2没有找到可行点。%%您可以将此示例用作模板以实现接口文件%你自己的NLP解决方案。程序上的解算器必须是M文件或MEX文件%matlab路径。%%不要编辑上面的行。%版权所有2018 The MathWorks, Inc.直线和非线性约束的%%设定尺寸信息num_lin_ineq = size(a,1);num_lin_eq = size(aeq,1);[In,EQ] =非林肯(Z0);num_non_ineq =长度(in);num_non_eq =长度(eq);总计= num_non_ineq + num_non_eq + num_lin_ineq + num_lin_eq;Logicals_nlineq = false(总,1);Logicals_nlineq(1:num_non_ineq)= true;Logicals_nleq = false(总,1);Logicals_nleq(num_non_ineq +(1:num_non_eq))= true; logicals_ineq = false(total,1); logicals_ineq(num_non_ineq+num_non_eq+(1:num_lin_ineq)) = true; logicals_eq = false(total,1); logicals_eq(num_non_ineq+num_non_eq+num_lin_ineq+(1:num_lin_eq)) = true; options = struct('nlineq'logicals_nlineq,“nleq”,logicals_nleq,...“ineq”,logicals_ineq,'eq',logicals_eq);%%设置决策变量边界选项。磅=磅;选项。乌兰巴托=乌兰巴托;%%设置非线性约束的RHSoptions.cl = [-inf(num_non_ineq,1); zeros(num_non_eq,1)];options.cu = [zeros(num_non_ineq,1); zeros(num_non_eq,1)];%%设置线性约束的RHSoptions.rl = [-inf(num_lin_ineq,1); beq];options.ru = [b; beq];%%设置矩阵选项。一种=sparse([A; Aeq]);%% Set XYZ Solver Optonsoptions.algorithm = struct(“print_level”,0,“max_iter”,200,...“max_cpu_time”,1000,'tol'1.0000 e-06...'hessian_approximation'那“有限的记忆”);XYZ求解器使用的%% SET功能手柄jstr =稀疏(num_non_ineq + num_non_non_eq,长度(z0)));funcs = struct('客观的',@(x)fval(有趣,x),...“梯度”@ (x) gval(有趣,x)...'限制',@(x)同步(非林肯,x),...的雅可比矩阵@ (x) jacval (NONLINCON x),...'jacobianstructure',@()jstr...);%%呼叫XYZ并返回成本和状态[zopt、输出]= XYZsolver (z0、函数、期权);成本=乐趣(zopt);exitflag = convertStatustoExitflag (output.status);%%实用程序功能函数f = fval(有趣,z)回报非线性成本[f ~] =乐趣(z);函数g = gval(有趣,z)退货成本梯度[〜,g] =有趣(z);函数c =同步(非函数,z)返回非线性约束[in,eq] = nonlcon(z);c = [in; eq];函数j = jacval(nonlcon,z)在稀疏矩阵中返回约束雅可比矩阵为nc-by-nz%金是nz-by-ncin稀疏,jeq是nz-by-nceq稀疏[〜,〜,金,jeq] = nonlcon(z);j = [金杰]';函数ExitFlag = ConvertStatustoExitFlag(状态)开关(地位)案件0.%info.status ='成功';EXITFLAG = 1;案件1%info.status ='解决了可接受的水平';EXITFLAG = 1;案件2%info.status ='不可行的';ExitFlag = -1;案件3.%info.status ='搜索方向变得太小';ExitFlag = -2;案件4.%info.status ='发散迭代';ExitFlag = -2;案件6.%的信息。S.tatus = 'Feasible Point Found';EXITFLAG = 1;案件-1%的信息。S.tatus = 'Exceeded Iterations';ExitFlag = 0;案件-4%的信息。S.tatus = 'Max Time Exceeded';ExitFlag = 0;否则%info.status ='ipopt错误';ExitFlag = -2;结尾
您可以将此文件用作模板以将接口文件实现到您自己的NLP求解器。求解器必须是MATLAB路径上的MATLAB脚本或MEX文件。
您可以通过将其指定为自定义求解器来插入求解器nlmpc.
对象。
nlobj.optimization.customsolverfcn = @resistanttbsolver;
只要“XYZ”求解器是可靠的,并且选择其选项都被正确选择,重新运行模拟应该产生类似的结果。
[1] Jung,E.,S. Lenhart和Z. Feng。“两种应变结核模型治疗的最佳控制。”离散和连续动力系统,B2,2002系列,第479-482号。