授之以渔: 卡尔曼滤波器 ....大泻蜜 .........................

[复制链接]
115005|281
Cortex-M0 发表于 2011-12-8 18:15 | 显示全部楼层
继续听highgear老师上课~~~
 楼主| highgear 发表于 2011-12-8 21:46 | 显示全部楼层
第一个例子中的代码



  1. Ts = 1;                    采样时间
  2. s = tf('s');
  3. sysc = 100/(60*s +1);      真实系统的传递函数
  4. sysd = c2d(sysc, Ts);

  5. t = 0:TsTs*300);
  6. u = ones(1, length(t));     系统输入
  7. ys = lsim(sysd, u, t, 0);   系统输出
  8. ys = ys + 10*rand(size(ys));  测量量 = 系统输出 + 噪声

  9. A = [1, 0; 0, 1];
  10. B = [1; 0];
  11. C = [1, 0];
  12. N = length(A);          系统维数
  13. Len = length(u);

  14. yout = zeros(Len, 1);   滤波器输出
  15. Xh = zeros(N, 1);       状态变量
  16. P = eye(N);              
  17. Q = 2 * eye(N);         系统噪声
  18. R = 50;                 测量噪声
  19. for i = 1 : Len
  20.     Xh = A*Xh + B*u(i);
  21.     P = A*P*A' + Q;
  22.     K = P*C'* inv(C*P*C' + R);
  23.     Xh = Xh + K*(ys(i) - C*Xh);
  24.     P = P - K*C*P;
  25.     yout(i) = C*Xh;
  26. end
  27. Ts = 1;                    采样时间
  28. s = tf('s');
  29. sysc = 100/(60*s +1);      真实系统的传递函数
  30. sysd = c2d(sysc, Ts);

  31. t = 0:Ts:(Ts*300);
  32. u = ones(1, length(t));     系统输入
  33. ys = lsim(sysd, u, t, 0);   系统输出
  34. ys = ys + 10*rand(size(ys));  测量量 = 系统输出 + 噪声

  35. A = [1, 0; 0, 1];
  36. B = [1; 0];
  37. C = [1, 0];
  38. N = length(A);          系统维数
  39. Len = length(u);

  40. yout = zeros(Len, 1);   滤波器输出
  41. Xh = zeros(N, 1);       状态变量
  42. P = eye(N);              
  43. Q = 2 * eye(N);         系统噪声
  44. R = 50;                 测量噪声
  45. for i = 1 : Len
  46.     Xh = A*Xh + B*u(i);
  47.     P = A*P*A' + Q;
  48.     K = P*C'* inv(C*P*C' + R);
  49.     Xh = Xh + K*(ys(i) - C*Xh);
  50.     P = P - K*C*P;
  51.     yout(i) = C*Xh;
  52. end

  53. plot(t, ys, t, yout);


, t, yout);
 楼主| highgear 发表于 2011-12-8 21:50 | 显示全部楼层
使用最小二乘法例子的代码:


  1. Ts = 1;               采样时间
  2. s = tf('s');
  3. sysc = 100/(60*s +1);   真实系统的传递函数
  4. sysd = c2d(sysc, Ts);

  5. t = 0:Ts:(Ts*300);
  6. u = ones(1, length(t));   系统输入
  7. ys = lsim(sysd, u, t, 0); 系统输出
  8. ys = ys + 10*rand(size(ys)); 测量量 = 系统输出 + 噪声

  9. [numd, dend] = LeastSquare(u, ys, 3);   最小二乘法获取预测系统模型
  10. [A, B, C, D] = tf2ss(numd, dend);       变换到状态空间形式
  11. Len = length(u);
  12. N = length(A);         系统维数

  13. yout = zeros(Len, 1);  滤波器输出
  14. Xh = zeros(N, 1);      状态变量
  15. P = eye(N);
  16. Q = 0.02 * eye(N);     系统噪声
  17. R = 50;                测量噪声
  18. for i = 1 : Len
  19.     Xh = A*Xh + B*u(i);
  20.     P = A*P*A' + Q;

  21.     K = P*C'* inv(C*P*C' + R);
  22.     Xh = Xh + K*(ys(i) - C*Xh);
  23.     P = P - K*C*P;
  24.     yout(i) = C*Xh;
  25. end

  26. plot(t, ys, t, yout);


超过 100 楼则公布如何通过输入输出获取系统模型的最小二乘法程序
Cortex-M0 发表于 2011-12-9 08:27 | 显示全部楼层
顶~~~

继续听highgear老师上课~~~
Cortex-M0 发表于 2011-12-9 08:28 | 显示全部楼层
有钱出钱
Cortex-M0 发表于 2011-12-9 08:28 | 显示全部楼层
有力出力
Cortex-M0 发表于 2011-12-9 08:29 | 显示全部楼层
没本事的多灌灌水
Cortex-M0 发表于 2011-12-9 08:29 | 显示全部楼层
多顶顶highgear老师之贴
Cortex-M0 发表于 2011-12-9 08:30 | 显示全部楼层
多听听highgear老师上课
lxyppc 发表于 2011-12-9 08:30 | 显示全部楼层
100楼太容易了
Cortex-M0 发表于 2011-12-9 10:18 | 显示全部楼层
LS盆友正解~~~

这该上1000楼才对~~~ :lol
DownCloud 发表于 2011-12-9 10:50 | 显示全部楼层
100楼,必须的。
skyfight 发表于 2011-12-9 11:01 | 显示全部楼层
不错,支持一下
DreamNk 发表于 2011-12-9 11:14 | 显示全部楼层
pidcontrol 发表于 2011-12-9 12:44 | 显示全部楼层
精彩精彩
xxmmtt 发表于 2011-12-9 13:46 | 显示全部楼层
Periodic 发表于 2011-12-9 15:02 | 显示全部楼层
高深 目前还是听不大 懂  功底不太好
Periodic 发表于 2011-12-9 15:03 | 显示全部楼层
呵呵 没有钱出力
Periodic 发表于 2011-12-9 15:04 | 显示全部楼层
21家 上 谈技术的 热情 大不如前了啊 !!现在 才 79楼
Cortex-M0 发表于 2011-12-9 15:28 | 显示全部楼层
80楼 :victory:
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部