2013-12-12 61 views
0

我寫了下面的一段代碼時,永遠繼續:循環似乎繪製圖表

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

你確實意識到你必須循環60000次?什麼是'V(:, I)= V;'應該這樣做?這不會導致每個迭代都會增加「V」嗎?所有複製到越來越大的陣列可以真正減慢速度。當你讓i_vals小得多時,這是否工作? (比如說停在6001,所以只有6個循環)? – Floris

+0

(嚴格來說,'60e6'是_60_0000,不是600)=) –

+0

@ user2579288,請考慮接受下面的答案之一。就目前來看,這個問題似乎沒有答案。 –

回答

4

我不知道你是如何讓這個運行永遠。對我來說,它看起來好像根本不會運行。這不會回答你的問題,但希望能幫助你的方式=)

  1. 你想用這條線做什麼? V(:,I)=V;什麼是I?它應該是i?順便說一下,不建議在MATLAB中使用using i and j as variables(但是,如果你不在場中使用複數,你應該不會太在意)。
  2. 你有一個60,000次循環,計算特徵值等。這必然需要時間(儘管不是永遠的,就像你說的那樣)。你應該最終得到答案(如果只有其餘的代碼工作)。你的情節的分辨率將足夠準確,每次10,000或甚至100,000步。

這一部分:

modes(:,n) = V(:,1)'; 

假設你要換位的A

A = V(:, [1]) 
    transpose(A) 
    modes(:, n) = A 

可以簡單地書面。實際上,在這種情況下,transpose(A)什麼都不做。您必須執行A = transpose(A)(或者A = A')才能正常工作。

+1

好吧 - 我們在同一時間寫了非常類似的想法......我必須爲此贊成你。 – Floris

+1

我想你也應該爲'logspace'設置一個=) –

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') 

結果圖: enter image description here

如果我沒有破壞任何東西(很難知道你I在做什麼),也許這可能會有所幫助。

+1

[閃回...](http://stackoverflow.com/questions/17134389/explanation-of-the-matlab-coding/17134786#17134786)= P –

+0

@RobertP。 - 你在哪裏挖掘了那個......你在說我寫回答的方式有什麼問題嗎? :-) – Floris

+0

不...我通過指出代碼問題回答,幾分鐘後跟進「最佳實踐」... =)好的答案btw! –