版权声明:本文为博主原创文章,未经博主允许不得转载。https://blog.csdn.net/weixin_38451800/article/details/85721991

从试验工况到建模离散化,再到模型参数辨识,再到最简单的卡尔曼,比如扩展卡尔曼和自适应卡尔曼,接下来,我们如果专注于算法方面的话,自然到Sigma点滤波,这其中包括前几篇博客中我就提到的无迹卡尔曼UKF,中心差分卡尔曼CDKF,容积卡尔曼CKF以及粒子滤波PF,粒子滤波某种程度上也可以看成一种Sigma点滤波器。
  再然后呢,当然就到了神经网络(BP,RBF或者Hopfield等)和模糊控制。很不幸的是,到BP前除了我先前说的CKF博主不做,其他都做过。这之间的辛苦当然别人是无法理解的喜悦同样是。好了,回到正题,本小节接着上节开始谈无迹卡尔曼滤波UKF
备注:这里面还有几本测试手册,比如USABC,PNGV,QCT897-2011等,有人需要的话,你可以自行网上下载,也可以留言我看到会分享的;还有一些测试设备方面我也可以开博客介绍一下,毕竟这边好多报价单了,就是贵的都买不起,尴尬)

1.前言
  博主个人建议无迹卡尔曼学习方面还是上节提到的黄小平老师的《卡尔曼滤波原理及应用-MATLAB仿真》,另外加上几篇优秀硕博毕业论文就好。所以,本小节就不一一介绍无迹卡尔曼滤波的原理和具体实施步骤了。

