主要内容

用自定义求解器使用非线性MPC优化结核病处理

这个例子展示了如何通过构造一个非线性的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

在这里,重量B150.,权重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.050.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号。

也可以看看

|

相关的话题