我在SO的帮助下编写了代码,将k_12的值绘制成了频率。 但是,现在我需要绘制3个图形,每个频率一个,x轴上的k_12值和y轴上相应的3个模式形状。对于每个频率,模式形状以矩阵V的列排列。这是一段代码:
M = [3 0 0; 0 2 0; 0 0 0.5] % mass matrix
i_vals = 1:1000:60e07; % values of k_12 from 1 to 60 million in steps of 1000
freq = 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);
values=diag(L);
[values,I]=sort(values);
V(:,I)=V; % V is the mode shapes matrix (3x3)
freq(:, n)=sqrt(values)/(2*pi);
end
h = loglog(i_vals, freq');
title('Effect of change of value of k_1_2 on the value of natural frequency');
xlabel('Value of k_1_2 [N/m]');
ylabel('Value of natural frequency [Hz]');
hleg1 = legend('\omega_n_r_1','\omega_n_r_2', '\omega_n_r_3');
grid on;
grid minor;
我知道我必须添加三行
loglog(i_vals, "something")
loglog(i_vals, "something 2")
loglog(i_vals, "something 3")
问题在于我不知道该写些什么东西。 谢谢你的任何建议。
修改 我必须错误地解释自己,我想做的是用相应频率的模式形状的值绘制3个不同的图形,也就是说,给定
"Frequencies [Hz]
186.6438 331.3465 514.6650
Mode shape vectors in the columns of matrix [V]
% 1st freq 2nd freq 3rd freq
0.3285 0.4578 -0.1257
0.5640 -0.4219 -0.0627
0.2831 0.1743 1.3746"
我想获得第一频率和相应模式形状(第一列)的图形,第二频率和相应的模式形状等等。
编辑2 我发布的代码片段改变了刚度k的值并绘制了3个频率 换句话说,它在同一图表上绘制了来自频率矩阵的3个频率的值:
我现在要做的是绘制x轴上的刚度k值和y轴上的模式形状值,即a1,a2和a3;在第二个图上,刚度k对b1,b2和b3以及第三个图刚度k对c1,c2和c3。感谢。
答案 0 :(得分:1)
假设你想要三个单独的图表,你还需要在每个图表之前调用figure
,否则它只会覆盖上一个图表。
您可以使用freq( rowNumber , : )
表示法访问单个行,该行包含您的一个数据集(将rowNumber
替换为行的数值)。
如果我们组合所有内容并添加与所有三个数据集的图相同的线颜色(使用此处的loglog
的第三个参数),我们得到:
figure;
loglog(i_vals, freq(1,:),'b');
% Add titles, scales, gridlines, etc here...
figure;
loglog(i_vals, freq(2,:),'g');
% Add titles, scales, gridlines, etc here...
figure;
loglog(i_vals, freq(3,:),'r');
% Add titles, scales, gridlines, etc here...
当然,您需要添加图例,正确的比例尺,网格线和其他辅助工具,以便根据需要单独理解每个图形。
这可以包含在for
循环中,但我觉得这种扩展的样式可以更好地勾勒出正在发生的事情。
答案 1 :(得分:1)
我认为你有一个复杂的问题和大数据。你真的应该在教程中学习MATLAB的基础知识(有很多)。你做了很多初学者的错误 - 我认为这样做是为了帮助你而不是为了你的工作。
所以我只给你一些提示:
您无法绘制V,因为每次循环都会覆盖它。您应该将所有值保存在一个变量中(它具有三个维度)。您可以通过以下方式使用单元格数组:
a {1} = [1,2; 3,4];
a {2} = [10,20; 30,40];
a {2} =(2,2)
有关单元格数组的更多信息,请询问Google; - )
尽量避免循环。它们让你的代码变得太慢了。