这个示例展示了如何生成预测剩余有用寿命(RUL)的代码,该代码在预测算法停止并重新启动时保留RUL模型的状态。当您在系统操作期间使用传入数据更新RUL模型时,此工作流非常有用。当您这样做时,在系统关闭时,您可能会丢失对模型所做的任何更新。这个例子展示了如何使用readState
和restoreState
入口点函数中的命令,用于在运行时保存对模型的更新。
这个示例建立在下图所示的工作流之上生成预测剩余使用寿命的代码.您可以使用此示例的工作流生成代码,使用基于降级的RUL模型预测剩余的有用寿命,linearDegradationModel
和exponentialDegradationModel
.
在生成用于RUL预测的代码之前,您必须使用历史数据适应RUL模型。对于本例,加载数据linTrainTables.mat
.这个文件包含一些随时间变化的条件指示器的测量值,组织到带有列标签的表中“时间”
和“条件”
.使用这些数据来训练一个线性退化模型。(有关配置和培训这种类型的RUL模型的更多信息,请参见linearDegradationModel
.)
负载(“linTrainTables.mat”) mdl =线性退化模型;fit (mdl linTrainTables,“时间”,“条件”)
中描述的生成预测剩余使用寿命的代码,为代码生成准备模型,请使用saveRULModelForCoder
将RUL模型作为数据结构存储在MAT文件中。以后,在入口点函数中,使用loadRULModelForCoder
装载和重建linearDegradationModel
对象。
saveMATfilename =“savedModel.mat”;saveRULModelForCoder (mdl saveMATfilename);
您还可以选择使用在训练数据之后收集的额外数据更新模型参数。对于本例,加载linTestData1
,这是一个包含时间和条件指示器值的121行表。使用该表中的前两个条目来更新模型。
负载(“linTestData.mat”,“linTestData1”) updateData = linTestData1(1:2,:);更新(mdl updateData);
接下来,使用readState
.该命令将RUL模型对象转换为一个结构,您可以将其作为输入参数传递给入口点函数。
savedState = readState (mdl);
入口点函数是要为其生成代码的函数。对于本例,创建入口点函数degradationRULPreserveState.m
,如下所示。
类型degradationRULPreserveState.m
function [estRULOut,ciOut,newState] =退化rulpreservestate (data,restoreStateFlag,savedState) %#codegen persistent mdl %第一次调用函数时加载模型如果是空的(mdl) mdl = loadRULModelForCoder('savedModel');如果需要,恢复保存的模型参数,如果restoreStateFlag restoreState(mdl,savedState);end %更新模型和预测,新数据阈值= 60;数据更新(mdl);[estRULOut, ciOut] = predictRUL (mdl阈值);%读取更新的模型参数newState = readState(mdl);结束
方法更新RUL预测模型更新
命令,每次使用新的输入数据调用它时。声明mdl
作为一个持续的
变量在调用之间保留更新的模型参数,而函数则保留在内存中。该函数将更新后的模型参数写入输出参数newState
.当从内存中清除函数时,可以使用此输出参数来保留更新后的模型状态。因此,例如在系统关闭后重新启动预测算法时,可以设置restoreStateFlag
来真正的
把最近保存的递过去savedState
,确保系统继续使用最新更新的模型参数进行预测。
要生成代码,必须提供具有入口点函数所期望的每个输入参数的数据类型和格式的示例数据。对于本例,使用中的下一个条目linTestData1
.同时,设置restoreStateFlag
逻辑值真正的
.
testData = linTestData1 (3);restoreStateFlag = true;
现在您可以使用以下代码生成代码codegen
(MATLAB编码器)命令。
codegendegradationRULPreserveStatearg游戏{testData, restoreStateFlag, savedState}-nargout3.
代码生成成功。
该命令生成一个MEX文件,这是一个可执行文件,您可以从MATLAB®中调用。您可以使用类似于此示例的过程为任何其他目标生成代码codegen
金宝app支持。或者,您可以使用MATLAB Coder应用程序,如生成预测剩余使用寿命的代码.
为了验证生成的代码,在MATLAB命令提示符下,在测试数据上运行入口点MATLAB函数。然后,在相同的数据上运行生成的MEX文件,并确认结果相同。
[estRUL, ci, newState] = degradationRULPreserveState (testData、restoreStateFlag savedState);[estRUL_mex, ci_mex newState_mex] = degradationRULPreserveState_mex (testData, restoreStateFlag savedState);
例如,比较MATLAB函数和生成的MEX文件得到的估计RUL。
estRUL ci
estRUL = 113.8920
ci =1×283.0901 - 172.5393
estRUL_mex, ci_mex
estRUL_mex = 113.8920
ci_mex =1×283.0901 - 172.5393
现在,您可以将生成的代码用作已部署系统的一部分,以预测剩余的使用寿命。储存…的价值newState
在需要重新启动系统时使用。例如,取下一个数据点linTestData1
然后用它来更新预测,首先newState_mex
,这是在前面对MEX文件的调用中生成的模型状态。
: testData2 = linTestData1(4日);[estRUL2_mex, ci2_mex newState2_mex] = degradationRULPreserveState_mex (testData2, restoreStateFlag newState_mex);estRUL2_mex, ci2_mex
estRUL2_mex = 104.4336
ci2_mex =1×277.8216 - 154.1263
注意,MATLAB函数和MEX文件各自管理自己的持久变量。因此,MEX文件的值为mdl
现在从合并更新testData2
,其函数值mdl
没有。要重置这些持久变量的值,请显式地从内存中清除函数和MEX文件。
清晰的degradationRULPreserveState清晰的degradationRULPreserveState_mex
loadRULModelForCoder
|saveRULModelForCoder
|readState
|restoreState