2013-12-04 2 views
0

Я пытаюсь построить график значения значения переменной x по оси x; Однако, есть три значения для каждой точки, то есть, собственная частота 1, частота собственных колебаний 2 и собственная частота 3. Это код, и он не работает:Построение графика с логарифмической осью - 3 значения y для каждого значения x

M = [3 0 0; 0 2 0; 0 0 0.5] 
% disp('Mass matrix [M]'); 
% disp(M); 

for i=1:1000:60e06 
    K = [i+7e06 i -6e06; i i+3e06 -3e06; -6e06 -3e06 10e06]; 
    % disp(K) 
    [V,L]=eig(K,M);  % eig is a standard Matlab function 
    values=diag(L);  % diag gets the values from the leading diagonal 
    [values,I]=sort(values); % sort into ascending order of frequency 
    V(:,I)=V;     % now sort the mode shape vectors 
    freq=sqrt(values)/(2*pi); % this divides all elements by 2 pi 

    % disp('Eigenvalues [s^(-2)]'); 
    % disp(values');  % the quote mark after values prints the column vector as a row 

    % disp('Frequencies [Hz]'); 
    % disp(freq'); 

    % disp('Mode shape vectors in the columns of matrix [V]'); 
    % disp(V); 
     loglog(i, freq(1:1), i, freq(2:1), i, freq(3:1) 
end 

Извиняюсь за ошибки, Я начинающий.

+0

'1: 1',' 2: 1' и '3: 1 'не может быть то, что вы на самом деле означает, возможно, вы собираетесь 'freq (1, 1)', 'freq (2, 1)' и 'freq (3, 1)', но трудно сказать: вы должны быть более конкретными, чем «неработающие». Что вы видели, а что вы ожидали увидеть? Также обратите внимание, что без 'hold on' или' pause' после 'loglog' цикл будет просто переписывать график быстрее, чем вы можете видеть. – jez

ответ

2

Вы пропускаете закрывающую скобку в конце вашей линии

loglog(i, freq(1:1), i, freq(2:1), i, freq(3:1) 

Кроме того, я не вижу причин для вашего 2:1, 3:1, ...?!

Заменить его

loglog(i, freq(1), i, freq(2), i, freq(3)) 

, и я не вижу ничего плохого с вашим черчения.

В целом я предлагаю хранить значения freq в некотором массиве и рассчитать его отдельно. Это ускорит сценарий до много, т.е.

%preallocate freq, the number of iterations in the loop is important here 
freq = zeros(3,length(1:1e3:60e6)) 

for i = ... 
    %your loop goes here 
    %remove freq = ... 
    %remove loglog(... 
    freq(:,i) = sqrt(values)/(2*pi); % this divides all elements by 2 pi 
end 

loglog(1:1e3:60e6, freq(1,:)) %plot first curve 
loglog(1:1e3:60e6, freq(2,:)) %plot second curve 
loglog(1:1e3:60e6, freq(3,:)) %plot third curve 
2

Ваша проблема заключается в том, что у вас есть loglog внутри цикла.

Перед цикла, я поставил:

i_vals = 1:1000:60e06; 
freq = zeros(3, length(i_vals)); 

изменить верхнюю часть петли на:

for n=1:length(i_vals) 
    i = i_vals(n); 
    K = [i+7e06 i -6e06; i i+3e06 -3e06; -6e06 -3e06 10e06]; 
    ... 

Также изменить freq назначение:

freq(:, n)=sqrt(values)/(2*pi); 

Удаление loglog и поместите это после/вне вашей петли.

loglog(i_vals, freq') 

Делая все, что дает мне это:

enter image description here

+0

Спасибо. Я пытался использовать ваш метод для построения трех графиков: 1 для каждой частоты с 3 соответствующими формами режима (1 частота соответствует 3 формам моды, расположенным в столбце ниже в матрице V). Однако ни один из методов, которые я использовал, не работает. – user2579288

+0

Эй, ваш ответ был действительно полезным в прошлый раз, есть ли возможность ответить на мой последний вопрос? Большое спасибо. – user2579288

+0

Если вам нужны три графика, тогда сделайте три графика. 'figure, loglog (i_vals, freq (1, :)), figure, loglog (i_vals, freq (2, :)), figure, loglog (i_vals, freq (3, :))' –

Смежные вопросы