【发布时间】:2017-05-01 18:56:36
【问题描述】:
刚接触该网站,但我正在努力磨练一些用于工作和学习的 MATLAB 技能,并且正在寻求以下方面的帮助:
我想编写自己的算法来使用二分法找到系统的 Hinf 范数,就像 MATLAB 函数 'hinfsyn' 所做的那样。
我已经包含了到目前为止的代码:
function [ hnorm ] = matmath(A,B,C,D,glow,ghigh,tol)
if 2*(ghigh-glow) < tol
gam = (ghigh+glow)/2;
hnorm = gam;
else
Dgam = ((gam^2)*eye(size(D)))-(D'*D);
A_clp = [ A + (B/Dgam*D'*C) -B/Dgam*B'
(C'*C) + C'*D/Dgam*D'*C -A'-(C'*D/Dgam*B')];
eigcl = eig(A_clp);
for i = 1:length(eigcl)
if real(eig(i)) == 0
glow = gam;
else
ghigh = gam;
end
end
end
我已将问题合理化为几个步骤:
- 将伽马边界用作输入,计算第一次迭代:gam = (ghigh-glow)/2。如果 2*(ghigh-glow)
- 计算闭环 A 矩阵的特征值。
- 检查纯虚特征值。如果存在纯虚特征值,则新辉光 = gam。否则,设置 ghigh = gam。
- 继续迭代,直到满足 gamma 容差。
我相信我的矩阵计算是正确的,但我很难使用 if/for 语句。我的代码仅在我在 MATLAB 中执行时才完成第一次迭代。任何提示将非常感谢!谢谢!
更新:这是我简化的代码,它成功完成了一次迭代,并针对许多不同的值进行了测试。
function [ hnorm ] = matmath(A,B,C,D,glow,ghigh,tol)
gam = (ghigh+glow)/2;
if 2*(ghigh-glow) < tol
hnorm = gam
else
Dgam = ((gam^2)*eye(size(D)))-(D'*D);
A_clp = [ A + (B/Dgam*D'*C) -B/Dgam*B'
(C'*C) + C'*D/Dgam*D'*C -A'-(C'*D/Dgam*B')];
eig_clp = eig(A_clp)
for z = 1:length(eig_clp)
if abs(real(eig_clp(z)))<1e-10
glow = gam
break
end
end
ghigh = gam
end
【问题讨论】: