该网站的新手,但我正在努力磨练工作和学校的一些 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
我已将问题合理化为几个步骤:
- 将 Gamma 边界用作输入,计算第一次迭代:gam = (ghigh-glow)/2。如果 2*(ghigh-glow) < tol,则程序以 hinf = gam 停止。
- 计算闭环 A 矩阵的特征值。
- 检查纯虚特征值。如果存在纯虚特征值,new glow = 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
最佳答案
如果你想让你的代码一直运行到你达到2*(gmax - gmin) < tol
, 使用 while
循环:
function [ hnorm ] = matmath(A,B,C,D,glow,ghigh,tol)
while 2*(ghigh-glow) >= tol
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;
hnorm = gam;
关于matlab - MATLAB 嵌套语句和二分法的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43724765/