GPOPS2学习笔记Ⅱ:问题构造

GPOPS2 是 MATLAB 上的一个软件包,用于求解优化控制问题。下载安装见:GPOPS2学习笔记Ⅰ:介绍,下载,安装

问题结构

我们使用 GPOPS2 的目的都是求解各自的最优控制问题,他们往往长得千奇百怪,因此求解的第一步是将这些问题构造成统一的形式。 GPOPS2 采用了一个P阶段最优控制问题形式,当我们希望它能够求解我们手上的问题时,首先需要将我们的问题形式化为这个标准的问题结构。

P-phase 最优控制问题 的一般形式

定义状态量:\mathbf{y}^{(p)}(t) \in \mathbb{R}_{y}^{n_{y}^{(p)}},控制量:\mathbf{u}^{(p)}(t) \in \mathbb{R}_{u}^{n_{u}^{(p)}},初始时间(or 自变量):t_{0}^{(p)} \in \mathbb{R},终端时间(or 自变量):t_{f}^{(p)} \in \mathbb{R},积分:\mathbf{q}^{(p)} \in \mathbb{R}_{q}^{n_{q}^{(p)}}p \in[1, \ldots, P] 代表阶段,\mathbf{s} \in \mathbb{R}^{n_{s}}是静态参数。P-phase最优控制问题形式如下:

  • 目标函数:

J=\phi\left[\mathbf{y}^{(1)}\left(t_{0}^{(1)}\right), \ldots, \mathbf{y}^{(P)}\left(t_{0}^{(P)}\right), t_{0}^{(1)}, \ldots, t_{0}^{(P)}, \mathbf{y}^{(1)}\left(t_{f}^{(1)}\right), \ldots, \mathbf{y}^{(P)}\left(t_{f}^{(P)}\right), t_{f}^{(1)}, \ldots, t_{f}^{(P)}, \mathbf{q}^{(1)}, \ldots, \mathbf{q}^{(P)}, \mathbf{s}\right]

  • 动力学约束:

\dot{\mathbf{y}}^{(p)}=\mathbf{a}^{(p)}\left[\mathbf{y}^{(p)}, \mathbf{u}^{(p)}, t^{(p)}, \mathbf{s}\right], \quad(p=1, \ldots, P)

  • 事件约束:

\begin{array}{c} \mathbf{b}_{\min }^{(g)} \leq \mathbf{b}\left[\mathbf{y}^{(1)}\left(t_{0}^{(1)}\right), \ldots, \mathbf{y}^{(P)}\left(t_{0}^{(P)}\right), t_{0}^{(1)}, \ldots, t_{0}^{(P)}, \mathbf{y}^{(1)}\left(t_{f}^{(1)}\right), \ldots, \mathbf{y}^{(P)}\left(t_{f}^{(P)}\right), t_{f}^{(1)}, \ldots, t_{f}^{(P)}, \mathbf{q}^{(1)}, \ldots, \mathbf{q}^{(P)}, \mathbf{s}\right] \leq \mathbf{b}_{\max }^{(g)} \\ (g=1, \ldots, G), \end{array}

  • 路径约束:

\mathbf{c}_{\min }^{(p)} \leq \mathbf{c}^{(p)}\left[\mathbf{y}^{(p)}, \mathbf{u}^{(p)}, t^{(p)}, \mathbf{s}\right] \leq \mathbf{c}_{\max }^{(p)}, \quad(p=1, \ldots, P)

  • 积分约束:

\mathbf{q}_{\min }^{(p)} \leq \mathbf{q}^{(p)} \leq \mathbf{q}_{\max }^{(p)}, \quad(p=1, \ldots, P)

where

q_{i}^{(p)}=\int_{t_{0}^{(p)}}^{t_{f}^{(p)}} Q_{i}\left[\mathbf{y}^{(p)}, \mathbf{u}^{(p)}, t^{(p)}, \mathbf{s}\right] d t, \quad\left(i=1, \ldots, n_{q}^{(p)} ; p=1, \ldots, P\right) .

GPOPS−II 组织结构

GPOPS−II的组织结构如下,它是用户指导程序如何按照此结构执行,也就是我们具体代码要填充的东西。为了指定要解决的最优控制问题,用户必须编写以下MATLAB函数:(1)an endpoint function;和(2)a continuous function。

endpoint function定义了问题中任何阶段的起点和/或终点、问题中任意阶段的积分和静态参数如何相互关联。端点函数还定义了需要最小化的目标函数。continuous function定义了问题任何阶段动力学的演化,计算问题任何阶段任何积分所需的被积函数,以及问题任何阶段的任何路径约束。接下来,用户必须指定以下变量的下限和上限:

