在八度音程中动画化多个 body 轨迹

animating multiple body trajectories in octave

我知道 octave 中的 hold on; 命令允许我在同一个图形中绘制多个轨迹。但是,我最近遇到了函数 'comet'。它在用户定义的时间范围内动画显示系统状态。我只成功地将它用于一个简单的代码,该代码显示了一个小 body 围绕固定质量 body 的轨迹。我如何使用 'comet' 在同一时间范围内为 2 个物体的轨迹设置动画?

PS:如果您需要一个示例来说明 'comet' 是如何工作的,这里是我上面提到的简单代码:

function xdot = f(x,t)
  G = 1.37;
  M = 10^5;
  [T,r] = cart2pol(x(1),x(2));
  xdot(3) = -((G*M)/((x(1)^2) + (x(2)^2)))*cos(T);
  xdot(4) = -((G*M)/((x(1)^2) + (x(2)^2)))*sin(T);
  xdot(1) = x(3);
  xdot(2) = x(4);
endfunction

X = lsode ("f", [1000,0,5,10],(t = linspace(0,1000,2000)'));
comet(X(:,1),X(:,2),0.01);

这基本上绘制了随时间变化的轨迹。您可以复制粘贴到八度音阶并查看动画。

谁能告诉我如何对 2 body 或多个 body 系统做同样的事情?

你不能那样使用彗星。您必须手动执行 'animation',但这并不难。另外,您可以获得更好的可定制性。这是一种方法。

X1 = lsode ("f", [1000, 0, 5, 10], (t = linspace(0,1000,2000)'));
X2 = lsode ("f", [500,  0, 4, 5 ], (t = linspace(0,1000,2000)'));
x_low  = min ([X1(:, 1); X2(:, 1)]);    x_high = max ([X1(:, 1); X2(:, 1)]);
y_low  = min ([X1(:, 2); X2(:, 2)]);    y_high = max ([X1(:, 2); X2(:, 2)]);

for n = 1 : size (X1, 1)
  plot (X1(1:n, 1), X1(1:n, 2), ':', 'color', [0, 0.5, 1], 'linewidth', 2);
  hold on; 
  plot (X1(n, 1), X1(n, 2), 'o', 'markerfacecolor', 'g', 'markeredgecolor', 'k', 'markersize', 10);
  plot (X2(1:n, 1), X2(1:n, 2), ':', 'color', [1, 0.5, 0], 'linewidth', 2);
  plot (X2(n, 1), X2(n, 2), 'o', 'markerfacecolor', 'm', 'markeredgecolor', 'k', 'markersize', 10);
  hold off;   
  axis ([x_low, x_high, y_low, y_high]); % needed, otherwise first few plots will
                                         % use automatic axis limits
  drawnow; pause(0.01);
end

这是最直接的方式,但如果刷新率低于出图时间,速度可能没有0.01那么快;如果你只绘制一次并在每一步更改每个绘图对象的数据,你可以让它更快。

此外,这个 'animation' 只是为了在 八度音阶会话中可视化。如果您想从中生成视频文件,则必须生成图像并转换为电影/gif 格式等。