2012-11-05 57 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

很高兴帮助:)其实,我刚从英国和爱尔兰的访问回来!下一次我在那里,我会抓住你的! :) –