Tsai笔记:GPOPS学习笔记(1)—— 高斯伪谱法的最基本优化方程求解思路(例子介绍)

Tsai笔记:GPOPS学习笔记(1)—— 高斯伪谱法的最基本优化方程求解思路(例子介绍)

Tsai三步。(第一步,基本说明。第二步,结果图显示。第三步,代码展示。)

第一步,基本说明。

A、问题说明:系统运动微分方程、初始状态、控制变量及其目标函数为

\bg_white \fn_cm \LARGE \dpi{120} \bg_white \fn_cm \LARGE {\color{DarkBlue} \dot{x1}=-x1+u;\dot{x2}=x1; x1(0)=1; x2(0)=0;-1\leq u\leq 1; J=\int_{0}^{1}(x2\left ( 1 \right ))dt;}

用最小值原理求u*,使得J达到最小值。

B、基本步骤说明:写出主函数main,cost函数和dae函数。

main函数基本框架为:

%% 参数设置 前面可设置参数
clear all
clc

%% 状态变量和控制变量约束设 假设有r个阶段、n个控制变量、m个状态变量、i个路径约束、j个事件、k个参数、s个时间猜测点
iphase = 1;
limits(iphase).time.min = [t0min tfmin];%两端点时间的下限
limits(iphase).time.max = [t0max tfmax];%两端点时间的上限
limits(iphase).control.min = [u1min;...;unmin];%表示n个控制变量的下限
limits(iphase).control.max = [u1max;...;unmax];%表示n个控制变量的上限
limits(iphase).state.min = [x10min x1min x1fmin;%表示m个状态变量的上限
                            x20min x2min x2fmin;
                            ......;
                            xm0min xm1min xmfmin];
limits(iphase).state.max = [x10max x1max x1fmax;%表示m个状态变量的上限
                            x20max x2max x2fmin;
                            ......;
                            xm0max xm1max xmfmax];
limits(iphase).parameter.min = [q1min;q2min;...;qkmin];%表示k个参数的下限
limits(iphase).parameter.max = [q1max;q2max;...;qkmax];%表示k个参数的上限
limits(iphase).path.min =[c1min;...;cimin];%表示i个路径约束的下限
limits(iphase).path.max =[c1max;...;cimax];%表示i个路径约束的上限
limits(iphase).event.min = [o1min;...;ojmin];%表示j个事件的下限
limits(iphase).event.max = [o1max;...;ojmax];%表示j个事件的上限
%其实对这个guess不是很理解 暂且保留疑问
guess(iphase).time = [t0;...;ts];
guess(iphase).state(:,1) = [x10;x11;...;x1s];
guess(iphase).state(:,2) = [x20;x21;...;x2s];
...
guess(iphase).state(:,m) = [xm0;xm1;...;xms];
guess(iphase).control(:,1) = [u10;u11;...;u1s];
...
guess(iphase).control(:,n) = [un0;un1;...;uns];
guess(iphase).parameter = [q1;q2;...;qk];


%% 阶段二 同理
iphase = 2;
...


%% linkage设置
ipair = 1; % 第一个连接点
linkages(ipair).left.phase = 1;%与第一阶段相连
linkages(ipair).right.phase = 2;%与第二阶段相连
linkages(ipair).min = [0; 0; 0; 0; 0];
linkages(ipair).max = [0; 0; 0; 0; 0];

ipair = 2; % 第二个连接点
linkages(ipair).left.phase = 2;%与第二阶段相连
linkages(ipair).right.phase = 3;%与第三阶段相连
linkages(ipair).min = [0; 0; 0; 0; 0];
linkages(ipair).max = [0; 0; 0; 0; 0];
...


%% setup设置  是基本设置名称不要写错
setup.name = 'Problem';
setup.funcs.cost = 'Cost';
setup.funcs.dae = 'Dae';
setup.funcs.link = 'link';
setup.limits = limits;
setup.guess = guess;
setup.linkages = linkages;
setup.derivatives = 'finite-difference';
setup.checkDerivatives = 0;
setup.autoscale = 'off';
setup.mesh.tolerance = 0.1;
setup.mesh.iteration = 10;
setup.mesh.nodesPerInterval.min = 10;
setup.mesh.nodesPerInterval.max = 20;


