0

多くのローラーのシステムを通るインクの流れをシミュレートしようとして失敗しました。各ローラーが回転すると、インクは所定の比率(たとえば0.5)に応じて分割されます。いくつかのユーザーデータを取得することで、システム内のローラーをプロットすることができましたが、今は完全に進め方に固執しています!これらのローラーの一部は複数のローラーと接触するため、インクは均等に分割され、ライン内の次のローラーに到達すると再び半分になります。

誰かがこれらの接続位置を宣言し、特定のシステム回転後のインク分割を追跡するための関数を提案できますか?...これを特にmatlabに変換することはできないようですが、辞書を使用してPythonでこれを試しました良い。

私がこれまでに持っているのは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': []} 
4

1 に答える 1

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

これにより、次の画像が生成されます。

ローラー
各ローラーにインクを描くのはあなたに任せます: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とローラーjが接続されている場合は 1 であり、接続されていない場合は 0 である行列を生成します。この例では、次のようになります。

conn =

     0     1     1
     1     0     0
     1     0     0

2) 次のステップでは、所定の反復回数を実行して、インクの流れをシミュレートします。各反復で、各ローラーの 1 回転をシミュレートします。つまり、各ローラーを調べて、そのローラーとその隣のローラーの間でインクを均等に分割します。

% # 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]

明らかに、このコードをローラーの最後の状態を返す関数、または選択したその他の出力に簡単に入れることができます。さらに、アルゴリズムを修正して、ローラーの半径に応じて異なる分割比率を処理することもできます。幸運を!

于 2012-11-05T15:06:28.173 に答える