2017-07-21 7 views
1

私はオクターブでhold on;コマンドを使用して、同じ図形内に複数の軌跡をプロットできることを知っています。しかし、私は最近、「彗星」という機能を見つけました。これは、ユーザが定義した時間範囲にわたってシステムの状態をアニメートします。私は固定された大規模な体の周りの小さな体の軌道を示す簡単なコードのためにそれを首尾よく使用しました。どのように私は2つのボディの軌跡を同じ時間範囲でアニメートするために '彗星'を使うことができますか?オクターブで複数のボディ軌道をアニメ化する

PS:

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体または複数体のシステムで同じことをする方法を教えてもらえますか?

答えて

2

あなたは本当にそのように彗星を使うことはできません。あなたは手動でアニメーションを行う必要がありますが、それは難しいことではありません。さらに、カスタマイズ性が向上します。 1つのアプローチがあります。

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ほど速くないかもしれません。一度プロットして、各ステップで各プロットオブジェクトのデータを変更するだけで、さらに高速化できます。

また、この「アニメーション」は、をオクターブセッションのに視覚化するためのものです。あなたの代わりに、このからのビデオファイルを作成したい場合は、

enter image description here

+0

おかげでたくさんの画像を生成し、映画/ GIF形式などに変換する必要があります。これは私にとって素晴らしいことです。 – Lelouch

関連する問題