2.编程
  编程方面,博主会附上自己的无迹卡尔曼Matlab源代码,主要应用于二阶等效模型锂离子电池SOC估算,其中总的框架你们直接用就好了,实验数据要带入你们自己的,然后改模型初始值以及一些对应参数便可。但是博主还是舍不得,毕竟有师弟要交换或者是money我都没有同意(都是自己手敲的,应用面就这么窄觉得不值得),放在CSDN上面也是一笔不少的C币收入。还是算了吧,放个基本的UKF的吧。

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  无迹Kalman滤波(UKF)在锂电池SOC估计中的应用
%  等效电路模型:二阶等效电路模型
%  递推最小二乘法参数识别
%  编程人:a往南向北,日期:2017/08/11
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clear all;close all;clc;
%1.1 加载放电电流电压数据
load consu11;              %带入充放电电流数据
load voltage11;            %带入对应的电压数据
u=consu2;
vol=voltage2;
%1.2 拟合出ocv-soc曲线关系
soc=;
uoc=;
p1=polyfit(soc,uoc,6);
%%2 定义一些初始变量
T=;                                          %采样时间
a=1;                                         %电流系数
b=1;                                         %温度系数
q=;                                          %电池容量(安秒)
qr=1;                                        %电池容量系数
N=;                                          %总的采样次数
X=zeros(3,N);                                % 目标真实值
X(:,1)=[,,];                                 %目标初始值,取soc0=1,uc0=0;
Z=zeros(1,N);                                %观测值即端电压值
delta_w=1e-6;                                %如果增大这个参数,目标真实轨迹就是曲线
Q=delta_w*[1,0,0;
0,1,0;0,0,1];                                %过程噪音均值
R=0.01;                                      %观测噪音方差
%2.1 载入最小二乘法辨识的电阻和电容值
r0=;
r1=;
r2=;
c1=;
c2=;
%2.2 确定状态方程及其中矩阵
A=[1,0,0;
0,exp(-T/r1/c1),0;0,0,exp(-T/r2/c2)];                             %状态转移矩阵
B=[-1*a*b*T/q/qr;
r1*(1-exp(-T/r1/c1));r2*(1-exp(-T/r2/c2))];                       %过程噪音驱动矩阵
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%3 画出目标真实轨迹曲线
v=sqrtm(R)*randn(1,N);
for t=2:NX(:,t)=A*X(:,t-1)+B*u(t-1)+sqrtm(Q)*randn(3,1);               %安时积分法估计soc的曲线
end
for t=1:Nsoc(t)=X(1,t);                            uoc(t)=polyval(p1,soc(t));Z(t)=uoc(t)-r0*u(t)-X(2,t)-X(3,t)+v(t);                       %对目标的观测
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%4 UKF滤波算法,UT变换
L=3;                                          %状态向量维数
alpha=0.01;                                   %控制采样点分布状态
kalpha=0;                                     %待选参数,确保半正定
belta=2;                                      %非负权系数,合并高阶项动差,把高阶项影响包括
ramda=3*alpha^2-L;                            %缩放比例参数,降低总的预测误差
for j=1:2*L+1Wm(j)=1/(2*(L+ramda));Wc(j)=1/(2*(L+ramda));
end
Wm(1)=ramda/(L+ramda);                         %均值权值计算
Wc(1)=1/(L+ramda)+1-alpha^2+belta;             %方差权值计算
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Xukf=zeros(3,N);
Xukf(:,1)=X(:,1);                              %无迹Kalman滤波状态初始化
P0=1e-2*[1,0,0;
0,1,0;0,0,1];                                  %协方差阵初始化
for t=2:Nxestimate= Xukf(:,t-1);P=P0;%第一步:获得一组Sigmma点集cho=(chol(P*(L+ramda)))';                  %chol用于对矩阵进行cholesky分解for k=1:LxgamaP1(:,k)=xestimate+cho(:,k);xgamaP2(:,k)=xestimate-cho(:,k);endXsigma=[xestimate,xgamaP1,xgamaP2];         %Sigma点集%第二步:对Sigma点集进行一步预测for k=1:2*L+1Xsigmapre(:,k)=A*Xsigma(:,k)+B*u(t-1);    %t-1时刻,状态方程预测end%第三步:利用第二步的结果计算均值和协方差Xpred=zeros(3,1);                             %均值for k=1:2*L+1Xpred=Xpred+Wm(k)*Xsigmapre(:,k);endPpred=zeros(3,3);                             %协方差阵预测for k=1:2*L+1Ppred=Ppred+Wc(k)*(Xsigmapre(:,k)-Xpred)*(Xsigmapre(:,k)-Xpred)';endPpred=Ppred+Q;        %第四步:根据预测值,再一次使用UT变换,得到新的Sigma点集chor=(chol((L+ramda)*Ppred))';for k=1:LXaugsigmaP1(:,k)=Xpred+chor(:,k);XaugsigmaP2(:,k)=Xpred-chor(:,k);endXaugsigma=[Xpred XaugsigmaP1 XaugsigmaP2];%第五步:观测预测for k=1:2*L+1                                  %观测预测soc=Xaugsigma(1,k);Zsigmapre(1,k)=polyval(p1,soc)-Xaugsigma(2,k)-Xaugsigma(3,k)-r0*u(t);end%第六步:计算观测预测均值和协方差Zpred=0;for k=1:2*L+1Zpred=Zpred+Wm(k)*Zsigmapre(1,k);endPzz=0;for k=1:2*L+1
Pzz=Pzz+Wc(k)*(Zsigmapre(1,k)-Zpred)*(Zsigmapre(1,k)-Zpred)';endPzz=Pzz+R;Pxz=zeros(3,1);for k=1:2*L+1
Pxz=Pxz+Wc(k)*(Xaugsigma(:,k)-Xpred)*(Zsigmapre(1,k)-Zpred)';end Zukf(1,1)=Z(1,1);Zukf(1,t)=Zpred;%第七步:计算卡尔曼增益K=Pxz*inv(Pzz);%第八步:状态和方差更新xestimate=Xpred+K*(vol(t)-Zpred);P=Ppred-K*Pzz*K';P0=P;Xukf(:,t)=xestimate;%%%5安时积分法估计socsocAH(1)=X(1,1)-u(1)*T/q;socAH(t)=socAH(t-1)-u(t)*T/q;
end
%%5 误差分析
for i=1:NErr_KalmanFilter(1,i)=socAH(i)-Xukf(1,i);
end%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%6 画图略

3.调参
调参,我在上节中就已提到,从算法的角度来看,分两个方面:(1)算法的初始参数,比如初值SOC、初始协方差、Q和R等;(2)模型等效模型输入方式,目前主要有两种方式,一种是拟合关系的形式,一种是分段代入的形式,还有的是ocv-soc拟合关系精度问题;(3)当然最后一个是最重要的就是UT变换中参数怎么定问题,很多人甚至都出现了协方差非半正定问题,这个解决方法是有的,而且挺多,经验运气成分占比都有一些。

以上是我自己算法中,给出的一种参考值,每个参数的具体意义我也都具体标明。这个真的靠经验,你要尝试找规律,多尝试,感觉不能再说了,哈哈哈,具体问题咱在具体分析吧。

