GPOPS-II教程(5): 月球探测器着陆最优控制问题

文章目录

  • 问题描述
  • GPOPS代码
    • `main function`
    • `continuous function`
    • `endpoint function`
    • 仿真结果
  • 最后

问题描述

参考文献:[1] Meditch J. On the problem of optimal thrust programming for a lunar soft landing[J]. IEEE Transactions on Automatic Control, 1964, 9(4): 477-484.

考虑一类月球探测器着陆最优控制问题, x x x为月球探测器与月心的矢径,其动力学方程为

{ x ¨ = − k d d t ( ln ⁡   m ) − g , x ˙ = − k ln ⁡ m ( t ) m ( 0 ) − g t + x ( 0 ) . \left \{ \begin{aligned} \ddot x &= - k \frac{\text{d}}{\text{d}t}(\ln \ m) - g,\\ \dot x & = -k \ln{\frac{m(t)}{m(0)}} - g t + x(0). \end{aligned}\right. x¨x˙=kdtd(ln m)g,=klnm(0)m(t)gt+x(0).

x 1 = h x_1 = h x1=h x 2 = v x_2 = v x2=v x 3 = m x_3=m x3=m,可以得到

x ˙ 1 = v , x ˙ 2 = − k x 3 u − g , x ˙ 3 = m , u = m ˙ . \dot x_1 = v,\quad \dot x_2 = -\frac{k}{x_3}u-g,\quad \dot x_3=m,\quad u = \dot m. x˙1=v,x˙2=x3kug,x˙3=m,u=m˙.

性能指标如下:

J = ∫ t 0 t f m ˙ ( t ) d t = m ( 0 ) − m ( t f ) J = \int_{t_0}^{t_f} \dot m(t) \text{d}t = m(0) - m(t_f) J=t0tfm˙(t)dt=m(0)m(tf)

化简之后,月球探测器落地动力学方程为

{ x ˙ 1 = v , x ˙ 2 = u − g . \left \{ \begin{aligned} \dot x_1 &= v,\\ \dot x_2 &= u - g. \end{aligned}\right. {x˙1x˙2=v,=ug.

化简之后的性能指标为

J = ∫ t 0 t f u d t J = \int_{t_0}^{t_f} u \text{d}t J=t0tfudt

GPOPS代码

main function

%% 01.初始参数设置
%-------------------------------------------------------------------------%
%----------------------- 设置问题的求解边界 ------------------------------%
%-------------------------------------------------------------------------%
% 设置时间边界
t0min = 0;
t0max = 0;
tfmin = 0;
tfmax = 10;

% 设置状态初值
h0 = 10;
v0 = -2;
% 设置状态终值
hf = 0;
vf = 0;

% 设置状态边界
hmin = 0;
hmax =  20;
vmin = -10;
vmax =  10;

% 设置控制量边界
umin = 0;
umax = 3;

% 月球重力常数
setup.auxdata.g = 1.6;
%% 02.边界条件设置
%-------------------------------------------------------------------------%
%------------------------ 将求解边界设置于问题中 -------------------------%
%-------------------------------------------------------------------------%
setup.bounds.phase.initialstate.lower = [h0, v0];
setup.bounds.phase.initialstate.upper = [h0, v0];
setup.bounds.phase.state.lower = [hmin, vmin];
setup.bounds.phase.state.upper = [hmax, vmax];
setup.bounds.phase.finalstate.lower = [hf, vf];
setup.bounds.phase.finalstate.upper = [hf, vf];
setup.bounds.phase.control.lower = umin;
setup.bounds.phase.control.upper = umax;
setup.bounds.phase.integral.lower = -100;
setup.bounds.phase.integral.upper = 100;
setup.bounds.phase.initialtime.lower = t0min;
setup.bounds.phase.initialtime.upper = t0max;
setup.bounds.phase.finaltime.lower = tfmin;
setup.bounds.phase.finaltime.upper = tfmax;

%% 03.初值猜测
%-------------------------------------------------------------------------%
%------------------------------- 初值猜想 --------------------------------%
%-------------------------------------------------------------------------%
h_guess = [h0; hf];
v_guess = [v0; vf];
u_guess = [umin; umin];
t_guess = [t0min; 5];
setup.guess.phase.state   = [h_guess, v_guess];
setup.guess.phase.control = u_guess;
setup.guess.phase.time    = t_guess;
setup.guess.phase.integral = 10;

%% 04.设置GPOPS求解器参数
%-------------------------------------------------------------------------%
%---------------------------- 设置求解器参数 -----------------------------%        
%-------------------------------------------------------------------------%
setup.name = 'Moon-Lander-OCP';
setup.functions.continuous  = @mlocpContinuous;
setup.functions.endpoint   	= @mlocpEndpoint;
setup.nlp.solver            = 'ipopt';
setup.derivatives.supplier  = 'sparseCD';
setup.derivatives.derivativelevel = 'second';
setup.mesh.method           = 'hp1';
setup.mesh.tolerance        = 1e-4;
setup.mesh.maxiteration     = 45;
setup.mesh.colpointsmax     = 4;
setup.mesh.colpointsmin     = 10;
setup.mesh.phase.fraction   = 0.1*ones(1,10);
setup.mesh.phase.colpoints  = 4*ones(1,10);
setup.method = 'RPMintegration';
% setup.method = 'RPMdifferentiation';

%% 05.求解
%-------------------------------------------------------------------------%
%----------------------- 使用 GPOPS2 求解最优控制问题 --------------------%
%-------------------------------------------------------------------------%
tic;
output = gpops2(setup);
toc;

%% 06.画图
solution = output.result.solution;

% 状态量
figure('Color',[1,1,1]);
plot(solution.phase.time, solution.phase.state,'-x','LineWidth',1.5);
xlabel('Time',...
       'FontWeight','bold');
ylabel('State',...
       'FontWeight','bold');
legend('Altitude','Velocity')
set(gca,'FontName','Times New Roman',...
        'FontSize',15,...
        'LineWidth',1.3);
print -dpng moonlander_state.png

% 控制量
figure('Color',[1,1,1]);
plot(solution.phase.time, solution.phase.control,'-o','LineWidth',1.5);
xlabel('Time',...
       'FontWeight','bold');
ylabel('Control',...
       'FontWeight','bold');
set(gca,'FontName','Times New Roman',...
        'FontSize',15,...
        'LineWidth',1.3);
print -dpng moonlander_control.png

continuous function

function phaseout = mlocpContinuous(input)
    g = input.auxdata.g;

    t = input.phase.time;
    h = input.phase.state(:,1);
    v = input.phase.state(:,2);
    u = input.phase.control(:,1);

    dh = v;
    dv = -g + u;

    phaseout.dynamics = [dh, dv];
    phaseout.integrand = u;
end

endpoint function

function output = mlocpEndpoint(input)
    J = input.phase.integral;
    output.objective = J;
end

仿真结果

状态量:

在这里插入图片描述

控制量

在这里插入图片描述

最后

欢迎通过邮箱联系我:lordofdapanji@foxmail.com

来信请注明你的身份,否则恕不回信。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/751833.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙 HarmonyOS NEXT星河版APP应用开发-阶段一

一、鸿蒙开发环境搭建 DevEco Studio安装 下载 访问官网:https://developer.huawei.com/consumer/cn/deveco-studio/选择操作系统版本后并注册登录华为账号既可下载安装包 安装 建议:软件和依赖安装目录不要使用中文字符软件安装包下载完成后&#xff0…

怎么打印加密的Excel文件,有哪些方法?

很多小伙伴都喜欢使用Excel来创建或是编辑表格文档,因为Excel中的功能十分的丰富且强大,在Excel中我们可以对表格文档进行各种操作。有的小伙伴可能在打印时需要给每一页表格添加页码,但又不知道该在哪里找到相关操作,其实很简单&…

FFmpeg开发笔记(四十一)结合OBS与MediaMTX实现SRT直播推流

《FFmpeg开发实战:从零基础到短视频上线》一书的“10.2 FFmpeg推流和拉流”提到直播行业存在RTSP和RTMP两种常见的流媒体协议。除此以外,还有于2017年推出的SRT协议,相比常见的RTMP协议,SRT协议具有更低的延迟,并且消…

干货分享 | 学会这7个工具方法,数字化转型规划不是难题

提到数字化转型,首要做的便是分析企业现有的业务流程和价值流,发现企业利润来源的关键点,进而有针对性的数字化转型。要实现传统业务向数字化业务的转变,制定出高效、灵活的业务流程优化策略显得至关重要,这样才能找到…

Modbus为何要转成EtherCAT

1. Modbus是什么? Modbus是一种工业通信协议,广泛应用于工业自动化领域。它支持多种通信方式,包括RS-232、RS-485和TCP/IP等。Modbus协议简单易用,能够实现设备之间的数据交换和控制命令的传输。然而,它在数据传输速率…

Web渗透:任意文件下载

任意文件下载漏洞(Arbitrary File Download Vulnerability)是一种常见的Web安全漏洞,它允许攻击者通过修改输入参数,从服务器下载任意文件,而不仅仅是预期的文件;通常这种漏洞出现在处理用户输入的地方&…

一款开源、免费、现代化风格的WPF UI控件库

前言 今天大姚给大家分享一款开源(MIT License)、免费、现代化风格的WPF UI控件库:ModernWpf。 项目介绍 ModernWpf是一个开源项目,它为 WPF 提供了一组现代化的控件和主题,使开发人员能够创建具有现代外观的桌面应…

优化 C# 和 .NET Core Web API 中的 LINQ 查询

LINQ(语言集成查询)是 C# 中的一项强大功能,允许开发人员以可读且简洁的方式查询和操作数据。但是,LINQ 的使用效率低下可能会导致性能瓶颈,尤其是在处理 .NET Core Web API 中的大型数据集时。优化 LINQ 查询对于维护…

Rust 程序设计语言学习——泛型、Trait和生命周期

每一种编程语言都有高效处理重复概念的工具。在 Rust 中其工具之一就是泛型。泛型是具体类型或其他属性的抽象替代。 Trait 定义了某个特定类型拥有可能与其他类型共享的功能。可以通过 Trait 以一种抽象的方式定义共同行为。可以使用 trait bounds 指定泛型是任何拥有特定行为…

数据可视化期末考试(logistic回归)

目录 1、Logistic回归 2、梯度上升算法 1、Logistic回归 假设现在有一些数据点,我们利用一条直线对这些点进行拟合(该线称为最佳拟合直线),这个拟合过程就称作为回归,如下图所示: Logistic回归是分类方法,它利用的是…

用FFmpeg合并音频和视频

使用FFmpeg合并音频和视频是一个相对直接的过程。可以通过以下一些基本的步骤和命令示例完成这个任务: 安装FFmpeg:首先,确保你的系统中已经安装了FFmpeg。你可以从[FFmpeg官网](Download FFmpeg)下载并安装它。 准备素材:确保你…

压铸工艺介绍

1.压铸的主要特点 1.压铸是让有色金属熔融,并在加压的情况下让其流入模具中。由于使用模具,所以适合进行大量生产。不同于其他铸造方式,压铸需要加压,所以具有尺寸精度优秀的特点。此外,由于并非使用砂型而是采用模具…

如何给WPS、Word、PPT等办公三件套添加收费字体---方正仿宋GBK

1.先下载需要的字体。 下载字体的网站比较多,基本上都是免费的。随便在网上搜索一个就可以了,下面是下载的链接。 方正仿宋GBK字体免费下载和在线预览-字体天下 ​www.fonts.net.cn/font-31602268591.html 注意:切记不要商用,以免…

基于weixin小程序农场驿站系统的设计

管理员账户功能包括:系统首页,个人中心,农场资讯管理,用户管理,卖家管理,用户分享管理,分享类型管理,商品信息管理,商品类型管理 开发系统:Windows 架构模式&…

高频科技亮相SEMl-e2024第六届深圳国际半导体展,以超纯工艺推动行业发展

6月26-28日,SEMl-e2024第六届深圳国际半导体展在深圳国际会展中心(宝安新馆)隆重举办。本次展会以【“芯”中有“算”智享未来】为主题,汇聚800多家展商,集中展示了集成电路、电子元器件、第三代半导体及产业链材料和设备为一体的半导体产业链,搭建了供需精准对接、探索行业新发…

【多线程】如何解决线程安全问题?

🥰🥰🥰来都来了,不妨点个关注叭! 👉博客主页:欢迎各位大佬!👈 文章目录 1. synchronized 关键字1.1 锁是什么1.2 如何加锁1.3 synchronized 修饰方法1) 修饰普通成员方法2) 修饰静态…

web前端——css(一篇教会网页制作)

目录 一、基本语法 1.行内样式表 2.内嵌样式表 3.外部样式表 二、选择器 1.标签选择器 2.类选择器 3.id 选择器 4.通配选择器 三、常见修饰 1.文本 2.背景 3.列表 4.伪类 5.透明度 6.块级、行级、行级块标签 7.div 和 span 四、盒子模型(重点&…

Python学习打卡:day15

day15 笔记来源于:黑马程序员python教程,8天python从入门到精通,学python看这套就够了 目录 day15110、数据分析案例步骤 1 —— 文件读取data_define_108.pyfile_define_108.py 111、数据分析案例步骤二——数据计算112、数据分析案例步骤…

基于LMS自适应滤波的窄带信号宽带噪声去除(MATLAB R2021B)

数十年的研究极大的发展了自适应滤波理论,自适应滤波理论已经成为信号处理领域研究的热点之一。从理论上讲,自适应滤波问题没有唯一解。为了得到自适应滤波器及其应用系统,可以根据不同的优化准则推导出许多不同的自适应理论。目前该理论主要…

【C语言】字符/字符串+内存函数

目录 Ⅰ、字符函数和字符串函数 1 .strlen 2.strcpy 3.strcat 4.strcmp 5.strncpy 6.strncat 7.strncmp 8.strstr 9.strtok 10.strerror 11.字符函数 12. 字符转换函数 Ⅱ、内存函数 1 .memcpy 2.memmove 3.memcmp 4.memset Ⅰ、字符函数和字符串函数 1 .strlen 函数原型&…