2012-11-05 58 views
0

我試圖通過許多滾筒系統模擬墨水流動失敗。隨着每個輥子轉動,墨水根據給定的比率(比如0.5)分裂。 我已經設法通過獲取用戶數據來繪製系統中的滾筒,但我現在完全停留在如何繼續!這些輥子中的一些將與多於一個輥子接觸,因此,油墨將被均勻分割,然後在到達生產線中的下一個輥子時再次減半。將流體從一個氣缸轉移到另一個氣缸

任何人都可以提出一個函數聲明這些連接位置,並跟蹤墨水分裂後,一定數量的系統革命?我試過這在python使用字典,雖然我似乎無法翻譯這對matlab特別好。

什麼我迄今在Python:

for i in range(num_rollers): 
    roller_data() 

for i in range(0,num_rollers): 
    for j in range(Rollers[i]['segments']): 
     Rollers[i]['ink'].append(0) 

# Initialise nips 
Nips = [{} for i in range(num_nips)] 
Nips[0] = {'rollers': [0, 1], 'locations': []} 
Nips[1] = {'rollers': [1, 2], 'locations': []} 
Nips[2] = {'rollers': [2, 3], 'locations': []} 
+2

對於初學者,您可以分享您當前的(即使不工作)代碼。否則,你只是要求從零開始實施解決方案。 –

+0

爲此道歉,我不想混淆問題,因爲我的代碼仍然在python中...這是一個減少版本,請注意'壓區'是指滾子之間的連接點: – richyo1000

+3

請勿發佈代碼在評論中,而不是如果你想讓人們閱讀它。編輯你的問題。 –

回答

3

既然你沒有說明你的輥的確切型號,我將代表他們在極地配位,與中心點和一個半徑。上的每個滾子的墨水將通過附加的值來表示,例如:

% # Initial state 
C = [0, 0; -0.8, -0.6; 1, 0]; % # Roller centers (x, y) 
R = [0.5, 0.5, 0.5];   % # Roller radii (r) 
ink = [1, 0, 0];    % # Amount of ink on each roller 
N = numel(R);     % # Amount of rollers 

這裏有墨僅在輥#1(我選擇這些值任意地,所以它們可以被改變,當然)。爲了您的方便,你可以得出輥像這樣:

% # Draw the rollers 
figure, hold on 
ang = 0:0.1:(2 * pi); 
for i = 1:N 
    plot(C(i, 2) + R(i) * cos(ang), C(i, 1) + R(i) * sin(ang)) 
    text(C(i, 2), C(i, 1), num2str(i)) 
end 
title('Ink rollers'), axis image 

這應該產生如下圖:

Rollers
我會讓你來畫上每個滾子墨:P

現在業務:

1)首先,我們鰭d所有連接的輥:

% # Find connected rollers 
isconn = @(m, n)(sum(([1, -1] * C([m, n], :)) .^ 2) - sum(R([m, n])) .^ 2 < eps); 
[Y, X] = meshgrid(1:N, 1:N); 
conn = reshape(arrayfun(isconn, X(:), Y(:)), N, N) - eye(N); 

這產生一個矩陣,其中在位置的每個元件(Ĵ)是1,如果滾子和輥Ĵ被連接,並且0,如果不。在這個例子中,我們得到:

conn = 

    0  1  1 
    1  0  0 
    1  0  0 

2)下一步驟是通過運行預定的迭代數量來模擬油墨流。在每次迭代中,我們模擬每個滾筒的一次旋轉,即,即,我們遍歷每個滾筒並在它和它的鄰居之間平均分配墨水。

% # Simulate ink flow for a number of revolutions 
disp([sprintf('Initial state:\t\t'), '[', num2str(ink), ']']) 
revolutions = 3; 
for ii = 1:revolutions 
    new_ink = zeros(size(ink)); 

    % # Iterate over each roller 
    for jj = 1:N 
     if (ink(jj) > 0) 
      delta_ink = ink(jj)/(sum(conn(jj, :)) + 1); 
      idx = [jj, find(conn(jj, :))]; % # roller jj and its neighbors 
      new_ink(idx) = new_ink(idx) + delta_ink; 
     end 
    end 
    ink = new_ink; 
    disp([sprintf('Revolution #%d:\t\t', ii), '[', num2str(ink), ']']) 
end 

我很抱歉,我沒有把太多精力花在通過量化優化這些循環。無論如何,這些都是油墨在每個革命的每個輥金額:

Initial state: [1 0 0]
Revolution #1: [0.33333 0.33333 0.33333]
Revolution #2: [0.44444 0.27778 0.27778]
Revolution #3: [0.42593 0.28704 0.28704]

很明顯,你可以很容易地把這個代碼到返回輥的最後狀態的功能,或任何您選擇的其他輸出。此外,您還可以修改算法以根據滾筒的半徑處理不同的分束比。祝你好運!

+1

!你在英國嗎?我欠你很多很多啤酒!!你製作的圖片與我繪製的圖片非常接近!我已經堅持了一個多星期了,你在一個小時內就解決了,謝謝你真是太棒了! – richyo1000

+1

很高興幫助:)其實,我剛從英國和愛爾蘭的訪問回來!下一次我在那裏,我會抓住你的! :) –