优化结核病治疗使用非线性MPC与自定义求解器

这个例子显示了如何找到最优的政策,通过构建一个非线性MPC问题对待两个应变结核病(TB)人口。非线性MPC控制器然后使用默认解算器和一个自定义的解算器来计算最优解两者。

两应变型肺结核

在[1]中引入了两株结核模型。模型描述如下:

“在没有有效的疫苗的,对于TB的电流控制方案都集中在化疗。用于活性TB的抗生素治疗(药物敏感菌株)患者需要的时间长得多的周期和较高的成本比用于那些谁感染了敏感的TB但没有患疾病符合药物治疗的不足不仅会导致复发,但对抗生素有抗药性结核病的发展 - 。当今社会所面临的最严重的公共卫生问题之一的情况下减少药物可以通过“的情况下保持”,它是指用于确保药物摄入的规律性为足以实现固化,或通过“的情况下发现”,这是指所述识别的持续时间的活动和技术(通过来实现敏感TB潜伏感染敏感TB个人谁是在发展的疾病,谁高风险的筛选,例如)可以从第一码集团的预防性干预描述受益ķ。这些预防性治疗将降低药物敏感结核病的发生率(每单位时间的新病例),并且因此间接降低耐药结核病的发生率“。

在此示例中使用的动态模型,总宿主种群ñ(这是一个常数)分为六个不同的流行病学类别。其中五个类被定义为状态变量:

  • X(1)=小号,即易感人群的数量

  • X(2)=Ť,有效治疗人数

  • X(3)=L2,潜伏,感染了耐药结核菌,但不会传染的

  • x (4) =I1,具有传染性结核病的典型

  • x (5) =I2,传染性耐TB

第六类,L1(潜伏感染的典型TB,但不会传染)的计算公式为N - (S + T + L2 + I1和I2) +

您可以使用两个操作变量(MVs)来减少耐药结核病病例:

  • U(1) - “案的发现”,花费找出那些需要治疗相对便宜的努力。

  • U(2) - “外壳保持”,相对昂贵的努力,以保持有效的治疗方法。

有关动态模型的更多信息,请参见ResistantTBStateFcn.m

非线性控制问题

结核病治疗的目标是在五年期间减少耐药结核病的潜伏(L2)和传染性(I2)个人,同时保持低成本。为了实现这个目标,可以使用一个成本函数,该函数在五年内将下列值相加。

F = L2 + I2 + 0.5 * B1 * U1 ^ 2 + 0.5 * B2 * U2 ^ 2

在这里,重B150,权值B2为500。这些权重强调,发现病例在外壳保持的偏好由于其成本的影响。

总人口ñ=30000。初始条件:

小号= 19000Ť= 250L2= 500I1= 1000I2= 250

它的叶子L1= 9000。

N = 30000;X0 = [76;1;2;4;1] * N / 120;

在本例中,使用非线性MPC控制器找出最优控制策略。创建nlmpc具有正确的状态、输出和输入数目的对象。

NX = 5;NY = NX;NU = 2;nlobj = nlmpc(NX,NY,NU);
在标准成本函数中,默认情况下对一个或多个OVs应用零权值,因为与OVs相比,MVs更少。

假设治疗策略只能每三个月调整。因此,设置控制器采样时间到0.25年。既然你要在五年内找到最优的政策,预测跨度设定为20级(5年为0.25分)。

年= 5;TS = 0.25;P =岁/ TS;nlobj.Ts = TS;nlobj.PredictionHorizo​​n = P;

对于这个规划问题,您希望使用最大数量的决策变量。为此,将控制层设置为预测层。

nlobj.ControlHorizo​​n = P;

其中定义了预测模型ResistantTBStateFcn.m。指定该功能为控制器状态的功能。

nlobj.Model。StateFcn ='ResistantTBStateFcn';

这是指定的预测模型和成本/约束函数分析雅可比功能的最佳实践。关于雅可比计算状态方程的详细信息,请参阅ResistantTBStateJacFcn.m。设置此文件作为状态雅可比功能。

nlobj.Jacobian。StateFcn ='ResistantTBStateJacFcn';

因为所有的状态都是个体的数量,所以它们必须是非负的。指定的最小界0所有状态。

