Matlab 将液体从一个气缸转移到另一个气缸
我试图模拟墨水通过多个滚筒系统的流动,但没有成功。当每个滚筒转动时,油墨根据给定的比率(例如0.5)被分开。 通过获取一些用户数据,我成功地绘制出了系统中的滚轮,但现在我完全被困在如何继续的问题上了!其中一些辊子将与多个辊子接触,因此,墨水将被等分,然后在到达生产线中的下一个辊子时再次减半 有人能推荐一个函数来声明这些连接位置,并在一定数量的系统革命后跟踪墨水分离吗?…我已经在python中使用字典尝试过了,尽管我似乎不能很好地将其转换为matlab 到目前为止,我使用的是Python:Matlab 将液体从一个气缸转移到另一个气缸,matlab,Matlab,我试图模拟墨水通过多个滚筒系统的流动,但没有成功。当每个滚筒转动时,油墨根据给定的比率(例如0.5)被分开。 通过获取一些用户数据,我成功地绘制出了系统中的滚轮,但现在我完全被困在如何继续的问题上了!其中一些辊子将与多个辊子接触,因此,墨水将被等分,然后在到达生产线中的下一个辊子时再次减半 有人能推荐一个函数来声明这些连接位置,并在一定数量的系统革命后跟踪墨水分离吗?…我已经在python中使用字典尝试过了,尽管我似乎不能很好地将其转换为matlab 到目前为止,我使用的是Python: for
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代码,但由于某种原因,它没有发布!如果有人想看的话,我可以再做一次,否则我将非常感谢您的帮助!干杯你在英国吗?我欠你很多啤酒!!你制作的图像与我绘制的图像惊人地接近!我已经坚持了一个多星期了,你在一个小时内就解决了,非常感谢!很高兴帮忙:)事实上,我刚从英国和爱尔兰访问回来!下次我在那里,我会让你坚持下去的!:)