基于数据驱动的 Koopman 算子的递归神经网络模型线性化,用于纳米定位系统的预测控制研究(Matlab代码实现)

 💥💥💞💞欢迎来到本博客❤️❤️💥💥

🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。

⛳️座右铭:行百里者,半于九十。

📋📋📋本文目录如下:🎁🎁🎁

目录

💥1 概述

📚2 运行结果

2.1 比较使用泰勒级数和Koopman算子进行线性化的准确性

2.2 预测控制,使用Koopman算子进行线性化,一个线性模型

2.3 预测控制,使用Koopman算子进行线性化,两个线性模型

2.4 预测控制,使用泰勒级数进行线性化

🎉3 参考文献

🌈4 Matlab代码、数据、文章


💥1 概述

文献来源:

摘要:
最近的研究表明,纳米定位系统(例如压电致动器(PEAs))的非线性动力学可以被循环神经网络(RNNs)准确捕捉。这项技术的一个直接应用是用于精密定位的PEA系统控制:将非线性RNN模型线性化,然后应用模型预测控制(MPC)。然而,由于常用的线性化方法(例如泰勒级数),所得到的线性系统仅在线性化点的小邻域内保证准确,因此控制带宽和控制性能相当有限。为了解决这个问题,我们提出了一种基于Koopman算子的线性化方法,然后使用所得到的线性参数变化模型进行预测控制。这种线性化方案可以显著减少MPC预测范围内的整体逼近误差,从而提高跟踪性能。我们通过两个应用验证了提出的方法——PEA的轨迹跟踪和原子力显微镜纳米压痕过程中聚合物的变形控制。

由于压电致动器(PEAs)的频率和幅度依赖非线性,设计宽带、高精度和计算效率高的实时控制器具有挑战性[1],[2]。虽然迭代学习或重复控制可以实现对PEA的高带宽和高精度控制[3],[4],但它们不是实时控制器,即不能用于跟踪非周期性轨迹。困难在于获得具有小建模不确定性的高带宽模型。线性模型已广泛用于PEA跟踪,如滑模控制[5]、主动干扰抑制控制[6]等。然而,报告的控制带宽较低,通常小于100Hz,尤其在高频区域,精度不尽如人意。由于PEA系统本质上是非线性的,自然而然地使用非线性模型来捕捉系统动态。倒置模型,如Prandtl-Ishlinskii模型[7]、铁磁材料磁滞模型[8],已被用于补偿非线性。然而,建模带宽仍然有限。

最近,神经网络已被提出用于PEA系统动力学建模[9],[10]。其中,循环神经网络(RNN)是一种能够以更高准确性模拟非线性PEA动态的方法[10],基于它的非线性模型预测控制器的控制带宽可以达到数百Hz。然而,这种非线性模型预测控制器在计算上成本高且难以处理,因为必须解决一个非线性优化问题(通常是非凸的)。因此,本文关注改进基于RNN模型的控制器的计算效率。

另一种选择是通过线性化原始非线性系统来避免非线性优化问题。泰勒级数在非线性系统线性化中被广泛使用[13]。然而,缺点是近似精度仅在线性化点的小邻域内得到保证。因此,随着预测范围的增加,建模不确定性将增加,从而限制MPC的性能。反馈线性化和平坦性也可用于线性化,但它们对于一般非线性系统并不有效[14],[15]。其他选项包括Carleman线性化、“polyflow”和Koopman算子方法[16]–[18]。在这些方法中,只有Koopman方法是数据驱动的[19],[20]。

详细文章见第4部分。

📚2 运行结果

2.1 比较使用泰勒级数和Koopman算子进行线性化的准确性

2.2 预测控制,使用Koopman算子进行线性化,一个线性模型

2.3 预测控制,使用Koopman算子进行线性化,两个线性模型

2.4 预测控制,使用泰勒级数进行线性化

部分代码:

%simN=900;
%add a weight matrix We for the tracking error
dwe=1-(1:Nh)/Nh+0.1;
We=diag(dwe.^2);
We=eye(Nh);
for k=1:simN
    %system dynamics
    betak=bxn(1:Nf);
    xk=bxn(Nf+1:Nf+Nrnn);
    etak=bxn(Nf+Nrnn+1:end);
    
%     uk(k)=(y1range(2)-y1range(1))/(x1range(2)-x1range(1))*(uk(k)-x1range(1))+y1range(1);
    tmp=Cbar*betak/scale;
    bxn=[Abar*betak+Bbar*uk(k);
        tanh(W1*xk+B2+B1*tmp);
         Ae*etak+scale*Be*(W2*xk+B3)]+Gall*ek1;    
    yk(k)=Call*bxn+ek1;
    ek1=measn(k)*0;
    
    %state estimation
    %Sigma points
    sqrtPk=chol(Pk,'lower');%cholesky factorization
    xi=[xkhat repmat(xkhat,1,Nall)+gamma*sqrtPk repmat(xkhat,1,Nall)-gamma*sqrtPk];
    %Time update
    uk_1=uk(k);
    betaki=xi(1:Nf,:);
    xki=xi(Nf+1:Nf+Nrnn,:);
    etaki=xi(Nf+Nrnn+1:end,:);
    tmp=Cbar*betaki/scale;
    xikk_1=[Abar*betaki+repmat(Bbar*uk_1,1,2*Nall+1);
            tanh(W1*xki+repmat(B2,1,2*Nall+1)+B1*tmp);
            Ae*etaki+scale*Be*(W2*xki+B3)]+repmat(Gall*ek,1,2*Nall+1);
    xkhat_=sum(xikk_1*WimMat,2);
    Pk_=Rv;
    for k1=1:2*Nall+1
        Pk_=Pk_+WicMat(k1,k1)*( (xikk_1(:,k1)-xkhat_)*(xikk_1(:,k1)-xkhat_)' );
    end
    ykk_1=Call*xikk_1;%row vector
    ykhat_=sum(ykk_1*WimMat);%scalar
    %Measurement update    
    Pykayka=Rn;%yka means yk with ~ above
    for k1=1:2*Nall+1
        Pykayka=Pykayka+WicMat(k1,k1)*( (ykk_1(:,k1)-ykhat_)*(ykk_1(:,k1)-ykhat_)' );
    end
    Pxkyk=zeros(Nall,1);
    for k1=1:2*Nall+1
        Pxkyk=Pxkyk+WicMat(k1,k1)*( (xikk_1(:,k1)-xkhat_)*(ykk_1(:,k1)-ykhat_)' );
    end
    Kk=Pxkyk/Pykayka;%Pxkyk*inv(Pykayka)

🎉3 参考文献

文章中一些内容引自网络,会注明出处或引用为参考文献,难免有未尽之处,如有不妥,请随时联系删除。

[1] Xie, Shengwen, and Juan Ren. "Recurrent-neural-network-based Predictive Control of Piezo Actuators for Trajectory Tracking." IEEE/ASME Transactions on Mechatronics (2019).
[2] Xie, Shengwen, and Juan Ren. "Linearization of Recurrent-neural-network-based models for Predictive Control of Nano-positioning Systems using Data-driven Koopman Operators" IEEE Access (2020). DOI:10.1109/ACCESS.2020.3013935.

🌈4 Matlab代码、数据、文章

We consider the application of Koopman theory to nonlinear partial differential equations. We demonstrate that the observables chosen for constructing the Koopman operator are critical for en- abling an accurate approximation to the nonlinear dynamics. If such observables can be found, then the dynamic mode decomposition (DMD) algorithm can be enacted to compute a finite-dimensional approximation of the Koopman operator, including its eigenfunctions, eigenvalues and Koopman modes. We demonstrate simple rules of thumb for selecting a parsimonious set of observables that can greatly improve the approximation of the Koopman operator. Further, we show that the clear goal in selecting observables is to place the DMD eigenvalues on the imaginary axis, thus giving an objective function for observable selection. Judiciously chosen observables lead to physically interpretable spatio-temporal features of the complex system under consideration and provide a connection to manifold learning methods. Our method provides a valuable intermediate, yet inter- pretable, approximation to the Koopman operator that lies between the DMD method and the com- putationally intensive extended DMD (EDMD). We demonstrate the impact of observable selection, including kernel methods, and construction of the Koopman operator on several canonical, nonlinear PDEs: Burgers’ equation, the nonlinear Schrödinger equation, the cubic-quintic Ginzburg-Landau equation and a reaction-diffusion system. These examples serve to highlight the most pressing and critical challenge of Koopman theory: a principled way to select appropriate observables
下面是一个基于Koopman算子控制预测MATLAB示例代码: ```matlab % 定义非线性系统的动力学方程 function dxdt = f(x) dxdt = [x(1) + 0.1 * x(1) * x(2); x(2) - 0.1 * x(1) * x(2)]; end % 定义Koopman算子的RBF核参数 rbf_sigma = 0.2; rbf_n_components = 100; % 生成训练数据 train_x = rand(500, 2) * 2 - 1; % 计算Koopman算子的RBF特征 rbf_features = rbf_kernel(train_x, train_x, rbf_sigma); train_features = rbf_kernel(train_x, train_x, rbf_sigma, rbf_features); % 计算Koopman算子的逆矩阵 K_inv = pinv(train_features); % 定义控制变量 u = [0.5; 0.5]; % 定义初始状态 x = [0.1; 0.1]; % 执行控制循环 for i = 1:10 % 计算状态演化 x_feature = rbf_kernel(x, train_x, rbf_sigma, rbf_features); x_koopman = K_inv * x_feature; x = f(x) + u * i - x_koopman'; % 输出当前状态 fprintf('x_%d = %f %f\n', i, x(1), x(2)); end % 执行预测循环 x_predict = [0.1; 0.1]; for i = 1:10 % 计算状态演化 x_feature = rbf_kernel(x_predict, train_x, rbf_sigma, rbf_features); x_koopman = K_inv * x_feature; x_predict = f(x_predict) + u * i - x_koopman'; % 输出预测状态 fprintf('x_predict_%d = %f %f\n', i, x_predict(1), x_predict(2)); end % 定义RBF核函数 function K = rbf_kernel(X1, X2, sigma, K_prev) if nargin < 4 K_prev = []; end if isempty(K_prev) n1 = size(X1, 1); n2 = size(X2, 1); norm1 = sum(X1.^2, 2); norm2 = sum(X2.^2, 2); K = norm1 * ones(1, n2) + ones(n1, 1) * norm2' - 2 * X1 * X2'; K = exp(-K / (2 * sigma^2)); else n1 = size(X1, 1); n2 = size(X2, 1); norm1 = sum(X1.^2, 2); norm2 = sum(X2.^2, 2); K = norm1 * ones(1, n2) + ones(n1, 1) * norm2' - 2 * X1 * X2'; K = exp(-K / (2 * sigma^2)) * K_prev; end end ``` 在这个示例代码中,我们首先定义了一个非线性系统的动力学方程f(x),表示状态向量x的演化。然后定义了Koopman算子的RBF核参数,生成了训练数据train_x,计算了Koopman算子的逆矩阵K_inv。接下来,我们执行了一个控制循环,每次循环中计算状态向量x的演化,并输出当前状态。在控制循环后,我们执行了一个预测循环,每次循环中计算状态向量x_predict的演化,并输出预测状态。在控制预测循环中,我们使用了Koopman算子的逆矩阵K_inv来将状态向量转化为Koopman空间中的向量,然后再进行计算和控制/预测。为了计算Koopman算子的RBF特征,我们还定义了一个RBF核函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值