对于CT = 1:NX nlobj.States(克拉).Min = 0;结束

因为在组(状态)之间有很大的总体变化,所以使用它们各自的名义值来缩放状态变量。这样做可以提高优化问题的数值鲁棒性。

对于CT = 1:NX nlobj.States(克拉).ScaleFactor = X0(CT);结束

两者“寻找”和“保持”控制具有之间的操作范围0.050.95。将这些值设置为MVs的下界和上界。

nlobj.MV (1)。最小值= 0.05;nlobj.MV (1)。Max = 0.95;nlobj.MV (2)。最小值= 0.05;nlobj.MV (2)。Max = 0.95;

定义了最小化结核病人口和治疗成本的成本函数ResistantTBCostFcn.m。由于该规划问题并不需要参考跟踪和干扰抑制,替代使用该成本函数的标准成本。

nlobj.Optimization。CustomCostFcn =“ResistantTBCostFcn”;nlobj.Optimization。ReplaceStandardCost = true;

此外,为了加快仿真,成本的分析雅可比在提供ResistantTBCostJacFcn

nlobj.Jacobian.CustomCostFcn =“ResistantTBCostJacFcn”;

由于L1人群被定义为ñ减去所有状态的和,你必须确保(S + T + L2 + I1 + I2) - N <0总是被满足。在里面nlmpc对象,指定此条件为使用匿名函数不等式约束。

nlobj.Optimization。CustomIneqConFcn = @(X,U,e,data)和(X(2:end,:),2)-30000;

要检查是否有潜在的数值问题,验证您的预测模型,自定义函数和雅克比使用validateFcns命令。

validateFcns (nlobj x0, [0.5, 0.5])
Model.StateFcn是OK。Jacobian.StateFcn是OK。无输出函数指定。假设“Y = X”中的预测模型。Optimization.CustomCostFcn是OK。Jacobian.CustomCostFcn是OK。Optimization.CustomIneqConFcn是OK。用户提供的模型,成本和约束函数的分析完成。

为了计算最优控制策略,请使用nlmpcmove函数。在初始条件下,MVs为零。默认情况下,fmincon从优化工具箱™作为默认NLP求解器。

lastMV = 0(ν,1);[~,~,信息]= nlmpcmove (x0, nlobj lastMV);
Slack变量未使用或零加权在您的自定义成本函数。所有的约束都将是困难的。

绘制并检查最优解。

ResistantTBPlot(信息,TS)
最佳成本= 5194.8最终L2 = 175.9最终I2 = 862.9

最优解的代价是5195和个人的感染耐药结核在最后时间总数为L2+I2=1037

寻找最佳治疗使用自定义非线性规划求解

如果您希望在模拟中使用第三方NLP求解程序,请编写一个接口文件,转换由nlmpc,并将其指定为CustomSolverFcnnlmpc宾语。

在这个例子中,假设您有一个具有不同的用户界面比“XYZ”求解fmincon。一种ResistantTBSolver.m文件被创建为转换由定义的优化问题nlmpc对象指向“XYZ”解决程序所需的适当接口。检查ResistantTBSolver.m