无迹卡尔曼滤波UKF_代码及调参(2)相关推荐

  1. 手把手写深度学习(18):finetune微调CLIP模型的原理、代码、调参技巧

    前言:在前面的博客<手把手写深度学习(16):用CILP预训练模型搭建图文检索系统/以图搜图/关键词检索系统>中介绍了如何在图文检索.以图搜图.关键词检索等任务中使用CLIP.这篇博客重点 ...

  2. 提升机器算法LightGBM(图解+理论+增量训练python代码+lightGBM调参方法)

    LightGBM是个快速的,分布式的,高性能的基于决策树算法的梯度提升框架.可用于排序,分类,回归以及很多其他的机器学习任务中. 在竞赛题中,我们知道XGBoost算法非常热门,它是一种优秀的拉动框架 ...

  3. 【哈工大版】Dynamic ReLU:Adaptively Parametric ReLU及Keras代码(调参记录26)Cifar10~95.92%

    本文介绍哈工大团队提出的一种动态ReLU(Dynamic ReLU)激活函数,即自适应参数化ReLU激活函数,原本是应用在基于一维振动信号的故障诊断,能够让每个样本有自己独特的ReLU参数,在2019 ...

  4. 【哈工大版】动态ReLU:自适应参数化ReLU及Keras代码(调参记录11)

    本文介绍哈工大团队提出的一种动态ReLU(Dynamic ReLU)激活函数,即自适应参数化ReLU激活函数,原本是应用在基于一维振动信号的故障诊断,能够让每个样本有自己独特的ReLU参数,在2019 ...

  5. 基于scikit-learn的梯度提升树GBDT调参学习

    写在前面 昨天学习了GBDT的基本原理及算法,关键是考虑了损失函数为一般函数的时候采用了负梯度下降的策略,并引入了残差拟合来学习叶子结点,最终得到一颗回归树.当然,纸上谈兵是没有用的,最重要的还是要把 ...

  6. 天池工业蒸汽量预测-模型调参

    本文改编自<阿里云天池大赛赛题解析-机器学习篇>工业蒸汽量预测的模型调参.进行了部分素材的替换和知识点的归纳总结.新增了Datawhale8月集成学习中的网格搜索.随机搜索的内容 上一篇工 ...

  7. 深度学习学习率(lr)调参

    一.learning rate 简述 lr全称learning rate(一下简称lr),是机器学习和深度学习中最为重要的超参数之一,会影响模型训练结果的好坏,有时候甚至会直接导致整个模型无法使用. ...

  8. 万字长文总结机器学习的模型评估与调参 | 附代码下载

    作者 | Sebastian Raschka 翻译&整理 | Sam 来源 | SAMshare 目录 一.认识管道流 1.1 数据导入 1.2 使用管道创建工作流 二.K折交叉验证 2.1 ...

  9. 机器学习模型调参指南(附代码)

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 导读 ML工作流中最困难的部分之一是为模型找到最好的超参数.ML模 ...

最新文章

  1. vc++64位系统下long的长度为4个字节_64位系统究竟牛逼在哪里?
  2. Java -jar启动服务与Tomcat服务器上部署JAR之间的区别
  3. Mysql学习(三)之数据库管理工具Navicat
  4. c++ 返回数组中最大的值_4个代码块教您如何在C中动态分配2D数组
  5. Vivado HLS基本应用
  6. 华硕首款平板电脑周五开售
  7. mysql 逻辑备份导入数据库_mysql逻辑备份(mysql dump的使用)
  8. 数字化方法基础(二)_点的投影
  9. [转]Linux下Nagios的安装与配置
  10. CAD迷你看图 for Mac(强大的cad看图软件)
  11. 通过描述系统的微分方程,判断系统是否为线性系统以及是定常系统还是时变系统
  12. java 报表系统源码_常用的6款Java开源报表制作工具
  13. pdf怎么解除限制?如何解密?一步解决
  14. 公共DNS递归服务器(转发)
  15. 查看git brach_Excel Go Brach – Excelebrations
  16. html粒子特效图片切换,javascript转换静态图片,增加粒子动画效果
  17. 约翰·亨尼斯(John Hennessy)—斯坦福大学-美国斯坦福大学校长介绍
  18. Verilog语言要素(三)
  19. iphone中按Home键退出程序
  20. web前端零基础html5

热门文章

  1. EasyUi 手机号码,邮箱,remote验证
  2. macbook pro 怎么打大写字母
  3. 骑行运动耳机哪个好,骑行听歌必备的几款运动耳机推荐
  4. Hbase安装~Hbase安装过程中常见的问题
  5. sim卡没坏但苹果手机无服务_工信部为啥要喊你设置SIM卡密码?如何设置(安卓苹果都有了)|工信部|手机|安卓|安卓手机|iphone...
  6. 恢复微信撤回的图片(不容root,极其简单)
  7. 单灯闪烁c语言程序,51单片机,C语言编程,控制指示灯闪烁的频率
  8. 【软件设计】如何画时序图
  9. ESP32开发-LVGL显示图片
  10. 详细的网络安全基础,一篇文章统统告诉你