MPC模型预测控制算法(详细)

本文学习自华南理工大学龙胆也大佬,融入自己的思考和理解总结得到!

MPC三要素:

1、模型

2、预测

3、滚动优化

4、误差补偿

该模型与其它主流算法的对比:

总结:MPC适合大部分没有精确模型,或者阶次很高、非线性很强、约束很多的模型。

注意

MPC基于的模型不止一种。有传递函数,状态空间方程,也有数值模型,例如脉冲响应和阶跃响应。

本文主要讲阶跃响应序列。

正文

MPC里面滚动优化的核心是二次规划 

二次规划的目标函数为二次多项式:$J(x)=a x^{2}+b x+c$

二次多项式的画法要不就是开口向上或者开口向下。

拐弯点即极值点,就是二次规划目标函数的最优解。

为了找最优解,需要求导数为零的时候。

P是预测步长。假如K是当前时刻,可以往后面去预测 y(K+1) , y(K+2) ..... y(K+P),P可以从1开始到无穷大。

而M是控制步长,我们只能控制当前时刻的输入,因为现在永远早于预测,否则就不叫预测了。

即Δu(K),Δu(K + 1)....... Δu(K + M - 1

如何理解MPC模型?

P个时间周期的数据,直至PT时刻。

然后每个时刻都采集输出,y(a1),y(aP)。

根据线性系统的叠加原理:

ps:K代表某时刻。

$y(K)=a_{1} \cdot u(K-1)+a_{2} \cdot u(K-2)+\cdots+a_{M} \cdot u(K-M)$

我们把上面这个公式写成增量式:

$\Delta y(K)=a_{1} \cdot \Delta u(K-1)+a_{2} \cdot \Delta u(K-2)+\cdots+a_{M} \cdot \Delta u(K-M)$

可能会疑问,为什么最后是a_{M}因为我们能控制的只有当下,也就是M个步长可以控制,而不是P,因为P = M + 1

如何理解MPC的预测?

因为我们永远只能基于当下和之前来预测未来

预测第三个状态时,我们要基于第一次和第二次的经验。

直到...

最后我们用求和公式:

$\sum_{i=1}^{M} \cdot a_{i} \cdot \Delta u(K+P-i)$

总结一下:

新的预测输出 = Δ输出 + 原有预测输出

$\hat{Y}_{0}=A \cdot \Delta u+Y_{0}$

个人理解,主要是为了对比预测输出,一个是准确的预测输出,一个是根据以前的预测输出得到的预测输出。

写成

$\begin{array}{r}{\left[\begin{array}{c}\hat{Y}_{0}(k+1) \\ \hat{Y}_{0}(k+2) \\ \vdots \\ \hat{Y}_{0}(k+P)\end{array}\right]=\left[\begin{array}{cccc}a_{1} & 0 & \cdots & 0 \\ a_{2} & a_{1} & \cdots & 0 \\ \vdots & \vdots & & \vdots \\ a_{p} & a_{p-1} & \cdots & a_{p+M-1}\end{array}\right]\left[\begin{array}{c}\Delta u(K) \\ \Delta u(K+1) \\ \vdots \\ \Delta u(K+M)\end{array}\right]} \\ \\ +\left[\begin{array}{c}Y_{0}(K+1) \\ Y_{0}(K+2) \\ \vdots \\ Y_{0}(K+P)\end{array}\right]\end{array}$

如何理解MPC的滚动优化?

一、目标函数

$J(\Delta u)=a \cdot \Delta u^{2}+b \cdot \Delta u+c$

二、目标函数的求解

可以用matlab

也可以求导为0(基于这个二次多项式),得到最优解\Delta u

但是这个\Delta u是矩阵。我们选择矩阵中第一个数据为当前时刻的输入增量即可

滚动优化首先我们要知道它的期望轨迹。

可以用一阶滤波去模拟期望轨迹,即:

$\omega(k+i)=\alpha^{i} y(k)+\left(1-\alpha^{i}\right) y_{target}$

ps:y_{target}是目标值,y(k)是当前值

约束条件 0< \alpha <1

\alpha越小,则期望轨迹越陡;\alpha越大,则期望轨迹越缓慢

滚动优化第二步我们要如何设计目标函数J 

目标函数设计原则

1、目标一:离目标越近越好

$J_{1}=\sum_{i=1}^{p}[y(k+i)-w(k+i)]^{2}$

我们用一个求和函数,求P次,当前时刻的预测值当前时刻期望的预测值偏离多远,然后用平方是为了把正负给取消掉。

所以这个公式意味着我希望系统的预测与期望的轨迹接近。

2、目标二:能量越小越好

比如这个图,我肯定不希望系统绕个大弯去接近target。而是应该就近原则快速到达目标位置。

$J_{2}=\sum_{j=1}^{M}[\Delta u(K+j -1)]^{2}$

这里求和函数是M次,能量就是跟控制量\Delta u(K+i -1)有关,这里是能量的变化大小。那么平方就是不管是正负它也是在消耗能量。

最后,我们把完整的目标函数写出来。

根据你的需求,更看重目标一还是目标二,你可以自己去调整它们的相对大小

最好还是q + r = 1

比如我q为0.1,r为0.9。说明我希望能量小更重要。

如果q为0.9,r为0.1。说明我希望它靠近目标更快一点。

我们再把它写成矩阵的形式

$J=(Y-W)^{\top} \cdot Q \cdot(Y-W)+\Delta U^{\top} \cdot R \cdot \Delta U$

$\frac{\Delta J(\Delta u)}{\Delta(\Delta u)}=0$

得到这个公式,解得ΔU。(这个公式跟代码有很重要的关系,一定要搞懂!)

ΔU是一个Mx1的矩阵,我们控制增量取当前时刻的\Delta (K)加到系统的输入量里面就可以了

$\left[\begin{array}{c}\\\Delta (K) \\ \vdots \\ \Delta (K+M-1)\end{array}\right]$

MPC反馈矫正,补偿误差

K作为当前时刻,要预测P个,从下一时刻K+1开始:

$\hat{Y}_{0}(K+1) \cdots \hat{Y}_{0}(K+P)$

在K+1时刻,这个是实际值的输出

所以,误差 = 下一时刻实际值 - 当前时刻预测值

很容易理解,一个是从K时刻预测K+1的输出,一个是真真切切到达K+1时刻通过传感器等得到的输出。

e(K+1) = {y}(K+1) - \hat{Y}_{0}(K+1)

那么有误差我们肯定要做补偿。

补偿值 = 预测输出值 + 误差值

ps:h作为补偿系数设为0.5

为什么补偿{e}(K+1),就是因为现在是K时刻在做预测,我们要预测K+1,K+2 ... K+P,相当于一次性预测完。

然后K+1时刻时,我们预测K+2 ... K+P+1,那么到时补偿就变为{e}(K+2)

K时刻:

{y}_{correct}(K+1) = \hat{Y}_{0}(K+1) +{h}_{1}× {e}(K+1)

{y}_{correct}(K+2) = \hat{Y}_{0}(K+2) +{h}_{2}× {e}(K+1)

 {y}_{correct}(K+P) = \hat{Y}_{0}(K+P) +{h}_{P}× {e}(K+1)

把他写成矩阵的形式

那K+1时刻,预测值变为:

$\hat{Y}_{0}(K+2) \quad \hat{Y}_{0}(K+3) \quad\hat{Y}_{0}(K+4) \cdots\hat{Y}_{0}(K+P+1)$

\hat{Y}_{0}=S \cdot Y_{correct},S是移位矩阵

### LlamaIndex 多模态 RAG 实现 LlamaIndex 支持多种数据类型的接入与处理,这使得它成为构建多模态检索增强生成(RAG)系统的理想选择[^1]。为了实现这一目标,LlamaIndex 结合了不同种类的数据连接器、索引机制以及强大的查询引擎。 #### 数据连接器支持多样化输入源 对于多模态数据的支持始于数据收集阶段。LlamaIndex 的数据连接器可以从多个异构资源中提取信息,包括但不限于APIs、PDF文档、SQL数据库等。这意味着无论是文本还是多媒体文件中的内容都可以被纳入到后续的分析流程之中。 #### 统一化的中间表示形式 一旦获取到了原始资料之后,下一步就是创建统一而高效的内部表达方式——即所谓的“中间表示”。这种转换不仅简化了下游任务的操作难度,同时也提高了整个系统的性能表现。尤其当面对复杂场景下的混合型数据集时,良好的设计尤为关键。 #### 查询引擎助力跨媒体理解能力 借助于内置的强大搜索引擎组件,用户可以通过自然语言提问的形式轻松获得所需答案;而对于更复杂的交互需求,则提供了专门定制版聊天机器人服务作为补充选项之一。更重要的是,在这里实现了真正的语义级关联匹配逻辑,从而让计算机具备了一定程度上的‘认知’功能去理解和回应人类意图背后所蕴含的意义所在。 #### 应用实例展示 考虑到实际应用场景的需求多样性,下面给出一段Python代码示例来说明如何利用LlamaIndex搭建一个多模态RAG系统: ```python from llama_index import GPTSimpleVectorIndex, SimpleDirectoryReader, LLMPredictor, PromptHelper, ServiceContext from langchain.llms.base import BaseLLM import os def create_multi_modal_rag_system(): documents = SimpleDirectoryReader(input_dir='./data').load_data() llm_predictor = LLMPredictor(llm=BaseLLM()) # 假设已经定义好了具体的大型预训练模型 service_context = ServiceContext.from_defaults( chunk_size_limit=None, prompt_helper=PromptHelper(max_input_size=-1), llm_predictor=llm_predictor ) index = GPTSimpleVectorIndex(documents, service_context=service_context) query_engine = index.as_query_engine(similarity_top_k=2) response = query_engine.query("请描述一下图片里的人物表情特征") print(response) ``` 此段脚本展示了从加载本地目录下各类格式文件开始直到最终完成一次基于相似度排序后的top-k条目返回全过程。值得注意的是,“query”方法接收字符串参数代表使用者想要询问的内容,而在后台则会自动调用相应的解析模块并结合先前准备好的知识库来进行推理计算得出结论。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值