在八度音程中动画化多个 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 格式等。
我知道 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 格式等。