将流体从一个气缸转移到另一个气缸

时间:2012-11-05 09:38:32

标签: matlab

我尝试通过多个滚轮系统模拟墨水流动失败。当每个辊子转动时,墨水根据给定的比例(例如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': []} 

1 个答案:

答案 0 :(得分: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)首先我们找到所有连接的滚轮:

% # 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);

这会生成一个矩阵,其中位置( i j )中的每个元素如果滚轮 i 且滚轮,则为1 j 已连接,如果不连接则为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]

显然,您可以轻松地将此代码放入一个函数中,该函数返回滚轴的最后状态或您选择的任何其他输出。此外,您还可以修改算法,以根据滚子的半径处理不同的分流比。祝你好运!