【TQ】对象模型

对象模型

标准 C++ 对象模型为对象范式提供了非常高效的运行时支持。但是,在某些问题域中,它的静态特性不够灵活。图形用户界面编程是一个需要运行时效率和高度灵活性的领域。Qt通过将C++的速度与Qt对象模型的灵活性相结合,提供了这一点。

Qt为C++添加了以下功能:

  • 一种非常强大的无缝对象通信机制,称为信号与槽。
  • 可查询和可设计的对象属性。
  • 强大的事件和事件过滤器。
  • 国际化的上下文字符串翻译。
  • 高级的定时器,可以优雅地将许多任务集成到事件驱动的GUI中。
  • 分层和可查询的对象树,以自然的方式组织对象所有权。
  • 受保护的指针(QPointer),当引用的对象被销毁时自动设置为0,与普通的C++指针不同,普通指针在对象被销毁时变为悬空指针。
  • 可跨库边界使用的动态转换。
  • 支持自定义类型创建。

这些Qt特性中的许多都是使用标准C++技术实现的,基于从 QObject 继承。其他特性,如对象通信机制和动态属性系统,则需要Qt自身的元对象系统提供的元对象系统。

元对象系统是C++的扩展,使该语言更适合真正的组件GUI编程。

重要的类

这些类构成了 Qt 对象模型的基础。

QMetaClassInfo关于类的附加信息
QMetaEnum枚举器的元数据
QMetaMethod成员函数的元数据
QMetaObject包含有关 Qt 对象的元信息
QMetaProperty属性的元数据
QMetaType在元对象系统中管理命名类型
QObject所有 Qt 对象的基类
QObjectCleanupHandler监视多个 QObject 的生存周期
QPointer为 QObject 提供受保护的指针的模板类
QSignalBlockerQObject::blockSignals() 的异常安全封装
QSignalMapper将可识别发送者的信号捆绑在一起
QVariant对于最常见的 Qt 数据类型,起到联合的作用

Qt 对象:本体与值

上面列出的 Qt 对象模型的一些新增功能要求我们将 Qt 对象视为本体,而不是值。值可以被复制或赋值;而本体则被克隆。克隆意味着创建一个新的本体,而不是原来的精确复制。例如,双胞胎具有不同的本体。它们可能看起来一模一样,但是它们有不同的名字、不同的位置,甚至可能拥有完全不同的社交网络。

因此,对本体进行克隆比复制或赋值更为复杂。我们可以从 Qt 对象模型中看到这意味着什么。

一个 Qt 对象…

  • 可能有一个唯一的 QObject::objectName()。如果我们复制一个 Qt 对象,我们应该给副本取什么名字?
  • 在对象层次结构中有一个位置。如果我们复制一个 Qt 对象,副本应该放在哪里?
  • 可以连接到其他 Qt 对象以向它们发出信号,或接收它们发出的信号。如果我们复制一个 Qt 对象,应该如何将这些连接传递给副本?
  • 可以在运行时添加新属性,这些属性在 C++ 类中没有声明。如果我们复制一个 Qt 对象,副本是否应该包含添加到原始对象的属性?

因此,Qt 对象应该被视为本体,而不是值。本体是被克隆的,而不是被复制或赋值,而克隆本体是一个比复制或赋值更为复杂的操作。因此,QObject 和所有 QObject 的子类(直接或间接)都禁用了它们的复制构造函数和赋值运算符。

### 多变量模型预测控制概述 多变量模型预测控制(Multivariable Model Predictive Control, MMPC)是一种用于处理具有多个输入和输出系统的先进控制技术。其核心在于利用系统动态模型,在线求解优化问题,以获得未来一段时间内的最优控制动作序列[^4]。 #### 相关概念 MMPC 的主要特点包括以下几个方面: - **约束管理**:能够显式考虑物理、操作和技术上的各种约束条件。 - **多目标优化**:可以同时优化多个性能指标,例如能耗最小化和产品质量最大化。 - **滚动时域优化**:基于当前时刻的状态估计,不断更新未来的控制计划并实施第一个控制动作。 #### 实现方法 为了实现多变量模型预测控制,通常需要完成以下几部分工作: 1. **建立系统动态模型** 动态模型描述了被控对象的行为特性。对于复杂的工业过程,可能采用状态空间方程表示形式: \[ x(k+1) = Ax(k) + Bu(k),\quad y(k) = Cx(k) + Du(k), \] 其中 \(A\) 是状态转移矩阵,\(B\) 是输入矩阵,\(C\) 和 \(D\) 分别是输出矩阵和直通项矩阵。 2. **定义成本函数** 成本函数反映了控制系统的设计目标,一般由跟踪误差平方和以及控制增量惩罚组成: \[ J(u) = \sum_{k=0}^{N_p}(r_k-y_k)^TQ(r_k-y_k)+\sum_{j=0}^{N_c}\Delta u_j^TR\Delta u_j, \] 参数解释如下: - \(N_p\) 表示预测时域长度; - \(N_c\) 表示控制时域长度; - \(Q\) 和 \(R\) 分别是对角权重矩阵,用来平衡不同信号的重要性。 3. **求解在线优化问题** 利用数值算法实时计算满足所有约束的最佳控制律向量 \(u=[u_0,\dots,u_{N_c}]^T\) 。常用工具包有 CasADi 或 MATLAB 中的 fmincon 函数[^3]。 #### 示例代码片段 下面给出一段 Python 使用 CasADi 库构建简单双输入单输出 (SISO) 系统 MPC 控制器的例子: ```python import casadi as ca # 定义符号变量 nx, nu = 2, 1 # 状态维度 & 输入维度 Np = 10 # 预测步长 xr = [1., 0.] # 参考轨迹 U = ca.SX.sym('U', Np*nu) # 构造离散时间状态空间模型 Ad = [[0.9875, 0.0625], [-0.125, 0.9375]] Bd = [[0.0125], [0.0625]] def predict_states(X0, U): X = [] for k in range(Np): Uk = U[k*nu:(k+1)*nu] next_state = Ad @ X[-1] + Bd @ Uk if len(X)>0 else Ad@X0+Bd@Uk X.append(next_state) return ca.vertcat(*X).T # 创建代价函数 states_pred = predict_states([0., 0.], U) cost_terms = [(states_pred[:, i]-xr)**2 for i in range(nx)] J = sum(ca.sumsqr(term) for term in cost_terms) # 添加边界条件和其他约束... problem = {'f': J, 'x': U} solver = ca.nlpsol('mpc_solver', 'ipopt', problem) solution = solver(lbx=-1, ubx=1)['x'] print(solution.full()) ``` 上述脚本展示了如何设置基本框架,并调用了 IPOPT 求解器找到局部极小值点作为最终决策依据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值