功能[Z最佳,成本,exitflag] = ResistantTBSolver(FUN,Z0,A,B,AEQ,BEQ,LB,UB,NONLINCON)这是一个调用XYZ非线性规划的接口函数%求解器来解决由nlmpc控制器限定的NLP问题。该该函数的输入和输出定义与fmincon相同。%该接口功能转换fmincon输入到格式所需%的由XYZ解算器和转换结果返回给fmincon输出。%输入%乐趣:非线性成本。FUN接受输入z(决策变量)和%的回报成本F(设为z评价标量值)和它的%梯度克(设为z评估了NZ-1矢量)。%Z0:z与初始猜测%A,B:* Z <= b的%AEQ,BEQ:AEQ * Z == BEQ%磅,UB:降低和z的上限非线性约束。NONLINCON接受输入z并返回%的载体C和CEQ作为第一两个输出,代表%的非线性不等式和等式分别在那里当C(z) <= 0和Ceq(z) = 0时,乐趣值最小化。% NONLINCON还返回C (a nz-by-ncin)的雅可比矩阵%稀疏矩阵)和CEQ(一NZ逐nceq稀疏矩阵)。输出%%Z最佳:z与最优解%成本:最优z处的最优成本%exitflag:%1一个阶最优性条件满足。%0太多的功能评价或迭代。%-1通过输出/绘图功能停止。%-2没有可行点中找到。您可以使用此示例作为模板来实现要到的接口文件%你自己的NLP求解。求解器必须是一个M文件或在一个文件MEX% MATLAB路径。不要编辑上面的行。%版权所有2018 MathWorks公司%%设置空间信息的线性和非线性约束num_lin_ineq =尺寸(A,1);num_lin_eq =尺寸(AEQ,1);[在,当量] = NONLINCON(Z0);num_non_ineq =长度(英寸);num_non_eq =长度(当量);总= num_non_ineq + num_non_eq + num_lin_ineq + num_lin_eq;logicals_nlineq =假(总的,1);logicals_nlineq(1:num_non_ineq)= TRUE;logicals_nleq =假(总的,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,“情商”,logicals_eq);%%集决策变量界限options.lb =磅;options.ub = UB;设置非线性约束的RHS选项。cl =[无穷(num_non_ineq 1); 0 (num_non_eq 1)];选项。铜= [0 (num_non_ineq 1); 0 (num_non_eq 1)];的线性约束%%集RHSoptions.rl = [-INF(num_lin_ineq,1); BEQ];options.ru = [B; BEQ];设置一个矩阵options.A =稀疏([A; AEQ]);设置XYZ求解器optonsoptions.algorithm =结构('print_level'0,'max_iter',200,'max_cpu_time',1000,“托尔”,1.0000e-06,“hessian_approximation”内存有限的);设置XYZ求解程序使用的函数句柄Jstr =稀疏的(num_non_ineq + num_non_eq,长度(z0)));func =结构(“目标”,@(X)FVAL(FUN,X),“梯度”,@(X)GVAL(FUN,X),“约束”@ (x) conval (NONLINCON x),“雅可比”,@(X)jacval(NONLINCON,X),'jacobianstructure'Jstr @ ());%%调用XYZ,返回成本和状态[Z最佳,输出] = XYZsolver(Z0,funcs中,选项);成本= FUN(Z最佳);exitflag = convertStatustoExitflag(output.status);%%实用功能功能F = FVAL(乐趣,z)的%回非线性成本并[f,〜] =乐趣(Z);功能g = gval(有趣,z)%回成本梯度(~ g) =乐趣(z);功能c = conval (nonlcon, z)%回非线性约束(eq) = nonlcon (z);c = (, eq);功能J = jacval (nonlcon, z)稀疏矩阵中nc-by-nz的%返回约束雅可比矩阵锦%新西兰是按ncin稀疏,JEQ新西兰是按nceq稀疏[~,~,金,Jeq] = nonlcon (z);J = [Jin Jeq];功能exitflag = convertStatustoExitflag(状态)开关(状态)情况下0%的信息。小号tatus = 'Success';exitflag = 1;情况下1%info.Status =“解决到可接受的水平”;exitflag = 1;情况下2%info.Status = '不可行';exitflag = -1;情况下3%的信息。小号tatus = 'Search Direction Becomes Too Small';exitflag = -2;情况下4%info.Status = '发散迭代';exitflag = -2;情况下6%的信息。小号tatus = 'Feasible Point Found';exitflag = 1;情况下-1%info.Status = '超出迭代';exitflag = 0;情况下-4%info.Status = '最大超时';exitflag = 0;否则%的信息。小号tatus = 'IPOPT Error';exitflag = -2;结束

您可以使用此文件作为模板来实现一个接口文件到您自己的NLP求解。求解器必须在MATLAB路径上的MATLAB脚本或MEX文件。

方法将其指定为自定义求解程序,即可插入该求解程序nlmpc宾语。

nlobj.Optimization。CustomSolverFcn=@ResistantTBSolver;

只要“XYZ”求解器是可靠的,它的选项选择适当,重新运行仿真应该产生类似的结果。

参考文献

荣格,E., S. Lenhart,和Z. Feng。“两株结核病模型的最佳治疗控制。”离散和连续动力系统,系列B2,2002年,第479-482。

也可以看看

|

相关话题