如何使用3x3矩阵中的列排列的值绘制3个图形?

时间:2013-12-12 11:57:36

标签: matlab graph matrix

我在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个频率 graph 换句话说,它在同一图表上绘制了来自频率矩阵的3个频率的值:

matrix

我现在要做的是绘制x轴上的刚度k值和y轴上的模式形状值,即a1,a2和a3;在第二个图上,刚度k对b1,b2和b3以及第三个图刚度k对c1,c2和c3。感谢。

2 个答案:

答案 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; - )

  • 尽量避免循环。它们让你的代码变得太慢了。

  • 添加“;”在第7行的末尾。它也会加速你的代码。
  • 首先尝试一些小例子。然后,您将了解每个步骤的工作原理。
  • 我不想知道如何在一个变量上绘制三个值(a1,a2,a3)。您应该更详细地描述这一点。
祝你好运!