MATLAB嵌套语句和二分法的问题

时间:2017-05-01 18:56:36

标签: matlab bisection norm

该网站的新手,但我正在努力磨练一些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

我已将问题合理化为几个步骤:

  1. 使用gamma边界作为输入,计算第一次迭代:gam =(ghigh-glow)/ 2。如果2 *(ghigh-glow)&lt; tol,然后用hinf = gam停止程序。
  2. 计算闭环A矩阵的eignevalues。
  3. 检查纯虚构的特征值。如果存在纯虚构的特征值,则新发光= gam。否则,请设置ghigh = gam。
  4. 继续迭代,直到满足伽马公差为止。
  5. 我相信我的矩阵计算是正确的,但我在使用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
    

1 个答案:

答案 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;