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
参考文献