【问题标题】:Problems with MATLAB nested statements and bisectionMATLAB 嵌套语句和二分法的问题
【发布时间】: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

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

  1. 将伽马边界用作输入,计算第一次迭代:gam = (ghigh-glow)/2。如果 2*(ghigh-glow)
  2. 计算闭环 A 矩阵的特征值。
  3. 检查纯虚特征值。如果存在纯虚特征值,则新辉光 = gam。否则,设置 ghigh = gam。
  4. 继续迭代,直到满足 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

【问题讨论】:

    标签: matlab bisection norm


    【解决方案1】:

    如果您希望代码一直运行到达到2*(gmax - gmin) &lt; 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;
    

    【讨论】:

    • 感谢您的帮助!这种形式更有意义。但是,我的代码在第一次迭代后仍然停止。我怀疑 for 循环检查纯虚特征值会阻止 gam 被更新。
    • 所以,我意识到我的 gloom 和 ghigh 输入参数被翻转,这就是我的代码在第一次迭代时停止的原因。但是,当我翻转响应时,我会收到“未定义函数或变量“gam”的错误。我将该语句移到程序的顶部,然后运行。然后 Gamma 在 for 循环中更新,但停止重新分配gam后,并没有回到顶部
    • 好吧,我猜是计算出了问题。
    • 我在我的代码中看到一个错误。 “如果真实(eig(i))== 0”应该是“如果真实(eigcl(i))== 0。”但是,我也相信这就是我的代码被挂断的地方。我已经通过该语句运行了示例特征值,即使实际值为 1e-12 的特征值也不会满足 0.0 的要求,即使该精度符合我在该语句中的期望。有没有更好的方法来检查这种不平等?我认为浮点数的四舍五入会导致问题。
    • 绝对可以——你可以试试if abs(real(eigcl(i))) &lt; 1e-8
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多