输出数据到output和gpopsHistory,这部分看一下MATLAB结果就清楚
[output,gpopsHistory] = gpops(setup);

%也可以是使用这种方式
%tic;%tic用来保存当前时间,而后使用toc来记录程序完成时间
%output = gpops(setup);
%solution=output.solution;
%toc;

cost函数基本框架为:

%cost基本是一个函数,里面的格式也相对固定
%积分使用Lagrange
function [Mayer,Lagrange] = Cost(sol)
t0 = sol.initial.time;
x0 = sol.initial.state;
tf = sol.terminal.time;
xf = sol.terminal.state;
t = sol.time;
x = sol.state;
u = sol.control;
p = sol.parameter;
x1=x(:,1);x2=x(:,2);x3=x(:,3);x4=x(:,4);x5=x(:,5);

%Mayer多项式(a scalar size 1*1)
Mayer =zeros(size(solcost.time);%当没有值得时候
%Lagrange积分项(a column vector of size N*1)
Lagrange =zeros(size(solcost.time);%当没有值得时候

dae函数基本框架为:

%是个函数 基本也很固定
function [dae] = Dae(sol)

t = sol.time;
x = sol.state;
u = sol.control;
p = sol.parameter;

%状态方程(dae a matrix of size N * (m + i))
x1=x(:,1);x2=x(:,2);
x1dot=-x1+u;
x2dot=x1;
dae = [x1dot x2dot ... xmdot path1 path2 ... pathi];

第二步,结果图显示。

 

 

第三步,代码展示。

main函数:

%------------------------------------------------------------------%
% BEGIN: script 例5.1                               %
%------------------------------------------------------------------%
% This example is taken from the following reference:              %
% The optimal control problem is described as follows:             %
%------------------------------------------------------------------%
clear all
close all
clc

%设置状态量限制条件
x10=1;
x20=0;
x1min=-10;
x1max=10;
x2min=-10;
x2max=10;
%设置控制量限制条件
umin=-1;
umax=1;
%设置时间
t0=0;
tf=1;


iphase = 1;
%设置时间限制条件
limits(iphase).time.min    = [t0 tf];
limits(iphase).time.max    = [t0 tf];
%设置状态变量
limits(iphase).state.min = [x10 x1min x1min;
                            x20 x2min x2min];
limits(iphase).state.max = [x10 x1max x1max;
                            x20 x2max x2max];
%设置控制变量限制条件
limits(iphase).control.min = umin;
limits(iphase).control.max = umax;
%设置时间估计值
guess(iphase).time      = [t0; tf];
%设置状态变量估计值
guess(iphase).state(:,1)     = [x10; x1max];
guess(iphase).state(:,2)     = [x20; x2max];
%设置控制变量估计值
guess(iphase).control   = [umin; umax];
guess(iphase).parameter      = [];
limits(iphase).parameter.min = [];
limits(iphase).parameter.max = [];
limits(iphase).path.min      = [];
limits(iphase).path.max      = [];
limits(iphase).event.min     = [];
limits(iphase).event.max     = [];

setup.name  = 'Optimal-Problem';
setup.funcs.cost = 'Cost';
setup.funcs.dae = 'Dae';
setup.linkages = [];
setup.limits = limits;
setup.guess = guess;
setup.derivatives = 'finite-difference';
setup.checkDerivatives = 0;
setup.autoscale = 'off';
setup.mesh.tolerance = 1e-6;
setup.mesh.iteration = 20;
setup.mesh.nodesPerInterval.min = 4;
setup.mesh.nodesPerInterval.max = 20;

[output,gpopsHistory] = gpops(setup);
%----------------------------------%
% END: script hyperSensitiveMain.m %
%----------------------------------%


figure('name','State x1(t) vs t')
axis equal
plot(output.solutionPlot.time,output.solutionPlot.state(:,1),'bo')
xlabel('(a) State x1(t) vs t')
ylabel('x1(t)')
hold off
grid on
axis([0,2,-1,1])


figure('name','State x2(t) vs t')
axis equal
plot(output.solutionPlot.time,output.solutionPlot.state(:,2),'ro')
xlabel('(b) State x2(t) vs t')
ylabel('x2(t)')
hold off
grid on
axis([0,2,-1,1])


figure('name','Control u(t) vs t')
plot(output.solutionPlot.time,output.solutionPlot.control,'go')
xlabel('(c) Control u(t) vs t')
ylabel('u(t)')
hold off
grid on
axis([0,2,-2,1])

cost函数:

%--------------------------------------%
% BEGIN: function hyperSensitiveCost.m %
%--------------------------------------%
function [Mayer,Lagrange] = Cost(sol)

%不需要修改
t0 = sol.initial.time;
x0 = sol.initial.state;
tf = sol.terminal.time;
xf = sol.terminal.state;
t  = sol.time;
x  = sol.state;
u  = sol.control;
p  = sol.parameter;

x1=x(:,1);x2=x(:,2);

%性能指标
%多项式
Mayer = xf(2);
%积分项
Lagrange = zeros(size(t));

%--------------------------------------%
% END: function hyperSensitiveCost.m   %
%--------------------------------------%

dae函数:

%-------------------------------------%
% BEGIN: function hyperSensitiveDae.m %
%-------------------------------------%
function [dae] = Dae(sol)

t = sol.time;
x = sol.state;
u = sol.control;
p = sol.parameter;

%状态方程dx=x-u;
x1=x(:,1);x2=x(:,2);
x1dot=-x1+u;
x2dot=x1;
dae = [x1dot x2dot];

%-------------------------------------%
% END: function hyperSensitiveDae.m   %
%-------------------------------------%

将学习GPOPS过程中遇到的小问题解决并记录下来,如有错误,请各位前辈指导。

若对我的笔记有兴趣的可以查看我的博客,地址:https://blog.csdn.net/weixin_43338642?t=1

  • 32
    点赞
  • 172
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
机器学习是一种人工智能(AI)的子领域,致力于研究如何利用数据和算法让计算机系统具备学习能力,从而能够自动地完成特定任务或者改进自身性能。机器学习的核心思想是让计算机系统通过学习数据中的模式和规律来实现目标,而不需要显式地编程。 机器学习应用非常广泛,包括但不限于以下领域: 图像识别和计算机视觉: 机器学习在图像识别、目标检测、人脸识别、图像分割等方面有着广泛的应用。例如,通过深度学习技术,可以训练神经网络来识别图像中的对象、人脸或者场景,用于智能监控、自动驾驶、医学影像分析等领域。 自然语言处理: 机器学习在自然语言处理领域有着重要的应用,包括文本分类、情感分析、机器翻译、语音识别等。例如,通过深度学习模型,可以训练神经网络来理解和生成自然语言,用于智能客服、智能助手、机器翻译等场景。 推荐系统: 推荐系统利用机器学习算法分析用户的行为和偏好,为用户推荐个性化的产品或服务。例如,电商网站可以利用机器学习算法分析用户的购买历史和浏览行为,向用户推荐感兴趣的商品。 预测和预测分析: 机器学习可以用于预测未来事件的发生概率或者趋势。例如,金融领域可以利用机器学习算法进行股票价格预测、信用评分、欺诈检测等。 医疗诊断和生物信息学: 机器学习在医疗诊断、药物研发、基因组学等领域有着重要的应用。例如,可以利用机器学习算法分析医学影像数据进行疾病诊断,或者利用机器学习算法分析基因数据进行疾病风险预测。 智能交通和物联网: 机器学习可以应用于智能交通系统、智能城市管理和物联网等领域。例如,可以利用机器学习算法分析交通数据优化交通流量,或者利用机器学习算法分析传感器数据监测设备状态。 以上仅是机器学习应用的一部分,随着机器学习技术的不断发展和应用场景的不断拓展,机器学习在各个领域都有着重要的应用价值,并且正在改变我们的生活和工作方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值