该网站的新手,但我正在努力磨练一些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
我已将问题合理化为几个步骤:
我相信我的矩阵计算是正确的,但我在使用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
答案 0 :(得分:0)
如果您希望代码在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;