2009-11-21[n年前へ]
■消費者物価指数とポジティブ・フィードバック
景気の変化をわかりやすく眺めてみたくなったので、 日本の消費者物価指数(CPI)のグラフを張り付けてみた。このグラフは、右下部にある小さなボタンを押すことで、表示する内容を切り換えることができるものである。
このグラフには、1ページ目に「主な消費者物価指数(前年同期比)の推移」が、2ページ目に「主な消費者物価指数の推移」が、3ページ目に「消費者物価指数と前年比の推移」が収録されています。
2ページ目や、3ページ目を眺めると、ここ2,3年は、実に単調に消費者物価指数が低下し続けていることがわかる。この消費者物価指数低下が続くことの要因は、一体どんなものがあるのだろうか。新聞記事をしっかり読んでいれば、その要因分析結果などが解析・解説されているのだろうか。
・・・それにしても、と思う。経済社会はどう考えても、制御工学的にはポジティブ・フィードバックの不安定極まりない世界に思えてならない。少しの外乱が、大きな変動を生み、その変動がさらに激しい波を生むようにみえる。もしかしたら、そこには結構長いムダ時間があったりして、意外にセンシティブではないのかもしれないが、やはりポジティブ・フィードバックの不安定な状態に見える。かといって、安定を実現するネガティブ・フィードバックでは、永遠に一定で変わらない世界になってしまう。おそらく、それでは何の発展もなく進化さえしない世界になってしまうかもしれない。
ポジティブ・フィードバックからは安定な状態は生まれない。上がり続けるか、下がり続けるかで、結局は「発散」してしまうことになる。
次に平積みされる本が、もしも「節約ライフ」的な本だとしたら、景気にはまさにポジティブ・フィードバックが働いていることになる。それらの書籍は、不況への後押しをするポジティブ・フィードバックである。「ポジティブ」という名前が付けられた、しかし、それは同時に不況への案内図なのかもしれない。
以前は途中で挫折したが、もう一度、経済学の教科書に書いてあることをMatlab/Simulinkで実装しつつ、学んでみよう。
2009-12-08[n年前へ]
■ 技術革新の三つの潮流に合わせてMATLAB/Simulinkの改良を継続 autoki
「技術革新の三つの潮流に合わせ MATLAB/Simulinkの改良を継続 ―― MATLAB EXPO 2009レポート 《基調講演編》」
1. システムのモデル化 2. モデル・ベースの開発 3. 並列コンピューティング
ここで挙げられている1,2,3、特に何より1,2は因果関係を明らかにした上での・最も適切な制御を適切な塩梅で(ロバストに)行うために、とても重要なことだろう。
2009-12-25[n年前へ]
■「制御工学」を「日常生活」に生かす
岩井善太・川崎義則・石飛光章「制御工学 (基礎機械工学シリーズ) 」から。制御工学の本はたくさんの本を読んだが、入門書としてはこの本が一番わかりやすいと思う。
制御を行うには、必ず制御のための対象(相手)があり、目標値を掲げ、現状を把握し、目標と現状の差を知り、そして対象に働きかけることになります。これがフィードバック制御の原理ですし、どのような働きかけ方(制御方式)をするかがポイントになります。この考え方は、私たちの日常生活のすべてのことにあてはめるポイントになります。
2009-12-29[n年前へ]
■「カルマンフィルタ」と「エクセルで解く2次元非定常熱伝導問題」
正月に、(自分用の)汎用「カルマンフィルタ」ライブラリをRubyとCとExcelで書いてみることにした。たとえば、さまざまなデータ、たとえば、信頼性が低く、誤差の大きなセンサデータや、安定性に欠ける実験データから、現実に近い状態量を推定するツールを作ってみることにした。そして、何か(解析式による)モデル計算や各種シミュレーション計算と比較をしてみたり、それらの計算改善へのフィードバック例を作ってみよう、と考えた。
そこで、扱う題材を考えつつ、実際に上記のようなことを行っている例を探してみた。すると、たとえば、
といったものがある。これらの記事が(下に張り付けた動画でその一端がわかると思うが)実にわかりやすく・面白くて楽しく・役に立ちそうに見える。何というか、つまるところ、魅力を持つに必要な三拍子がすべて備わっている。先日、「2次元非定常熱伝導問題を解く」エクセル・シート、しかも、そのシートに、センサ機能/フィードバック機能なども付けてみた。そんな素材・材料が揃ってきたこともあるので、まずは、PID制御で(疑似三次元空間における)温度制御を行う例をいくつか作り、その後は、上記記事を参考にしつつ「(誤差を付加した)センサ→カルマンフィルタ→制御量最適化」という例でも作ってみることにしよう。
2009-12-31[n年前へ]
■Rubyで単純なカルマンフィルタを書いてみた
An Introduction to the Kalman Filterの一定出力プラント例に対するカルマンフィルタをPythonで実装した Cookbook / KalmanFilteringを参考に、Rubyで単純なカルマンフィルタを適当に書いてみました。
動かし方は、
ruby kalman.rb 100というようにでも起動すると、「出力」→「観測」→「予測」のカルマン・フィルタの動作を99回ほど繰り返す、という具合です。出力結果例は、また後ほど示すころにしますが、開始後およそ5回程度からは、「真の出力値」に近い予測を行うことができています。
(最後に配列を使ってグラフ化などをするわけでもないことと、一回前のデータ以外は不必要だということがわかりにくくなってしまいそうだったので)本来は不要な配列を使いたくありませんでした。ただ、変数が(一見)増えたように見えるのもどうかと思い、Python例と同じように配列を使った実装にしてしまいました。
一応、実際に動作する際に「発生すること」「処理すること」の「手順・ループ」を意識しながら、コメント文を書いてみました(正式な用語とは異なるものも多いかもしれませんが)。
ただし、今回の「一定出力」の例では、「状態方程式」「出力方程式」が登場しないので、そういう拡張をすることを考えた場合には、変数名が適切でないような気がします。そういった辺りのことは、また次の機会に整理し直すことにします。さて、これで、今年を終わりにしたいと思います。
というわけで、下記がRubyソースになります。
# 簡単なカルマンフィルタRuby実装例 def gaussian(n) # 正規分布作成用適当関数 sum = 0.0 ((n*12).to_i).times{ sum += rand() } return sum-(12/2*n) end operationNum=ARGV[0].to_i # Operation Num x=[] # 出力の真の値 z=[] # 測定値 xhat=[] # 事後出力推定値 xhatMinus=[] # 事前出力推定値 p=[] # 事後誤差推定値 pMinus=[] # 事前誤差推定値 kG=[] # カルマンゲイン xVall=55.5 # 出力の真の値 q=1.0 # 出力自身が持つノイズの分散 r=2.0 # 観測における誤差の分散 xhat<<20 # 初期出力推定値 p<<0 # 初期誤差推定値 puts 'k,x,z,xhat,kG' 1.upto(operationNum) do |k| # DoProcess x[k]=xVall+gaussian(q) # 出力値生成 z[k]=x[k]+gaussian(r) # 測定値生成 # Time Updade ("Predict") xhatMinus[k]=xhat[k-1] # 状態予測を進める pMinus[k]=p[k-1]+q # 誤差共分散計算を進める # Measurement Update("Correct") kG[k] = pMinus[k]/( pMinus[k]+r) # カルマンゲイン算出 xhat[k] =xhatMinus[k]+ #測定値を用い事後出力推定値算出 kG[k]*(z[k]-xhatMinus[k]) p[k] = (1-kG[k])*pMinus[k] # 事後誤差算出 # この回のオペレーションでの結果を表示 puts [k,x[k],z[k],xhat[k],kG[k]].join(',') if k>1 end