2014年11月23日日曜日

付録:グラフのお化粧およびアニメーションの作成 : 最終のScilabコード(1)

※ ソースコードを見やすくするために、Syntaxhilighterを使っています。状況によって表示に時間がかかる場合があります。


前回Sine波を重ね合わせてのこぎり波を近似するプログラムを前回紹介しました。

Scilabにおける関数の定義と使い方(2)

波形を表示するエッセンスの部分は非常に短いコードですが、グラフのタイトルや軸の名称がなかったり、表示ごとに縦軸の最大値が表示波形の振幅に伴って変わってしまうなど問題が残っています。

その際エッセンスの部分のコードだけ紹介しましたが、グラフのフォーマットなどを含めた最終的なものをご参考に記載します。最後に描かせたグラフを静止画のgifフォーマットとして出力させています。





さて、多少お化粧した上で、表示された波形をGifイメージとしてファイルに書き出すまでを目標にしましょう。

ここではあとでつなぎ合わせることを想定して、連番で書き出すようにしました。

縦軸を固定したり、グラフのプロパティの指定のしかたはヘルプなどをもとにだいぶ勉強しました。

またタイトルにはForループのカウンターを利用してには「kth orderの項までの重ね合わせ」と表示されるようにしました。Matlabにあるint2strという関数がありませんが、あまりエレガントな方法ではないかも知れませんが、一応目的は達成しました。

何かの参考になれば幸いです。

複数枚の静止画を集めて擬似動画にするために始め、ImageMagicを使いました。が、ループがうまくいかないので最終的にはFalshを使いました。


// Demonstration of Sawteeth Wave by superimposing Sine waves
// Authoer: Nolan00267
// Date:    August 8, 2014
// 
clear;
t0=0;tmax=30;
t=t0:0.01:tmax;    // Time Span
k=10;           //
a=2*%pi;        // Cycle

// Filename for the GIF output
// For animeation, it will have a suffix number
// Animation is to be created using convert.exe by
// http://www.imagemagick.org
i=0;
file_name=sprintf("scilab_anim_%i", i);

//  Defining the waveforms
//  s1 is the Sawteeth Wave, and s2 is Sine Waves
deff('s1=sig(t,a)', 's1=1-2*(t/a - floor(t/a))');
deff('s2=sig2(t,k)', 's2=2*(sin(k*t)/k)/%pi');

//  Initializing the Array for the Sine Wave
s2=zeros(1001,0);

// Creating a sawteeth wave and displaying
scf(1);clf();
s1=sig(t,a); //2*(t/a - floor(t/a+1/2));
a=get("current_axes");
xlabel("t"); ylabel("Signal");
//a.x_label="t"; a.y_label="Signal";
a.data_bounds=[t0,-1.2;tmax ,1.2];

plot(t,s1, 'r');

// Outputting as GIF format
xs2gif(1, file_name);

// Creating the sine waves and displaying
for i=1:k
    file_name=sprintf("scilab_anim_%i", i);
    s2=s2+sig2(t,i);
    sleep(300);
    clf();
    str=sprintf(" k=%i ",i);
    title(str);
//    xlabel("t"); ylabel("Signal");
    a=get("current_axes");
xlabel("t"); ylabel("Signal");
//a.x_label="t"; a.y_label="Signal";
a.data_bounds=[0,-1.2;30,1.2];
    plot(t,s2);
    
// Outputting as GIF format
    xs2gif(1, file_name);
end

// The original sawtooth wave and the sine waves
scf(2);clf();
xlabel("t"); ylabel("Signal");
str2=sprintf(" The original Sawtooth Wave and %ith-order Sine wave\n", i);
title(str2);

// Final waveform comparison
a=get("current_axes");
xlabel("t"); ylabel("Signal");
//a.x_label="t"; a.y_label="Signal";
a.data_bounds=[t0,-1.2;tmax ,1.2];
plot(t,s1, 'r');
plot(t,s2);

// Outputting as GIF format
file_name=sprintf("scilab_anim_%i", i+1);
xs2gif(2, file_name);


続きです~
付録:グラフのお化粧およびアニメーションの作成 : 最終のScilabコード (2)

この一連の学習を通して、「学び」について思いついたことをまとめました。
学びにおける「教科書や問題集からの自立」 ― いわゆる 「守・破・離」
 


0 件のコメント:

コメントを投稿