求解 多变量系统的最小二乘辨识问题的推导以及matlab仿真

1.单输入单输出情况的推导;2.两输入两输出情况的推导,并进行matlab仿真以及完成仿真报告。

img

求帮助 可以适量加钱😭

  1. 单输入单输出情况的推导

针对单输入单输出的情况,我们可以将上述系统表示成如下形式:
$$y^{(k)} + a_1 y^{(k-1)} + a_2 y^{(k-2)} = u^{(k)} + b_1 u^{(k-1)} + b_2 u^{(k-2)} + w^{(k)}$$
其中,$$y^{(k)}$$ 是第k个时刻的输出,$$u^{(k)}$$ 是第k个时刻的输入,$$w^{(k)}$$ 是第k个时刻的随机噪声。$$a_1,a_2,b_1,b_2$$ 是待辨识参数。

为了进行最小二乘辨识,我们需要采集N组数据 $$(u^{(k)},y^{(k)})$$,并构造如下矩阵和向量:
$$
\begin{aligned}
Y &= \begin{bmatrix}
y^{(2)} & y^{(1)} \
y^{(3)} & y^{(2)} \
\vdots & \vdots \
y^{(N)} & y^{(N-1)}
\end{bmatrix},
&X &= \begin{bmatrix}
y^{(1)} & u^{(1)} & y^{(0)} & u^{(0)} \
y^{(2)} & u^{(2)} & y^{(1)} & u^{(1)} \
\vdots & \vdots & \vdots & \vdots \
y^{(N)} & u^{(N)} & y^{(N-1)} & u^{(N-1)}
\end{bmatrix},
&\theta &= \begin{bmatrix}
a_1 \ a_2 \ b_1 \ b_2
\end{bmatrix},
&\epsilon &= \begin{bmatrix}
w^{(2)} \ w^{(3)} \ \vdots \ w^{(N)}
\end{bmatrix}
\end{aligned}
$$

其中,$$Y$$ 代表输出矩阵,每行为相邻时刻的输出;$$X$$ 代表设计矩阵,每行为相邻时刻的输入和输出;$$\theta$$ 是参数向量,$$\epsilon$$ 是噪声向量。

带入式子,得到:
$$Y = X\theta+\epsilon$$

最小二乘求解参数向量 $$\theta$$ 的方法为:
$$\theta = (X^TX)^{-1}X^TY$$

  1. 两输入两输出情况的推导

针对两输入两输出的情况,我们可以将上述系统表示成如下形式:
$$
\begin{aligned}
y_1^{(k)} + a_{11}y_1^{(k-1)}+a_{12}y_1^{(k-2)}+a_{21}y_2^{(k-1)}+a_{22}y_2^{(k-2)} &= u_1^{(k)}+b_{11}u_1^{(k-1)}+b_{12}u_1^{(k-2)}+b_{21}u_2^{(k-1)}+b_{22}u_2^{(k-2)}+w_1^{(k)} \
y_2^{(k)} + a_{11}y_2^{(k-1)}+a_{12}y_2^{(k-2)}+a_{21}y_1^{(k-1)}+a_{22}y_1^{(k-2)} &= u_2^{(k)}+b_{21}u_1^{(k-1)}+b_{22}u_2^{(k-2)}+b_{11}u_1^{(k)}+b_{12}u_2^{(k-1)}+w_2^{(k)}
\end{aligned}
$$

其中, $$y_1^{(k)},y_2^{(k)}$$ 分别是第k个时刻的两个输出, $$u_1^{(k)},u_2^{(k)}$$ 分别是第k个时刻的两个输入, $$w_1^{(k)},w_2^{(k)}$$ 分别是第k个时刻的两个随机噪声。 $$a_{11},a_{12},a_{21},a_{22},b_{11},b_{12},b_{21},b_{22}$$ 是待辨识参数。

为了进行最小二乘辨识,我们需要采集N组数据 $$(u_1^{(k)},u_2^{(k)},y_1^{(k)},y_2^{(k)})$$ ,并构造如下矩阵和向量:

$$
\begin{aligned}
Y &= \begin{bmatrix}
y^{(2)} & y^{(1)} \
y^{(3)} & y^{(2)} \
\vdots & \vdots \
y^{(N)} & y^{(N-1)}
\end{bmatrix},
&X &= \begin{bmatrix}
y_1^{(1)} & u_1^{(1)} & y_2^{(1)} & u_2^{(1)} & y_1^{(0)} & u_1^{(0)} & y_2^{(0)} & u_2^{(0)} \
y_1^{(2)} & u_1^{(2)} & y_2^{(2)} & u_2^{(2)} & y_1^{(1)} & u_1^{(1)} & y_2^{(1)} & u_2^{(1)} \
\vdots & \vdots & \vdots & \vdots & \vdots & \vdots & \vdots & \vdots \
y_1^{(N)} & u_1^{(N)} & y_2^{(N)} & u_2^{(N)} & y_1^{(N-1)} & u_1^{(N-1)} & y_2^{(N-1)} & u_2^{(N-1)}
\end{bmatrix},
&\theta &= \begin{bmatrix}
a_{11} \ a_{12} \ a_{21} \ a_{22} \ b_{11} \ b_{12} \ b_{21} \ b_{22}
\end{bmatrix},
&\epsilon &= \begin{bmatrix}
w_1^{(2)} \ w_2^{(2)} \ w_1^{(3)} \ w_2^{(3)} \ \vdots \ w_1^{(N)} \ w_2^{(N)}
\end{bmatrix}
\end{aligned}
$$

其中,$$Y$$ 代表输出矩阵,每行为相邻时刻的输出; $$X$$ 代表设计矩阵,每行为相邻时刻的输入和输出;$$\theta$$ 是参数向量, $$\epsilon$$ 是噪声向量。

带入式子,得到:
$$Y = X\theta+\epsilon$$

最小二乘求解参数向量 $$\theta$$ 的方法与单输入单输出情况类似。

你看下是这样不

多变量系统的最小二乘辨识问题是指通过已知的输入输出数据,估计出系统的参数。其数学模型可以表示为:
$$
y(k)=G(q)u(k)+H(q)e(k)
$$
其中,$y(k)$是系统的输出,$u(k)$是系统的输入,$e(k)$是系统的噪声,$G(q)$和$H(q)$是系统的传递函数,$q$是单位延迟算子。
假设我们已经有了一组已知的输入输出数据$u(k)$和$y(k)$,我们需要估计出$G(q)$和$H(q)$的系数。我们可以将$G(q)$和$H(q)$表示为分子分母多项式的形式:
$$
G(q)=\frac{b(q)}{f(q)}, H(q)=\frac{c(q)}{f(q)}
$$
其中,$b(q)$、$c(q)$和$f(q)$都是多项式,$f(q)$是$G(q)$和$H(q)$的公共分母。
为了估计出$b(q)$、$c(q)$和$f(q)$的系数,我们可以使用最小二乘法。最小二乘法的基本思想是通过最小化误差的平方和,来估计出模型的参数。对于多变量系统的最小二乘辨识问题,误差可以表示为:
$$
e(k)=y(k)-\hat{y}(k)
$$
其中,$\hat{y}(k)$是根据当前的模型参数估计出的输出。
我们可以将$b(q)$、$c(q)$和$f(q)$的系数表示为向量形式:
$$
\theta=[\theta_1,\theta_2,\cdots,\theta_n]^T
$$
其中,$n$是系数的个数。
我们可以将误差的平方和表示为向量形式:
$$
E(\theta)=\sum_{k=1}^{N}e^2(k)=\sum_{k=1}^{N}[y(k)-\hat{y}(k)]^2
$$
我们的目标是最小化误差的平方和$E(\theta)$。为了实现这个目标,我们可以使用梯度下降法或者牛顿法等优化算法,来不断调整参数$\theta$的值,使得误差的平方和最小化。
在Matlab中,我们可以使用lsqnonlin函数来实现最小二乘辨识。具体实现如下:

