在绘制图形时,循环似乎永远存在

时间:2013-12-12 19:28:59

标签: matlab for-loop

我写了以下代码:

    M = [3 0 0; 0 2 0; 0 0 0.5]    % mass matrix

    i_vals = 1:1000:60e06;    % values of k_12 from 1 to 600 million in steps of 1000
    modes = zeros(3, length(i_vals));

    for n=1:length(i_vals)
        i = i_vals(n)    % i is the value of k_12
        K = [i+8e06 -i -2e06; -i i+2e06 -1e06; -2e06 -1e06 5e06];    % stiffness matrix

        [V,L]=eig(K,M);         
        V(:,I)=V;               
        A = V(:, [1])
        transpose(A)
        modes(:, n) = A

    end
    loglog(i_vals, modes')

但循环似乎永远存在,我现在知道它有什么问题。我们的想法是从矩阵V中获取第一列,并看看当k_12的值发生变化时,此列中的3个元素会发生什么。

2 个答案:

答案 0 :(得分:4)

我不知道你是如何让这个永远运行的。对我来说,它看起来好像根本不会运行。这不会回答你的问题,但希望在途中帮助你=)

  1. 你想用这条线做什么? V(:,I)=V;什么是I?应该是i吗?顺便说一下,不建议在MATLAB中使用using i and j as variables(但是,如果你不在你的领域使用复数,你就不应该太在意)。
  2. 你有一个60,000次的循环,计算特征值等。这必然需要时间(尽管不是永远的,正如你所说的那样)。你应该最终得到答案(如果只有其余的代码工作)。你的情节的分辨率将足够准确,一次有10,000或甚至100,000步。
  3. 这部分:

       A = V(:, [1])
       transpose(A)
       modes(:, n) = A
    

    可以简单地写成:

    modes(:,n) = V(:,1)';
    

    假设您想要转换Atranspose(A)实际上并没有在这种情况下做任何事情。您必须A = transpose(A)(或更确切地说A = A')才能发挥作用。

答案 1 :(得分:4)

您的代码存在各种问题 - 其中一些可能会导致您的问题。

  • 您在线性刻度上计算i的值,但最终将以对数刻度绘制。当图表中没有任何可见的内容时,您正在进行大量的工作。使用i_vals的对数比例要好得多:

i_vals = logspace(0, 7.778, 200); % to get 200 log spaced values from 
                                  % 1 to approx 60E6`
  • 您正在使用尚未定义的变量I(在您提供的代码段中)。根据其大小,您可能会发现V正在增长......
  • 您正在使用变量名称i - 虽然这是合法的,但它会覆盖内置的(sqrt(-1)),我个人觉得这很麻烦。
  • 您的transpose(A);行没有执行任何操作(您必须执行A = transpose(A);)。
  • 在几行之后你没有; - 这将使Matlab想要打印到控制台。这将占用大量资源。在每个语句后用;抑制输出。

编辑以下程序快速运行:

M = [3  0  0.0; 
     0  2  0.0; 
     0  0  0.5];   % mass matrix

i_vals = logspace(0, 7.78, 200);    % values of k_12 from 1 to 600 million in steps of 1000
modes = zeros(3, length(i_vals));

for n=1:length(i_vals)
    i = i_vals(n);    % i is the value of k_12
    K = [i+8e06 -i -2e06; -i i+2e06 -1e06; -2e06 -1e06 5e06];    % stiffness matrix

    [V,L]=eig(K,M);         

    modes(:, n) = V(:,1);

end

loglog(i_vals, modes')

结果图: enter image description here

如果我没有破坏任何东西(很难知道你在使用I做了什么),也许这可能会有所帮助。