我写了以下代码:
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个元素会发生什么。
答案 0 :(得分:4)
我不知道你是如何让这个永远运行的。对我来说,它看起来好像根本不会运行。这不会回答你的问题,但希望在途中帮助你=)
V(:,I)=V;
什么是I
?应该是i
吗?顺便说一下,不建议在MATLAB中使用using i
and j
as variables(但是,如果你不在你的领域使用复数,你就不应该太在意)。 这部分:
A = V(:, [1])
transpose(A)
modes(:, n) = A
可以简单地写成:
modes(:,n) = V(:,1)';
假设您想要转换A
。 transpose(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')
结果图:
如果我没有破坏任何东西(很难知道你在使用I
做了什么),也许这可能会有所帮助。