n = 2;
 % 定义输入输出数据
u = [1, 2, 3, 4, 5]';
y = [1.2, 2.1, 2.8, 4.2, 4.9]';
 % 定义误差函数
fun = @(theta) y - tf(theta(1:n+1), [1, theta(n+2:end)], 1) * u;
 % 初始参数值
theta0 = ones(2*n+1, 1);
 % 调用lsqnonlin函数进行最小二乘辨识
theta = lsqnonlin(fun, theta0);
 % 输出估计的参数值
b = theta(1:n+1);
c = theta(n+2:end);
f = [1, theta(n+2:end)];
 % 输出估计的传递函数
G = tf(b, f, 1);
H = tf(c, f, 1);

在上述代码中,我们首先定义了多项式的阶数$n$,然后定义了输入输出数据$u$和$y$。接着,我们定义了误差函数$fun$,用于计算误差的平方和。在误差函数中,我们使用了tf函数来构造传递函数,然后将其与输入数据$u$相乘,得到估计的输出$\hat{y}$。最后,我们调用lsqnonlin函数进行最小二乘辨识,并输出估计的参数值$b$、$c$和$f$,以及估计的传递函数$G$和$H$。

对于多变量系统的最小二乘辨识问题,推导和仿真涉及较多内容,无法在单个回答中详细展开。我将提供一个大致的步骤和示例代码供参考,但请注意需要进一步学习相关理论知识和根据具体问题进行适当修改和完善。

单输入单输出情况的推导:

假设我们有一个单输入单输出的多变量系统,表示为 y(t) = G(q)u(t) + e(t),其中 y(t) 是输出信号,u(t) 是输入信号,G(q) 是系统传递函数,e(t) 是噪声信号。
使用最小二乘法的思想,我们需要构建一个代价函数 J,用于衡量辨识模型与实际数据之间的差距。一种常用的代价函数是残差平方和,即 J = ∑[y(t) - G(q)u(t)]^2。
将 J 对系统参数进行最小化,可以使用梯度下降等优化算法求解。
两输入两输出情况的推导及Matlab仿真:

对于两输入两输出的情况,系统的传递函数可以表示为一个矩阵形式:Y(q) = G(q)U(q) + E(q),其中 Y(q) 和 U(q) 是输出和输入信号的 Z 变换,G(q) 是系统传递矩阵,E(q) 是噪声信号的 Z 变换。
可以将系统传递矩阵 G(q) 分解为分子多项式矩阵和分母多项式矩阵的比值。
推导的具体步骤可以参考相关的系统辨识理论教材或论文。
在Matlab中,可以使用 System Identification Toolbox 提供的函数进行系统辨识仿真。具体步骤包括:
收集实际的输入输出数据。
构建系统辨识模型对象,如 arx、armax、oe 等。
调用相应的函数,如 arx、armax、oe 等,将输入输出数据传入进行模型辨识。
对辨识结果进行仿真和评估,比较辨识模型与实际数据的拟合程度。
这里提供一个简单的示例代码,用于说明在Matlab中进行最小二乘辨识的基本步骤:

% 生成测试数据
t = linspace(0, 10, 100); % 时间向量
u = sin(t); % 输入信号
y = 2*u + randn(size(t)); % 输出信号,带有高斯噪声

% 构建辨识模型对象
model = arx(1, 1); % 单输入单输出模型

% 进行辨识
sys = estimate(model, y', u');

% 仿真结果
y_sim = lsim(sys, u, t); % 对输入信号进行仿真

% 绘制实际数据和仿真结果
figure;
plot(t, y, 'b', 'LineWidth', 2); % 实际数据
hold on;
plot(t, y_sim, 'r--', 'LineWidth', 1.5); % 仿真结果
xlabel('Time');
ylabel('Output');
legend('Actual', 'Simulation');


这是一个简单的单输入单输出情况的最小二乘辨识示例,你可以根据具体的问题和模型类型进行修改和扩展。同时,你可能需要使用更复杂的模型和数据预处理技术来改进辨识结果。

