GPOPS列车最优运控

GPOPS列车最优运控

动力学方程

d t d s = 1 v d v d s = u − r ( v ) − g ( s ) v \frac{dt}{ds} = \frac{1}{v} \\ \frac{dv}{ds} = \frac{u-r(v)-g(s)}{v} dsdt=v1dsdv=vur(v)g(s)
目标函数
J = ∫ s 0 s f m a x ( u , 0 ) d s J = \int_{s_0}^{s_f}max(u,0)ds J=s0sfmax(u,0)ds
代码,没考虑坡度和限速,所以只有一段

clear clc setup limits guess
tic;
global constants
 
constants.D_total = ;	% 总路程
constants.T_total = ;	% 总时间
constants.A = ;			% 戴维斯系数
constants.B = ;			% 戴维斯系数
constants.C = ;			% 戴维斯系数
constants.M = ;			% 列车质量
constants.PowerMax = ;	% 功率限制
constants.velMax = ;	% 速度限制
constants.uMin = ;		% 控制限制
constants.uMax = ;
 
s0 = 0; sf = constants.D_total;
t0 = 0; tf = constants.T_total;
v0 = 1; vf = 1;
 
% start phase
s0Min = s0; s0Max = s0;
t0Min = t0; t0Max = t0;
v0Min = v0; v0Max = v0;
 
% during phase
tMin = 0; tMax = tf;
vMin = 1; vMax = constants.velMax;
 
% terminus phase
sfMin = sf; sfMax = sf;
tfMin = tf; tfMax = tf;
vfMin = vf; vfMax = vf;
 
uMin = constants.uMin;
uMax = constants.uMax;
 
iphase = 1;
limits(iphase).meshPoints       = [-1 +1];
limits(iphase).nodesPerInterval = 99;
limits(iphase).time.min         = [s0Min  sfMin];
limits(iphase).time.max         = [s0Max  sfMax];
limits(iphase).state.min(1,:)   = [t0Min tMin tfMin];
limits(iphase).state.max(1,:)   = [t0Max tMax tfMax];
limits(iphase).state.min(2,:)   = [v0Min vMin vfMin];
limits(iphase).state.max(2,:)   = [v0Max vMax vfMax];
limits(iphase).control.min      = -uMin;
limits(iphase).control.max      = uMax;
limits(iphase).parameter.min    = [];
limits(iphase).parameter.max    = [];
limits(iphase).path.min         = [];
limits(iphase).path.max         = [];
limits(iphase).event.min        = [];
limits(iphase).event.max        = [];
 
%% guess
guess(iphase).time          = [s0; sf];     % increase
guess(iphase).state(:,1)    = [t0; t0];
guess(iphase).state(:,2)    = [v0; vf];
guess(iphase).control       = [0; 0];
guess(iphase).parameter     = [];
 
 
%% setup
setup.name              = 'Train-Problem';
setup.funcs.cost        = @TrainCost;
setup.funcs.dae         = @TrainDae;
setup.linkages          = [];
setup.limits            = limits;
setup.guess             = guess;
setup.derivatives       = 'finite-difference';
setup.checkDerivatives  = 0;
setup.autoscale         = 'on';
setup.mesh.tolerance    = 1e-1;
setup.mesh.iteration    = 1;
setup.mesh.nodesPerInterval.min = 5;
setup.mesh.nodesPerInterval.max = 10;
 
[output,gpopsHistory] = gpops(setup);
toc;
solution = output.solution;

dae函数

function [dae] = TrainDae(sol)
    global constants
    s = sol.time;
    t = sol.state(:, 1);
    v = sol.state(:, 2);
    u = sol.control;
    tdot = 1 ./ v;
    r = (constants.A + constants.B * v + constants.C * v .^ 2) / constants.M;
    vdot = (u - r) ./ v;
    dae = [tdot vdot];
end

cost函数

function [Mayer,Lagrange] = TrainCost(sol)
    s0 = sol.initial.time;
    u  = sol.control;
    Mayer = zeros(size(s0));
    Lagrange = max(u, 0);
end

控制曲线
在这里插入图片描述
速度曲线
在这里插入图片描述

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
GPops是一种广泛应用于求解最制问题的软件包。最制是一种化问题,即在给定系统动力学和目标函数的情况下,寻找能使目标函数最小化或最大化的最制策略或轨迹。 GPops通过将最制问题转化为非线性化问题,并应用强大的化算法进行求解。它的求解过程包含两个主要步骤:离散化和化。 首先,GPops将原始最制问题转化为离散化的问题。它将连续时间区间分割成若干个离散的时间间隔,并在每个时间间隔内选择一个制输入。这样,最制问题就被转化为在离散时间点上寻找最制输入序列的问题。 然后,GPops使用化算法来寻找最制输入序列,以使目标函数取得最小值或最大值。通过迭代计算和调整制输入序列,GPops能够逐步逼近最解,并通过不同的化算法来提高收敛速度和解的质量。 GPops在求解最制问题上具有许多势。首先,它支持多种类型的最制问题,包括连续时间和离散时间、线性和非线性系统、单目标和多目标等。其次,GPops具有高效的求解算法和化技术,能够在较短的时间内找到最解。此外,GPops还提供了友好的用户界面和可视化工具,使问题建模、求解和分析更加方便和直观。 总之,GPops是一种强大的求解最制问题的工具,能够帮助研究人员和工程师解决各种复杂的制问题,并提供高效的化算法和可视化工具来支持问题的求解和分析。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值