👨‍🎓个人主页:研学社的博客    

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

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

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

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

目录

💥1 概述

📚2 运行结果

🎉3 参考文献

🌈4 Matlab代码实现


💥1 概述

实际中的大多数系统均为非线性系统,而 Koopman 算子可以描述非线性系统的可观测状态量在高维空间中的线性演化过程,可以将非线性问题转化为线性问题,对于非线性系统的研究有较大的价值。利用Koopman 算子理论,可以仅依靠实验数据或系统仿真数据建立非线性系统的线性模型,基于该模型可实现对非线性系统的分析、预测和控制[6]

如图 2.1 所示,原系统所在空间为 R ,且以非线性方式演进。通过观测函数 g ( x ) 将原系统转换至无穷维空间 H ,在 H 中系统通过 K 线性演进。 Koopman 算子理论的实质是通过对原系统进行坐标转换实现非线性系统的全局线性化,其中Koopman 算符是无穷维度的且满足:

 

不失一般性,无论对于自治系统还是受控系统,基于 Koopman 算子理论建模的主要目标均是将Koopman 算子(广义 Koopman 算子)近似成一个有限维矩阵,它蕴含了非线性系统在高维空间中随时间线性演化的过程;对于控制系统,该有限维矩阵可以表示在高维空间中控制量对系统演化的影响。

为了识别杜宾汽车模型的非线性动力学,我们使用Koopman算子理论首先从系统的仿真中提升数据,利用这些提升的数据来识别Koopman空间中的线性系统,然后恢复我们原始动力学的非线性向量场。还可以设置并运行Dubins汽车模型的模拟。可以在文件的“设置'部分中更改此模拟的参数。 

使用估计的Koopman算子和估计的非线性向量场,我们需要验证系统识别的结果。我们从原始Dubins汽车模拟中使用的初始条件开始,然后在Koopman空间中迭代推进汽车的动力学。然后使用Koopman动力学的提升状态采恢复非线性系统的状态(给定有关我们基函数的知识),然后将我们估计的非线性系统的这种状态序列与系统的实际动力学进行比较。
 

📚2 运行结果

 

主函数代码:

clc
clear all
close all

%% 1. SIMULATION SETUP
% Simulation Parameters
obj.T = 25;                             % Simulation time
obj.dt = 0.01;                          % Sample time
obj.initial_conditions = [10, -5, 2];     % Sim initial condition
obj.velocity_limit = 1;                 % Limit for velocity input
obj.omega_limit = 10;                   % Limit for omega input
obj.seed = 1;                           % Random seed for input generation
     
%% 2. COLLECT DATA
[t, x, u] = simulate(obj);                          % Simulate Dubins Car
plotting('sim_results',x,0,u,obj,t);                  % Plot sim results

%% 3. LIFT DATA
[psi_x, psi_y] = lift_data(x, u);                   % Lift data to Koopman space

%% 4. CALCULATE DISCRETE-TIME KOOPMAN OPERATOR 
% K = pinv(psi_x) * psi_y;                          % Calculate K (Eq. 17)
K = lsqminnorm(psi_x,psi_y);                        % Calculate K (Eq. 17)

%% 5. CALCULATE CONTINUOUS-TIME KOOPMAN OPERATOR
A = 1/obj.dt * logm(K);                             % Calculate A (Eq. 18)

%% 6. CALCULATE NONLINEAR VECTOR FIELD
% Get analytical Jacobian for psi at initial condition
dpsi_dx = [1, 0, 0, 0, 0, 2*x(1,1), x(1,2), 0, x(1,3), 0, 0, u(1,1), 0, 0, 0, u(1,2), 0, 0, 0, 0;
            0, 1, 0, 0, 0, 0, x(1,1), 2*x(1,2), 0, x(1,3), 0, 0, u(1,1), 0, 0, 0, u(1,2), 0, 0, 0;
            0, 0, 1, 0, 0, 0, 0, 0, x(1,1), x(1,2), 2*x(1,3), 0, 0, u(1,1), 0, 0, 0, u(1,2), 0, 0];
        
F = dpsi_dx.' \ A.';                                % Calculate F (Eq. 21)

%% 7. VALIDATE
x_est = validate(F, x, u, t);                       % Rerun sim using F
plotting('validate_results', ...                    % Plot validation results
         x(1:700,:), ...
         x_est(1:700,:), ...
         u(1:700,:), ...
         obj,...
         t(1:700));

🎉3 参考文献

部分理论来源于网络,如有侵权请联系删除。

[1]常欢. 基于Koopman算子的非线性模型预测控制实现策略[D].吉林大学,2022.DOI:10.27162/d.cnki.gjlin.2022.006905.

[2]张统. 基于Koopman算子的全方位移动机械臂建模与轨迹追踪控制研究[D].天津大学,2020.DOI:10.27356/d.cnki.gtjdu.2020.004410.

🌈4 Matlab代码实现

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