对于两输入两输出的情况,推导和仿真更加复杂,因此建议阅读相关的系统辨识理论教材或论文,以获得更详细的步骤和示例。


clear all
close all
clc
a=[1 -1.3 0.5]';b=[0.8 0.3]';d=3;  %实际系统参数与纯迟延
na=length(a)-1;nb=length(b)-1;  %%na,nb 为输出输入系数矩阵 A,B 的阶数
L=2000;%仿真长度
uk=zeros(d+nb,1);yk=zeros(na,1);  %输入输出初始化
yk_m=zeros(na,1); %模型输出
u=randn(L,1);  %输入信号,采用方差为1的白噪声序列
xi=sqrt(0.1)*randn(L,1);  %干扰信号,采用方差为0.1的白噪声序列

thetae_1=zeros(na+nb+1,1);  %参数初值
P=10^6*eye(na+nb+1);  %修正系数初值
lambda=0.996;  %遗忘因子范围[0.9 1],遗忘因子=1时,即为标准递推最小二乘

for k=1:L
    if k==801
        a=[1 -1.0 0.3]';b=[0.6 0.2]';  %系统参数突变
    end
    theta(:,k)=[a(2:na+1);b];  %系统参数真值
    
    phi=[-yk;uk(d:d+nb)];  %输出输入矩阵
    phi_e=[-yk_m;uk(d:d+nb)]; %模型输出输入矩阵
    y(k)=phi'*theta(:,k)+xi(k);  %系统实际输出
    y_m(k)=phi_e'*thetae_1; %模型输出
    
    %递推公式
    K=P*phi/(lambda+phi'*P*phi);
    thetae(:,k)=thetae_1+K*(y(k)-phi'*thetae_1);
    P=(eye(na+nb+1)-K*phi')*P/lambda;
    
    %更新数据
    thetae_1=thetae(:,k);
    for i=d+nb:-1:2
        uk(i)=uk(i-1);
    end
    uk(1)=u(k);
    
    for i=na:-1:2
        yk(i)=yk(i-1);
        yk_m(i)=yk_m(i-1);
    end
    yk(1)=y(k);
    yk_m(1)=y_m(k);
end
figure('name','参数a')
plot([1:L],thetae(1:na,:));hold on;plot([1:L],theta(1:na,:),'k:');
xlabel('k');ylabel('参数估计a');
legend('a_1','a_2');axis([0 L -2 1]);
figure('name','参数b')
plot([1:L],thetae(na+1:na+nb+1,:));hold on;plot([1:L],theta(na+1:na+nb+1,:),'k:');
xlabel('k');ylabel('参数估计b');
legend('b_0','b_1');axis([0 L 0 1]);
figure('name','输出')
plot([1:L],y,[1:L],y_m,'r');
legend('实际输出','模型输出');
axis([0 L -10 10]);
grid on;

% 定义输入和输出向量
u = [1, 2, 3, 4; 2, 3, 4, 5; 3, 4, 5, 6; 4, 5, 6, 7];
y = [2, 3; 3, 5; 4, 7; 5, 9];

% 计算系数的最优估计值
X = [ones(size(u,1),1), u];
theta = pinv(X)*y;

% 打印结果
disp(‘模型系数估计值:’);
disp(theta);

% 进行仿真
y_sim = X*theta;

% 绘制输出曲线
t = 1:length(y);
figure;
subplot(2,1,1);
plot(t, y(:,1), ‘b-’, t, y_sim(:,1), ‘r–’);
legend(‘真实值’, ‘估计值’);
xlabel(‘时间’);
ylabel(‘y1’);
subplot(2,1,2);
plot(t, y(:,2), ‘b-’, t, y_sim(:,2), ‘r–’);
legend(‘真实值’, ‘估计值’);
xlabel(‘时间’);
ylabel(‘y2’);

多变量系统的最小二乘辨识问题的推导以及matlab仿真
可以参考下
https://blog.csdn.net/feng1790291543/article/details/131027209

单输入单输出情况的推导如下:

img


.两输入两输出情况的推导如下:

img