首页 文章

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

提问于
浏览
1

我在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")

问题是我不知道该写什么“东西” . 谢谢你的建议 .

EDIT: 我必须自己解释不正确,我想要做的是用相应频率的模式形状值绘制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"

我想获得第一频率和相应模式形状(第一列)的图形,第二频率和相应的模式形状等 .

EDIT 2 我发布的代码片段改变了刚度k的值并绘制了3个频率
graph
换句话说,它在同一个图表上绘制了来自频率矩阵的3个频率的值:

matrix

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

2 回答

  • 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

    我认为你有一个复杂的问题和大数据 . 你真的应该在教程中学习MATLAB的基础知识(有很多) . 你正在做很多初学者的错误 - 我认为这样做是为了帮助你而不是为了你的工作 .

    所以我只给你一些提示:

    • 您无法绘制V,因为每次循环都会覆盖它 . 您应该将所有值保存在一个变量中(它具有三个维度) . 您可以通过以下方式使用单元格数组:

    a {1} = [1,2; 3,4];

    a {2} = [10,20; 30,40];

    a {2} =(2,2)

    有关单元格阵列的更多信息,请询问Google ;-)

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

    • 在第7行的末尾添加";" . 它也会加速你的代码 .

    • 首先尝试一些小例子 . 然后,您将了解每个步骤的工作原理 .

    • 我不想如何在一个变量上绘制三个值(a1,a2,a3) . 您应该更详细地描述这一点 .

    祝好运!

相关问题