Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 将液体从一个气缸转移到另一个气缸_Matlab - Fatal编程技术网

Matlab 将液体从一个气缸转移到另一个气缸

Matlab 将液体从一个气缸转移到另一个气缸,matlab,Matlab,我试图模拟墨水通过多个滚筒系统的流动,但没有成功。当每个滚筒转动时,油墨根据给定的比率(例如0.5)被分开。 通过获取一些用户数据,我成功地绘制出了系统中的滚轮,但现在我完全被困在如何继续的问题上了!其中一些辊子将与多个辊子接触,因此,墨水将被等分,然后在到达生产线中的下一个辊子时再次减半 有人能推荐一个函数来声明这些连接位置,并在一定数量的系统革命后跟踪墨水分离吗?…我已经在python中使用字典尝试过了,尽管我似乎不能很好地将其转换为matlab 到目前为止,我使用的是Python: for

我试图模拟墨水通过多个滚筒系统的流动,但没有成功。当每个滚筒转动时,油墨根据给定的比率(例如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': []} 

由于您没有指定滚轮的确切型号,因此我将用极坐标表示它们,即使用中心点和半径。每个滚筒上的墨水将由附加值表示,例如:

% # 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);
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
很抱歉,我没有花太多精力通过矢量化来优化这些循环。无论如何,这些是每转中每个滚筒上的墨水量:


初始状态:[1 0]
革命#1:[0.33333 0.33333 0.33333]
革命2:[0.44444 0.27778 0.27778]
革命#3:[0.42593 0.28704 0.28704]


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

因为您没有指定滚轮的确切型号,所以我将用极坐标表示它们,即使用中心点和半径。每个滚筒上的墨水将由附加值表示,例如:

% # 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);
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
很抱歉,我没有花太多精力通过矢量化来优化这些循环。无论如何,这些是每转中每个滚筒上的墨水量:


初始状态:[1 0]
革命#1:[0.33333 0.33333 0.33333]
革命2:[0.44444 0.27778 0.27778]
革命#3:[0.42593 0.28704 0.28704]


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

对于初学者,您可以共享当前(即使不工作)代码。否则,您只是要求从头开始实现一个解决方案。对此表示歉意,我不想混淆这个问题,因为我的代码仍然使用python…这是一个简化版本,请注意,“nips”指的是两个卷之间的连接点:不要在注释中发布代码,如果您希望人们阅读它,就不要这样做。编辑您的问题。@richyo1000:注释会弄乱代码的格式,这对于Python代码来说尤其烦人。我现在已经编辑了你的问题,但在将来,请包括重现问题所需的最低代码,或者在任何情况下,。谢谢!我还刚刚提交了一个修订版,包括一些python代码,但由于某种原因,它没有发布!如果有人想看的话,我可以再做一次,否则我将非常感谢您的帮助!为初学者干杯,您可以共享当前(即使不工作)代码。否则,您只是要求从头开始实现一个解决方案。对此表示歉意,我不想混淆这个问题,因为我的代码仍然使用python…这是一个简化版本,请注意,“nips”指的是两个卷之间的连接点:不要在注释中发布代码,如果您希望人们阅读它,就不要这样做。编辑您的问题。@richyo1000:注释会弄乱代码的格式,这对于Python代码来说尤其烦人。我现在已经编辑了你的问题,但在将来,请包括重现问题所需的最低代码,或者在任何情况下,。谢谢!我还刚刚提交了一个修订版,包括一些python代码,但由于某种原因,它没有发布!如果有人想看的话,我可以再做一次,否则我将非常感谢您的帮助!干杯你在英国吗?我欠你很多啤酒!!你制作的图像与我绘制的图像惊人地接近!我已经坚持了一个多星期了,你在一个小时内就解决了,非常感谢!很高兴帮忙:)事实上,我刚从英国和爱尔兰访问回来!下次我在那里,我会让你坚持下去的!:)