2014年9月6日土曜日

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

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

今回もC/C++を勉強していた時のテキストブックに出ていたプログラムをScilabで作ってみました。

関数の定義には、多少ですが、前回とは違う方法があり、これを使いました。

倍音としてSine波を徐々に重ね合わせていくとのこぎり波に近づいていく様子が分かると思います。

関数形は下記より調べ、k=11まで重ね合わせて作成したものが下のアニメーションです。kの数を増やしていくとさらにきれいなのこぎり波となっていきます。
Wiki: のこぎり波


図はGifフォーマットで吐き出させて編集した擬似動画ですが、波形表示までのエッセンスの部分は次の通りです。昔、C言語で書いた時にはもっともっと長かった記憶があります。20年も前なのでグラフ表示のコーディング部分も大変だったということもありますが。

個人的には感動してしまいました。

// Demonstration of Sawteeth Wave by superimposing Sine waves
// (Abbreviated Demonstration Version, adding a series of Sine wave
//   approximates a sawteeth wave)
// Authoer: Nolan00267
// Date:    August 8, 2014

clear;

// Parameters
t0=0;tmax=30;
t=t0:0.01:tmax;    // Time Span
k=10;              // # of order
a=2*%pi;           // Cycle

//  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));
plot(t,s1, 'r');

// Creating the sine waves and displaying
for i=1:k
    s2=s2+sig2(t,i);
    sleep(300);
    clf();
    plot(t,s2);  
end


最終のコードはこちらを参照ください。
付録:グラフのフォーマット等のお化粧をした最終のScilabコード

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

追記
ImageMagicを使ったGifアニメーションはループになっていなかったので、最終的にはAdobeのFlashを使いました。アニメに出力した際グラフの線が途切れ途切れになってしまい苦労しました。画像サイズをFlash上で変えないほうが良いようです。



0 件のコメント:

コメントを投稿