(1) the time at the start and terminus of a phase;
(2) the state at the start of a phase, during a phase, and at the terminus of a phase;
(3) the control during a phase;
(4) the path constraints
(5) the event constraints;
(6) the static parameters.

用GPOPS−II构造一个最优控制问题

下面介绍如何在MATLAB中使用GPOPS−II构造并求解一个最优控制问题。

输入

当我们需要调用 GPOPS2  时,只需在代码中直接调用:

output = gpops2(input)

其中输入是包含关于要解决的最优控制问题的所有信息的用户定义结构体,并且输出是包含通过解决最优控制问题而获得的信息的结构体。

用户定义的结构体 setup(input) 包含必需字段和可选字段。结构体中必需的字段如下:

  • name:一个没有空格的字符串,包含问题的名称;
  • functions:包含continuous function和endpoint function名称的结构;
  • bounds:包含问题中不同变量和约束的下限和上限信息的结构;
  • guess:包含对问题中的时间、状态、控制、积分和静态参数的猜测。

可选字段如下:

  • auxdata:一种包含辅助数据的结构,可由问题中的不同函数使用。加入auxdata字段消除了在问题中指定全局变量的需要。
  • derivatives:指定NLP求解器使用的导数近似值和NLP求解程序使用的导数阶数(“第一阶”或“第二阶”)的结构。
  • 网格:指定要使用的网格细化方法类型、网格细化精度公差以及初始网格的信息的结构。
  • nlp:指定要使用的nlp解算器以及要在选定的nlp求解器中使用的选项的结构。
  • displaylevel:一个整数,取值为0、1或2,并提供在GPOPS−II执行期间发送到MATLAB命令窗口的输出量。

输出

GPOPS−II执行的输出同样是结构体,其中输出包含以下字段:

  • result:包含以下字段的结构体:
    • solution:每个阶段的最佳时间、状态和控制,以及静态参数向量的最佳值。最优时间、状态和控制分别存储在 solution.phase(p)、time、solution.phase(p).state 和 solution.phase(p).control字段中,而静态参数存储在字段 solution.parameter 中;
    • objective:最优控制问题的目标函数的最优值;
  • result.setup:GPOPS−II生成结果的 result 的 setup 结构体(the setup structure that produced the result found in result with GPOPS − II;);
  • result.nextsetup:如果上一个网格的网格细化过程没有终止(由于未满足网格细化精度公差),则将用于下一个网格细化迭代的设置结构。
  • meshhistory:求解NLP的每个网格的解和误差估计(仅当使用网格细化时);
  • meshiterations:GPOPS−II进行的网格细化迭代次数(仅当使用网格细化时);

具体每一个字段的详细内容将放在后面的内容中。接下来用一个例子来说明这些字段都是如何填写的。

注意:任何不适用于问题的字段(例如,没有路径约束的问题)都应该完全省略。

例子

BrysonDenham

这个是官方自带的 BrysonDenham 问题的例子,可以看到在调用GPOPS2之前,填写了上述的setup字段作为input。

BrysonDenhamMain.m

%------------------------- Bryson-Denham Problem -------------------------%
% This problem is taken from the following reference:                     %
% Bryson, A. E. and Ho, Y-C, "Applied Optimal Control:  Optimization,     %
% Estimation, and Control," Hemisphere Publishing, 1975.                  %
%-------------------------------------------------------------------------%
clear all
close all
clc

setup.name = 'BrysonDenham';

setup.functions.continuous = @BrysonDenhamContinuous;
setup.functions.endpoint = @BrysonDenhamEvents;

setup.nlp.solver = 'snopt';
setup.derivatives.supplier = 'sparseCD';
setup.derivatives.derivativelevel = 'second';
%setup.scales.method = 'automatic-bounds';

setup.method = 'RPMintegration';

setup.mesh.method = 'hp';
setup.mesh.tolerance = 1e-6; % default 1e-3

N = 1;
setup.mesh.phase.colpoints = 4*ones(1,N);
setup.mesh.phase.fraction   = ones(1,N)/N;

%--Problem Setup--
%state 1
x10 = 0;
x1f = 0;
x1min = 0;
x1max = 1/9;

%state 2
x20 = 1;
x2f = -1;
x2min = -10;
x2max = 10;

%state 3
x30 = 0;
x3min = -10;
x3max = 10;

%control
umin = -10;
umax = 5;

%time
t0 = 0;
tmax = 50;

%--Initial Guess--
x1_guess = [x10; x1f];
x2_guess = [x20; x2f];
x3_guess = [x30; x3max];

u_guess = [-10; 0];

t_guess = [t0; tmax];

