【问题标题】:My first iteration is being skipped - MATLAB我的第一次迭代被跳过 - MATLAB
【发布时间】:2013-09-23 13:48:24
【问题描述】:

我正在尝试从我的函数中获取输出,但第一次迭代被跳过。 我不断得到 ZETA = 1.000 而不是 ZETA = -18.7026 请帮忙!

EIG = [
 -18.7026;          
  -4.6179 + 7.4827j;
  -4.6179 - 7.4827j;
  -1.1268 + 4.3335j;
  -1.1268 - 4.3335j;
  -0.3372 ]

for i = 1:6;

    SIG(i) = real(EIG(i));
    OMG(i) = imag(EIG(i));

    if  OMG(i) == 0;
        ZETA(i) = SIG(i);   
    else
        ZETA = -SIG ./(sqrt(SIG.^2 + OMG.^2));  
    end

end

【问题讨论】:

    标签: matlab controls evolutionary-algorithm


    【解决方案1】:

    您忘记在else 子句中包含索引。试试这个:

    EIG = [
     -18.7026;          
      -4.6179 + 7.4827j;
      -4.6179 - 7.4827j;
      -1.1268 + 4.3335j;
      -1.1268 - 4.3335j;
      -0.3372 ]
    
    for i = 1:6;
    
        SIG(i) = real(EIG(i));
        OMG(i) = imag(EIG(i));
    
        if  OMG(i) == 0;
            ZETA(i) = SIG(i);   
        else
            ZETA(i) = -SIG(i) ./(sqrt(SIG(i).^2 + OMG(i).^2));  
        end
    
    end
    

    【讨论】:

    • 感谢您的帮助! matlab 还是新手。
    【解决方案2】:

    就可读性和数学严谨性而言,这可能是一个更好的版本:

    EIG = [...
      -18.7026;
      -4.6179 + 7.4827j;
      -4.6179 - 7.4827j;
      -1.1268 + 4.3335j;
      -1.1268 - 4.3335j;
      -0.3372...
     ];
    
    ZETA = nan(size(EIG(:),1),1);
    for i = 1:size(EIG(:),1)
       if ~imag(EIG(i))
          ZETA(i) = real(EIG(i));   
       else
          ZETA(i) = -real(EIG(i)) /abs(EIG(i));  
       end
    end
    

    【讨论】:

    • 确实更容易阅读,让我想知道计算在数学上是否真的有意义。 --- 旁注:我认为isequal(abs(EIG(i)),abs(real(EIG(i))))可以简化为~image(EIG(i))
    • 很好,现在是我提交的版本。
    猜你喜欢
    • 2013-10-03
    • 2011-08-08
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    • 2019-02-14
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多