方程误差方法应该有效(假设您的模型与未知系统的阶数相同)。虽然它不如 QRD-RLS 算法高效,但您始终可以使用卡尔曼滤波器来执行递归最小二乘法。
这里有一个开源卡尔曼滤波工具箱。以下是如何解决您提供的示例系统的参数估计问题的示例。
基本思想是将未知系统的输出建模为延迟输出和输入的加权组合(也称为 ARMA 模型)。权重是未知的,因此它们成为卡尔曼滤波器试图估计的状态,而输入和输出形成时变观察矩阵。
clear all
close all
addpath ekfukf
% unknown system
z = tf('z');
unknown_tf = (3.481e-5*z + 3.446e-5)/(z^2 - 1.97*z + 0.9704);
unknown_ss = ss(unknown_tf);
A = unknown_ss.a;
B = unknown_ss.b;
C = unknown_ss.c;
D = unknown_ss.d;
x = zeros(2, 1);
M = 1000; % simulation length
u = randn(M, 1); % vector of observed inputs
y = zeros(M, 1); % initialize output vector
e = zeros(M, 1); % output prediction error
% kalman filter parameters
dim = 4; % number of unknown parameters (2 numerator coeffs, 2 denominator)
F = eye(dim); % state transition matrix
R = 1e-6; % measurement noise variance
Q = 0*eye(dim); % process noise covariance
P = 10*eye(dim); % state-error covariance
alpha = zeros(2, 1); % initial estimate of denominator coefficiens
beta = zeros(2, 1); % initial estimate of numerator coefficients
state = [alpha; beta];
Hu = zeros(2, 1); % observation vector containing observed inputs
Hy = zeros(2, 1); % observation vector containing observed outputs
for k=2:M
% compute kalman filter time-update
[state, P] = kf_predict(state, P, F, Q);
% update observation vectors
Hy = circshift(Hy, 1);
Hy(1) = y(k-1);
Hu = circshift(Hu, 1);
Hu(1) = u(k);
% observe system output
x = A*x + B*u(k);
y(k) = C*x + D*u(k);
% compute kalman filter measurement update
[state, P, K, yfilt, S, likelihood] = kf_update(state, P, y(k), [Hy; Hu]', R);
e(k) = y(k) - yfilt;
end
% exctract numerator and denominator coefficients
alpha = state(1:2);
beta = state(3:4);
% construct numerator and denominator polynomial estimates
est_num = [0, beta'];
est_den = [1, -alpha'];
% plot estimated and true frequency response
W = pi*logspace(-3, 0, 300);
Ghat = freqz(est_num, est_den, W);
G = freqz(unknown_tf.num{1}, unknown_tf.den{1}, W);
semilogx(W./pi, 20*log10(abs(G)), 'k', 'linewidth', 2)
hold on
semilogx(W./pi, 20*log10(abs(Ghat)), 'g')
title('estimated (green) and true (black) magnitude response')
ylabel('magnitude (dB)');
xlabel('normalized frequency');
% plot prediction error
figure
plot(e)
title('prediction error vs. time');
ylabel('error');
xlabel('sample index');
有用!

预测误差(试图预测未知系统的输出)让我们了解模型收敛的速度。收敛速度高度依赖于测量噪声方差。
