cupyx.scipy.signal.place_poles#

cupyx.scipy.signal.place_poles(A, B, poles, method='YT', rtol=0.001, maxiter=30)[source]#

计算 K,使得特征值 (A - dot(B, K)) = 极点。

K 是增益矩阵,使得线性系统 AX+BU 所描述的被控对象的闭环极点,即特征值 A - B*K,尽可能接近 poles 中要求的极点。

支持 SISO、MISO 和 MIMO 系统。

参数:
  • A (ndarray) – 线性系统 AX + BU 的状态空间表示。

  • B (ndarray) – 线性系统 AX + BU 的状态空间表示。

  • poles (array_like) – 期望的实极点和/或复共轭极点。复极点仅在使用 method="YT"(默认)时支持。

  • method ({'YT', 'KNV0'}, 可选) –

    选择哪种方法来寻找增益矩阵 K。可以是

    • ’YT’:Yang Tits

    • ’KNV0’:Kautsky, Nichols, Van Dooren 更新方法 0

    有关算法的详细信息,请参阅参考和注意事项。

  • rtol (float, 可选) – 每次迭代后,A - B*K 的特征向量的行列式与其先前值进行比较,当这两个值之间的相对误差低于 rtol 时,算法停止。默认值为 1e-3。

  • maxiter (int, 可选) – 计算增益矩阵的最大迭代次数。默认值为 30。

返回值:

full_state_feedback

full_state_feedback 由以下部分组成:
gain_matrix1-D ndarray

闭环矩阵 K,使得 A-BK 的特征值尽可能接近要求的极点。

computed_poles1-D ndarray

对应于 A-BK 的极点,按先实极点按升序排列,然后复共轭极点按字典顺序排列。

requested_poles1-D ndarray

算法被要求配置的极点,按上述方式排序,它们可能与实际达到的极点不同。

X2-D ndarray

传递矩阵,使得 X * diag(poles) = (A - B*K)*X (参见注意事项)

rtolfloat

det(X) 上达到的相对容差(参见注意事项)。如果系统 diag(poles) = (A - B*K) 可解,则 rtol 为 NaN,或者当优化算法无能为力时(即 B.shape[1] == 1 时),rtol 为 0。

nb_iterint

收敛前执行的迭代次数。如果系统 diag(poles) = (A - B*K) 可解,则 nb_iter 为 NaN,或者当优化算法无能为力时(即 B.shape[1] == 1 时),nb_iter 为 0。

返回类型:

Bunch object

注意事项

Tits 和 Yang (YT) 的论文 [2] 是 Kautsky 等人 (KNV) 原始论文 [1] 的更新。KNV 依赖于秩 1 更新来寻找传递矩阵 X,使得 X * diag(poles) = (A - B*K)*X,而 YT 使用秩 2 更新。平均而言,这会产生更鲁棒的解(参见 [2] 第 21-22 页),此外,YT 算法支持复极点,而 KNV 的原始版本不支持。此处仅实现了 KNV 提出的更新方法 0,因此命名为 'KNV0'

扩展到复极点的 KNV 用于 Matlab 的 place 函数,YT 由 Slicot 以非免费许可证分发,名称为 robpole。KNV0 如何扩展到复极点尚不清楚且未文档化(Tits 和 Yang 在他们的论文第 14 页声称他们的方法不能用于将 KNV 扩展到复极点),因此在此实现中只有 YT 支持复极点。

由于 MIMO 系统的极点配置问题没有唯一的解,这两种方法都从一个暂定的传递矩阵开始,该矩阵会以各种方式改变以增加其行列式。这两种方法都被证明可以收敛到稳定的解,但是根据初始传递矩阵的选择方式,它们将收敛到不同的解,因此不能保证使用 'KNV0' 会产生与 Matlab 或这些算法的任何其他实现相似的结果。

在大多数情况下,使用默认方法 'YT' 应该没问题;提供 'KNV0' 只是因为它在某些特定情况下是 'YT' 所需要的。此外,当使用 abs(det(X)) 作为鲁棒性指标时,'YT' 平均而言比 'KNV0' 提供更鲁棒的结果。

[2] 可作为技术报告在以下 URL 获取:https://hdl.handle.net/1903/5598

参考文献