%--Bounds & Guess--
%--State, Control, Time--
setup.bounds.phase.initialstate.lower = [x10, x20, x30];
setup.bounds.phase.initialstate.upper = [x10, x20, x30];
setup.bounds.phase.state.lower = [x1min, x2min, x3min];
setup.bounds.phase.state.upper = [x1max, x2max, x3max];
setup.bounds.phase.finalstate.lower = [x1f, x2f, x3min];
setup.bounds.phase.finalstate.upper = [x1f, x2f, x3max];

setup.bounds.phase.control.lower = [umin];
setup.bounds.phase.control.upper = [umax];

setup.bounds.phase.initialtime.lower = t0;
setup.bounds.phase.initialtime.upper = t0;

setup.bounds.phase.finaltime.lower = t0;
setup.bounds.phase.finaltime.upper = tmax;

%--No Path Constraints--

%--Guess--
setup.guess.phase(1).state = [x1_guess, x2_guess, x3_guess];
setup.guess.phase(1).control = u_guess;
setup.guess.phase(1).time = t_guess;

%setup.auxdata = 10;


%--Call the Solver--
output = gpops2(setup);

solution = output.result.solution;

figure(1)
plot(solution.phase(1).time,solution.phase(1).state,'-o', 'markersize', 7, 'linewidth', 1.5);
grid on

figure(2)
plot(solution.phase(1).time,solution.phase(1).control,'-o', 'markersize', 7, 'linewidth', 1.5);
grid on

figure(3)
plot(solution.phase(1).time,solution.phase(1).costate,'-o', 'markersize', 7, 'linewidth', 1.5);
grid on

BrysonDenhamContinuous.m

function phaseout = BrysonDenhamContinuous(input)

%t = input.phase.time;
%x1 = input.phase.state(:,1);
x2 = input.phase.state(:,2);
%x3 = input.phase.state(:,3);
u = input.phase.control;

dx1 = x2;
dx2 = u;
dx3 = (u.^2)./2;

phaseout.dynamics = [dx1, dx2, dx3];

BrysonDenhamEvents.m

function output = BrysonDenhamEvents(input)

x3f = input.phase.finalstate(3);

%--Cost--
output.objective = x3f;

  • 5
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
好的,我可以帮你解答这个问题。 在 Java 中,我们可以使用 javax.crypto 库中的 Cipher 类进行 AES 加密和解密操作。具体步骤如下: 1. 创建 Cipher 对象 ```java Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); ``` 2. 创建密钥 ```java SecretKeySpec secretKey = new SecretKeySpec(keyBytes, "AES"); ``` 其中,keyBytes 是一个 byte 数组,表示密钥的内容。 3. 初始化 Cipher 对象 ```java cipher.init(Cipher.ENCRYPT_MODE, secretKey, new IvParameterSpec(ivBytes)); ``` 其中,ivBytes 是一个 byte 数组,表示初始化向量。 4. 加密或解密数据 ```java byte[] result = cipher.doFinal(dataBytes); ``` 其中,dataBytes 是一个 byte 数组,表示要加密或解密的数据。 5. 将加密或解密后的结果转换成字符串或字节数组 如果需要将加密或解密后的结果转换成字符串,可以使用 Base64 编码。具体代码如下: ```java String resultStr = Base64.getEncoder().encodeToString(result); ``` 如果需要将加密或解密后的结果转换成字节数组,可以直接使用得到的 result 数组。 完整的示例代码如下: ```java import java.util.Base64; import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; public class AesUtils { public static byte[] encrypt(byte[] keyBytes, byte[] ivBytes, byte[] dataBytes) throws Exception { Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); SecretKeySpec secretKey = new SecretKeySpec(keyBytes, "AES"); cipher.init(Cipher.ENCRYPT_MODE, secretKey, new IvParameterSpec(ivBytes)); return cipher.doFinal(dataBytes); } public static byte[] decrypt(byte[] keyBytes, byte[] ivBytes, byte[] dataBytes) throws Exception { Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); SecretKeySpec secretKey = new SecretKeySpec(keyBytes, "AES"); cipher.init(Cipher.DECRYPT_MODE, secretKey, new IvParameterSpec(ivBytes)); return cipher.doFinal(dataBytes); } public static void main(String[] args) throws Exception { String dataStr = "hello, world!"; byte[] keyBytes = "0123456789abcdef".getBytes(); byte[] ivBytes = "0123456789abcdef".getBytes(); byte[] dataBytes = dataStr.getBytes(); // 加密 byte[] encryptedBytes = encrypt(keyBytes, ivBytes, dataBytes); String encryptedStr = Base64.getEncoder().encodeToString(encryptedBytes); System.out.println(encryptedStr); // 解密 byte[] decryptedBytes = decrypt(keyBytes, ivBytes, encryptedBytes); String decryptedStr = new String(decryptedBytes); System.out.println(decryptedStr); } } ``` 希望这个答案能够帮助到你!
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值