back | サーバ選択 (基本, ミラー) |
Scilab
つかいませんか --- Scilab を使うための ABC --- ★注意:'07.5.8現在, 「matlabつかいませんか」から 「Scilab つかいませんか」への 移行作業は残り約 25% です★ |
Link
|
---|---|
目次 | |
|
| ||
___________________________________________ Scilab-4.1 Copyright (c) 1989-2006 Consortium Scilab (INRIA, ENPC) ___________________________________________ Startup execution: loading initial environment --> |
|
|
環境 | ||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
演算---電卓として使う,関数一覧 | |||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
Scilab | BASIC (対応した書き方) |
BASIC (BASICに最適化) |
---|---|---|
>> x=linspace(0,%pi,101); >> y=sin(x); >> plot2d(x,y); | dim x(101),y(101) for i=0 to 100 x(i)=%pi*i/100 next i for i=0 to 100 y(i)=sin( x(i) ) next i ;グラフの座標系の定義 ;グラフの縦軸,横軸,目盛を書く for i=0 to 99 line(x(i),y(i))-(x(i+1),y(i+1)) next i | ;グラフの座標系の定義 ;グラフの縦軸,横軸,目盛を書く for i=0 to 100 x=%pi*i/100 y=sin( x ) if i>0 then line(x0,y0)-(x,y) x0=x y0=y next i |
演算---1次元配列,配列のグラフ化 (MATLABに違いがあれば) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
CD に刻まれる音を題材にしてグラフ表示をしてみよう。
ここでは,1 ms の間の現象を確認したいと考える。 ここで,取り扱うべき変数 t を,Δt という微小時間ごと取り扱う。 本来,時間は連続的に変化するが, ここでは Δt を十分に小さくすることで良しと考える。 >> t = 0:1E-7:0.001; >> size(t) 注意:1E-7 とは,1×10-7という意味である。即ち,0.1μs毎に扱う。 ここで,1kHz = 1000 Hz の正弦波を考える。 >> f1 = sin(2*%pi*1000*t); これをプロットしてみる。 >> plot2d(t,f1); カーソルを使えば元の行に直ぐに戻れる。 2kHz,10kHz,50kHz など幾つかの関数をプロットしてみよう。 以上は特に CD に限らない話であった。 ところで CD には,44.1 kHz という有限の時間でサンプリングされた情報が刻まれている。 (ここではグラフの書きやすさからサンプリング周波数を 40 kHz として話を進める。) すなわち,時間は飛び飛びになるのである。 fclk = 40 kHz ということは, Tclk = 25 μs である。 先ほどの例で言えば,t を 250 個ごとに使うことに対応する。 それでは,サンプリングした情報をグラフ化してみよう。 >> plot2d(t(1:250:10001),f1(1:250:10001),style=-1); 注意:plot2d 関数の 3 番目の引数の style=-1 は,値をプロットすることを意味する 以上の操作のうち,打ち込む行を整理。ただし,f1 はどれか一つを選ぶ: --> t = 0:1E-7:0.001; --> size(t) --> f1 = sin(2*%pi*1000*t); --> f1 = sin(2*%pi*2000*t); --> f1 = sin(2*%pi*10000*t); --> f1 = sin(2*%pi*39000*t); --> f1 = sin(2*%pi*41000*t); -->clf() --> plot2d(t,f1); --> plot2d(t(1:250:10001),f1(1:250:10001),style=-1); あるいは次の行を実行しておくと, >> tt = t(1:250:10001); あとは,次の 1 行で全てをまかなうことができる。 >> f=1000; clf(); plot2d(t,sin(2*%pi*f*t)); plot2d(tt,sin(2*%pi*f*tt),style=-4) |
文字列と入出力 ---きれいな出力を得るために--- | ||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
<
|
演算---2次元配列,配列のグラフ化 (MATLABに違いがあれば) | |||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
演算---マトリクス | ||||||||
---|---|---|---|---|---|---|---|---|
|
プログラミング(sce-ファイル) | ||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
応用---交流回路の電圧波形を計算(グラフの書き方) | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
系: R-L 直列回路
本来は,VR と VL の2つのグラフを同時に書かせたいが, グラフの座標が変わってしまうので,ここでは一つずつ書かせる。 → VL も書かせてみよう
注意: V はスカラーであるため(配列ではないので), 続く掛け算は * でも良いが, .* でもエラーにならないので, むしろ打ち間違いを防ぐために積極的に .* を使うことを勧める。
|
応用---実験データの整理(データと,回帰線) | |||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
例として,次の実験データについて回帰線を求める。
|
応用---Waveファイルと信号処理(FFT,フィルタ) | ||||
---|---|---|---|---|
もしもどこからでもいいから,*.wav というファイルを探し,
ファイル名を sound.wav とし,カレントディレクトリに入れておくと,
そのファイルに対してFFT処理を適用できます。
http://www.neurotraces.com/scilab/scilab2/node1.html http://www.neurotraces.com/scilab/scilab2/node46.html |
応用---数値積分 | ||||||
---|---|---|---|---|---|---|
まずは,以下の関数を作り,myfunc3.m という名前で保存(Save)しておく。
これでファンクションが定義できたことになり,以降たとえば, y=myfunc3(3.14159/2) とでも打ち込むと,y にはほぼ 1 (= sin(90度) )が設定される。 実際のところ積分の計算には必ずしもfunctionが必須というわけではないが, こうすることによって(1)プログラムが見やすくなる (2)function を使うと大きな利点もある(最後の例を参照のこと)ので,お勧めである(というか,functionの利用を前提として説明する)。
さて,まずは自分でプログラムを作り, 区間 0〜%pi にわたって積分しよう。 採用するアルゴリズムは,一番簡単な台形法とする。 T=h*(y1 + 2*y2 + 2*y3 + yn)/2
これは,myfunc3 を別の関数に変えたときに, メモリ内に残る myfunc3 を消すためである。 なお,clear 文の前の // は最初から消してしまってかまわない。 というのも, myfunc3 の読み込み前に clear myfunc3 を行ってもエラーにならないからである。) 上記の台形法と同じアルゴリズムで計算する関数が用意されており, 次のように行っても同じ結果が出る。
functionの形で積分関数が設定されている場合, 組み込み関数を使うと,積分はたったの一命令で実行できる。
|
応用---微分方程式 | |||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
ここでは,次の式の解を計算によって求めて,振り子の振動を解析するものとする。 x'' = - a x' - sin(x) 解説 : もともとの系は振り子である。 変数 x [m] は振り子が動く経路上の長さを表す。 記号 ' は時間による微分を表す。 質量 m [kg] の質点が, 長さ L [m] の棒の先にくっついており, 空気抵抗は a [kg/s] , 重力によって下の点に引き戻されようとする力は 重力加速度 g [kg m/s2] とsinを掛けた値になるというものであり, m x'' = - a x' - g sin(x/L) で書き表される。 なお,x/L は角度[radian]を表す。 この式からディメンション(各項の物理的な意味) を除いて最初の式に変換しても, 振動の本質は失なわない。 なお,最初の式中の a はパラメタであり, 実世界の空気抵抗や重力加速度や振り子の質量と関連する値である。この場合,安定点は, x = n %pi (n は整数)になる。 ただし,n が奇数の場合は振り子が上で止まった場合に対応し, 鞍点のため不安定点となり, 本当に安定するのは n が偶数の場合である。 さて,これを解くにあたって次の置き換えを考える: 「2次の微分方程式は,2つの1次の微分方程式を連立させたものである」 ここで速度 v を導入することにより,上の式は次のように書き換えることができる。 v' = x'' = - a * v - sin(x) x' = v さらに,x→x2,v→x1 に置き換えると, x1'=- a * x1 - sin(x2) x2'=x1 となる。この式は,左辺は 1 次の微分だけであり, 右辺は通常の項だけから成る。 これは以下のようにプログラムにできる。 なお,今回は関数内で t を使っていないが, 一般に微分方程式は時間の関数でもあることから, 引数の中には時間 t も入れておく。
さて,まずはこの微分方程式を解くにあたって, まず 変位-速度 平面上での解軌跡を考える。 以下のプログラムを打ち込んで実行してみよう。 この図表から解のふるまいがかなり予想できる。
それでは,この微分方程式を, 組み込み関数を使わずに解いてみる。 今回は横軸を時刻としてグラフを書く。
微分方程式を解くための関数 ode を使うと, このような微分方程式を簡単に解くことができる。 早速"help ode"と打ってみよう。 なお,ここでは,グラフを2回書く。 一枚目は p1e2 と同じである。 二枚目は横軸を変位,縦軸を速度としたもので, p1e1 に対応するものである。 一枚目のグラフを書いたら pause で停止するので, return(c/r) を打って,二枚目のグラフに進む。
せっかく解いたので, 最初に示した平面上に解軌跡を表示させてみる。 Scilab では特に画面を消去しない限り同じグラフ画面上に重ねがき出来るので, 別々に求めた解を,同じグラフ上に表示する。
以上のように,この節では微分方程式の解き方について, ユーザーがすべて解くやり方と,組み込み関数(ode)を使った場合の 2 通りの解き方を示した。 自分で方程式を解く方法は,微分方程式の考え方の習得に有効であった。 一方,組み込み関数を使う方法は,極めて少ないプログラミングでも, 実用的な問題解決に有効であることを示した。 ここで示さなかった微分方程式に対しても同様に取り組むことが出来るので参考にして欲しい。 |
応用---微分方程式-2 さまざまな振動 (Scilabに違いがあれば) | ||||||
---|---|---|---|---|---|---|
先の題材(振り子の運動)を元に,
外力が加わった場合と,パラメトリック振動を取り扱う。
物理的な意味を考えるため,方程式は敢えて物理的なものに遡る。
なお,方程式は次のものに書き換る。 m L x'' = - a L x' - g sin(x) + F(t) 変数 x [rad] は振り子の角度, パラメタ L [m] は振り子の棒の長さ, 記号 ' は時間による微分, パラメタ m [kg] は質量, パラメタ a [kg/s] は空気抵抗, パラメタ g [kg m/s2] は重力加速度, 関数 F(t) [kg m/s2] は外力を表す。 この場合,安定点は, x = n %pi (n は整数)になる。 ただし,n が奇数の場合は振り子が上で止まった場合に対応し, 鞍点のため不安定点となり, 本当に安定するのは n が偶数の場合である。先の例題のように, 「2次の微分方程式は,2つの1次の微分方程式を連立させたもの」 と考え,角速度 w を導入するとともに,さらに,x→x2,w→x1 に置き換えると, x'' = w' = x1' = - x1 * a / m - sin(x2) * g / (m * L) + F(t) / (m * L) w = x2' = x1 となる。 外力が加えられた場合まず関数を用意する。myfunc4 を僅かに手直しするだけである。 関数に引き渡されるパラメタの一つに時刻 t を用意してあるのは, 前出の myfunc4 の時と同様であるが,今回は t を本当に利用している。それでは早速解いてみる。 次のプログラムは解を求めるものである。 殆んどは前出の myfunc4, p1e4 と同じであり, 変更点は色違い(赤)で示した。 ただし,コメント行については変更があっても特に示してない。
関数内の外力 F は大きさは時間とともに変わる。 従って,変位-速度平面上のベクトルの方向は時間とともに変わるので注意が必要である。 今回の力は sign (符号) 関数で与えられるため,方形波である。 従って,2通りの力の掛かり方しかないため,ベクトルの図は必要十分の2枚書くことにした。 2つのベクトルの方向が同一の場合は, 後から書いた矢印によって,最初に書いた矢印の一部が消されているので, しまうので注意しよう。 ここで,上記とは異なる非常に長い周期の外力を加えた場合の解を示す。 二通りの外力に応じた二通り場所に収束しているのがわかる。 myfunc5, p1e5 からの変更点は次の1箇所である。 myfunc5 3行目 前出の例 F=0.01*sign(sin(0.998*t)); ここでは F=0.01*sign(sin(0.03* (t-1) )); こうした外力を受け,上記のプログラムをそのまま走らせた解を示す。 先ほどよりも大きな軌道を描いている。 これは,振り子独自の振動数にちょうど対応する周期の外力を加えたことで, 大きな振幅が得られたのである。 もしも myfunc5 内の 0.967 という数字を,大きくしても小さくしても, 振幅はこの図よりも小さくなる。 (実際に,0.99 とか 0.9 といった値を当てはめて実行させてみよう。) このとき,角度や角速度の時間変化は,次の図の通りである。 なお,初期値が 0.01 のグラフは角度を,0 のグラフは 角速度を表す。 (最初の図は,収束する様子を示す。後ろの図は,発振が始まる様子を示す。) 基本的にグラフは滑らかな曲線であるが,所々に折れ曲がっているような場所が見られる。 これは,外力が変化したところである。 まとめ:外力があったとき, ・定常状態では外力と振子の周期は等しい ・ちょうどよい周期のとき,振子の振幅は最大になる ・振子の性質(質量,振子の長さ,空気抵抗)に応じて,周期が変わる パラメトリック振動注意:パラメトリック振動については現在勉強中です。以下の記述は,正しいとは限らない。パラメトリック振動は,パラメタが時間とともに変化したとき生じる振動である。 振り子の運動に照らし合わせると,時間とともに,例えば振り子の長さ L が変わることに対応する。 振り子とともに長さが変わることは,ブランコを漕ぐ運動の非常に単純なモデル化である。 それでは早速解いてみる。 殆んどは前出の myfunc5, p1e5 と同じであり, 変更点は色違い(赤)で示した。 ただし,コメント行については変更があっても特に示してない。
時間とともにゆれが大きくなり,最後には振幅が安定する。 まとめ:ブランコの長さが変わるというパラメトリック振動では, ・定常状態ではブランコの伸び縮みの周期は,ブランコの揺れ周期の半分である ・このブランコの場合,伸び縮みの関数として, L=1-.2*sign(sin(2.04*t)); L=1-.2*sign(sin(1.96*t)); くらいの範囲がちょうどよい周期である。 ブランコは振れが大きいほど周期が長くなる性質があり, 励起の周期が長い(カッコ内の数字が 1.96 に近い)程,最終的な揺れの振幅は大きいが, 安定点に到達するまでの時間が長い。 一方,励起の周期が短い(カッコ内の数字が 2.04 に近い)程,最終的な振幅は小さいが, 安定点に到達するまでの時間は短い。 ここで示した数字よりも長すぎたり短すぎる励起の周期の場合は, ブランコはあまりよく振れてくれないようである。 ただし,初期条件によって,これらの性質は変わる可能性がある。 ・ブランコの性質(質量,振子の長さ,空気抵抗)に応じて,周期が変わる 以上のように,この節では振動が継続する場合について, 2通りの例題を示した。 ここでは表示をきれいにするためのプログラムを入れたが, そういうことが不要であれば,極めて少ないプログラミングで, 実用的な問題解決に有効である。 |
応用---s を使って表記された特性のグラフ化 (Scilabに違いがあれば) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
RC 回路の時間応答 (Cの電圧)次の回路は,応用1aの節でも取り扱ったものである。 入力 Vin を電圧 V1,出力 Vc をコンデンサにかかる電圧とすると, 出力と入力の関係式は,
さて,s は微分の演算子である。 このことから,微分方程式を解く事が,そのまま回路特性を求めることになる。 これ以降特性を求めるが,特に断りがない限り, 「ステップ関数の入力電圧に対する出力」を求めることにする。 ということは,時刻 t=0 以降は Vin=1 (固定) ということである。 さて,これを解くにあたって,最初に次の置き換えを行う: 出力:Vc → y 続いて,方程式を次のように書き直す。 ただし,記号のダッシュ( ' )は時間による微分を表すものとする。
2次 の LPF の 時間応答(LPF とは Low Pass Filter のこと)続いて,応用1a の節でも取り扱った 2次の回路について特性をグラフ化する。 入力 Vin を電圧 V1,出力 VC2 をコンデンサ C2 にかかる電圧とすると,VC2 は,
a = C2R2 + C2R1 + C1R1 b = C1C2 R1R2 である。また,ステップ入力を考えるため以降 Vin=0 とする。 この特性は,低い周波数では伝達率が 1 (=100%) だが, 高い周波数では伝達率が小さくなることから,LPF の特性と言える。 先の時と同様に, 「s は微分の演算子」ということを考慮し, 最初に次の置き換えを行う:VC2 → y 続いて,方程式を次のように書き直す。 ただし,記号のダッシュ( ' )は時間による微分を表すものとする。
ここまで置き換えれば,前節や直前の手順をそのまま使って解く事ができる。
ちなみに,VC2の過渡応答を解釈するには, 2つの時定数を考えればよい。 一つは,R1,C2 から成る回路による 時定数であり,τはおよそ 0.1 ms である。 もう一つは,R2,C2 から成る回路による 時定数であり,τはおよそ 100 ms である。 従って,グラフを書く際の範囲の選び方として, 最初の 0.5ms 程度とすれば, R1,C1 による効果がわかるし, 500ms 程度とすれば, R2,C2 による効果がわかる。 2次の BPF の時間応答(BPF とは Band Pass Filter のこと)続いて,出力として,同じ回路の抵抗 R2 として計算する。 VR2 は,
この特性は,低い周波数と高い周波数で伝達率が小さくなるが, 最大の伝達率はその中間の適当な周波数であり,正に BPF の特性と言える。 先のp1f1 にて VC2 は既にグラフ化した。 また,先立つ p1f1 の「経過2」の計算から, s * VC2 は y2 即ち,yy(:,2) として求められる。 従って,p1f2 の続きとして, 次の命令を続ければ,VR2 をグラフ化することができる。
ちなみに,VR2 の過渡応答を解釈するのに,R1とC2 から得られるおよそ0.1msの時定数と,R2とC2 から得られるおよそ 100 msの時定数を意識する必要があるのは,VC2 の過渡応答を見るときと同様である。 2次の HPF の時間応答(HPF とは High Pass Filter のこと)続いて,出力として,次のような特性を考えてみる。
この特性は,分子に s^2 に比例する項がある。 この項は,計算によって求めた yy( ) を使って求めることはできない。 HPF の特性を得るためには,1 から,s の 0 乗や s の 1 乗の項を引くことである。 従って,p1f2 の続きとして, 次の命令を続ければ,Vhpf をグラフ化することができる。
※ ode23 による計算のためのパラメタとして,時間領域として,0.5 ms と 500 ms それぞれを設定してみよう。 2次 系の時間応答 おさらいおさらいとして,2次の系の時間応答をまとめる。ここでは,L-R-C 直列回路を仮定する。 先ずは LPF の特性として,コンデンサの電圧を考える。
「s は微分の演算子」ということを考慮して書き直す。 ただし,VC → y とし,記号( ' )は時間微分とする。
定数は,次の通りとする。 C=1.e-9[F] R=1000[Ω] L=0.001[H]
続いて,出力を同じ回路の抵抗 R として計算する。 VR は,
先立つ p1f3 の「経過」の計算から, s * VC は y2 即ち,yy(:,2) として求められる。
続いて,出力を同じ回路のコイル L として計算する。 この項を求めるには,1 (=Vin) から,抵抗やコンデンサの電圧を引くことである。
※ 確認しよう : R の値を変えると,減衰率が変化する。 CまたはLを変えると振動の周期が変化する。 ※ Vin がランプ波(1次式で時間と共に増加する波形)だった場合, は,本来 Vin が収まる場所として 定数×t を挿入すれば良い。 他にも正弦波など様々な入力信号が考えられるが, その部分を適切な関数にすれば良い。
|
応用---偏微分方程式 | ||
---|---|---|
ここでは,半導体中のキャリアの運動について解いてみましょう。 ただし,数式の理解のために Scilab を使うのであって, 各項の大きさについては特に物理的な根拠はありません。 方程式:n型半導体内の少数キャリア(正孔)の運動を表す式 (ここで, ' とは,x による微分を表す) dp/dt = D * p'' - u * E * p' - u * p * E' + G - (p - p0)/T ただし, p は正孔濃度 p0 は熱平衡時の正孔濃度 D は拡散定数 u は移動度 E は電界 G は生成項 T は再結合時間 まずは,このプログラムが動くように設定し, 一度走らせて見よう。 解説については,その後に行う。
それでは,この微分方程式を微妙に変えてみよう。
|