matlab代码——非线性最小二乘法使用说明

假如想象 提交于 2019-12-26 01:53:44

前言

在本节中,将解释matlab代码的用法。代码被分为三个部分。(1)用户具体问题的定义。(2)使用matlab预测(3)对展示结果的后处理。不同的算法可以代替第二个部分,这将在后一章解释。只有问题的定义部分才需要针对不同的用途进行修改。这将被进一步的分为两个子部分:变量定义和模型定义。
一旦这两个子部分被完成了,使用者能够获得参数估计的结果,退化和寿命预测。在下面的解释中,line和lines都表明后面给出的matlab code的行数。同样的,i,j,k在matlab代码中分别是样本数,参数和时间的索引。这是个传统对于贝叶斯估计和粒子滤波算法。对于使用NLS的细节描述在下面电池退化的子章中有解释。

问题定义

针对电池退化问题,BATTERY_NLS被用来作为workname,这是结果文件的名字,这个容量每隔5个周期测量一次,因此 C/1cycles 各自被用来 退化单位(DegraUnit) 和时间单位 (TimeUnit)。这个数组time 包含了测量时间和未来时间,并且应该足够长的去进行剩余寿命预测。C/1 容量数据在表格4.1中的被存储在y中,这是一个nyx1的向量。time数组的长度应该比y大,根据4.1.1的失效阈值的定义,0.7被用于thres.ParamName是将被估计的未知参数:模型参数b和测量噪音的标准差。
在第三章中,几个例子被假定知道了测量数据的可变性。实际上,然而,测量数据的可变性通常是不知道的,在参数估计的过程中,这也是可以估计的。在【NLS】的例子中,观察数据的可变性并不在参数估计过程中,而是在后面参数估计后进行了计算。然而,它包含在ParamName是为了是问题的定义与其他算法保持一致。
尽管ParamName是字符串数组,在matlab代码中它将会被用做一个真实的参数名通过使用eval()。因此,参数的名字必须满足matlab中的命名要求。在确定参数名字时,这里有三个注意事项(1)用户可以定义任何作为参数名字,但是参数名字的长度应该和其他的相同。当使用单个字母的时候,不能用ijk,因为这个在matlab代码中已经被使用了。(2)表达模型参数的参数名应该被用在48行的模型等式。(3)测量误差的标准差的参数应该放在最后一行。
当参数的真实值知道时,thetaTure能被用为npx1的向量,如果没有,就把他作为空数组。其余需要的参数是显著性水平signilevel和样本数ns。置信度水平是为了计算置信区间和预测区间。5,2.5和0.5置信区间表示90%,95%和99%的区间。通常,1000~5000样本数被用于ns。5和5000被各自设置为置信区间和ns。

使用非线性最小二乘法来预测

如之前提到的,lsqnonlin被用来去顾及电池模型的参数b。为了使用L-M方法,19行的设置是必须的。优化过程在20行执行,通过目标函数(FUNC)最小,从初始参数(theta0)开始。在FUNC(39-43行),残差向量,在被给的模型参数下{y-z}在ny的所有测量点被计算。为了计算模型的预测值,函数MODLE(44-50行)被使用。48行应该对于不同的模型问题进行修改。matlab函数lsqnonlin建立了目标函数SSE,通过使用残差去最小化他。作为估计过程的输出,参数的确定性估计(thetaH),在该估计参数下的残差(resid),和雅可比矩阵(J)被获得。这些结果被用来预测未来的退化行为和去估计参数的不确定度。
获得参数不确定度的过程在2.4中以样本的形式解释出来。这个过程简短的总结如下:(1)计算SSE,和数据中标准差(21-23)(2)从参数的协方差矩阵(24)中获得参数的标准差(25行)(3)不确定度的分布由确定性的结果和t-随机样本的与标准差乘积相加确定(26,27行)。在计算数据的标准差,dof=ny-np+1在22行中被使用,因为np包含了标准差的参数,而这并不用于估计过程。尽管数据的标准差(sigmaH)是基于估计参数的准确估计,它包含在最后的取样结果(28行)中以便于与其他算法保持一致。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!