Animation 在倍频程中设置多个身体轨迹的动画

Animation 在倍频程中设置多个身体轨迹的动画,animation,octave,Animation,Octave,我知道等一下命令允许我在同一个图形中绘制多个轨迹。但是,我最近遇到了函数“comet”。它在用户定义的时间范围内设置系统状态的动画。我只成功地将其用于一个简单的代码,该代码显示了一个小物体围绕一个固定的大物体的轨迹。如何使用“comet”在同一时间范围内为两个物体的轨迹设置动画 PS:如果您需要“comet”如何工作的示例,下面是我上面提到的简单代码: function xdot = f(x,t) G = 1.37; M = 10^5; [T,r] = cart2pol(x(1),x

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

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体或多体系统做同样的事情吗?

你不能用那种方式使用comet。你必须手动制作“动画”,但这并不难。此外,您还可以获得更好的可定制性。这里有一种方法

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快;如果只打印一次并在每个步骤更改每个打印对象的数据,则可以使打印速度更快

此外,这个“动画”只是为了在八度音程中进行可视化。如果你想从中生成视频文件,你必须生成图像并转换成电影/gif格式等


非常感谢。我觉得这很好。