2009-11-21[n年前へ]
■消費者物価指数とポジティブ・フィードバック
景気の変化をわかりやすく眺めてみたくなったので、 日本の消費者物価指数(CPI)のグラフを張り付けてみた。このグラフは、右下部にある小さなボタンを押すことで、表示する内容を切り換えることができるものである。
このグラフには、1ページ目に「主な消費者物価指数(前年同期比)の推移」が、2ページ目に「主な消費者物価指数の推移」が、3ページ目に「消費者物価指数と前年比の推移」が収録されています。
2ページ目や、3ページ目を眺めると、ここ2,3年は、実に単調に消費者物価指数が低下し続けていることがわかる。この消費者物価指数低下が続くことの要因は、一体どんなものがあるのだろうか。新聞記事をしっかり読んでいれば、その要因分析結果などが解析・解説されているのだろうか。
・・・それにしても、と思う。経済社会はどう考えても、制御工学的にはポジティブ・フィードバックの不安定極まりない世界に思えてならない。少しの外乱が、大きな変動を生み、その変動がさらに激しい波を生むようにみえる。もしかしたら、そこには結構長いムダ時間があったりして、意外にセンシティブではないのかもしれないが、やはりポジティブ・フィードバックの不安定な状態に見える。かといって、安定を実現するネガティブ・フィードバックでは、永遠に一定で変わらない世界になってしまう。おそらく、それでは何の発展もなく進化さえしない世界になってしまうかもしれない。
ポジティブ・フィードバックからは安定な状態は生まれない。上がり続けるか、下がり続けるかで、結局は「発散」してしまうことになる。
次に平積みされる本が、もしも「節約ライフ」的な本だとしたら、景気にはまさにポジティブ・フィードバックが働いていることになる。それらの書籍は、不況への後押しをするポジティブ・フィードバックである。「ポジティブ」という名前が付けられた、しかし、それは同時に不況への案内図なのかもしれない。
以前は途中で挫折したが、もう一度、経済学の教科書に書いてあることをMatlab/Simulinkで実装しつつ、学んでみよう。
2009-12-25[n年前へ]
■「制御工学」を「日常生活」に生かす
岩井善太・川崎義則・石飛光章「制御工学 (基礎機械工学シリーズ) 」から。制御工学の本はたくさんの本を読んだが、入門書としてはこの本が一番わかりやすいと思う。
制御を行うには、必ず制御のための対象(相手)があり、目標値を掲げ、現状を把握し、目標と現状の差を知り、そして対象に働きかけることになります。これがフィードバック制御の原理ですし、どのような働きかけ方(制御方式)をするかがポイントになります。この考え方は、私たちの日常生活のすべてのことにあてはめるポイントになります。
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
2010-01-01[n年前へ]
■Rubyで書いた単純なカルマンフィルタの出力グラフ例
「Rubyで単純なカルマンフィルタを書いてみた」ので、そのスクリプトの動作させた場合の出力結果をグラフにしてみました(RubyソースはsimpleKalman.rbとしてここに置いておきました)。
Ruby simpleKalman.rb 50 > simpleKalman.csvという風にCSVファイルにして、Excelで開き、結果を示したのが下のグラフです。観測ノイズがある中で(観測値が朱線で示したzです)、水色点線で示したxhat(この単純例では出力量の推定値)が、水色で示したx(この単純例では出力量)をそこそこ推定できているようです。
さて、次は「C言語で整数演算だけを使いこの単純な例を実装するときの苦労をする」か「エクセルで説明用の実装をする」か、はたまた、もう少し面白そうなモデルベース予測あるいはシミュレーション計算予測との組み合わせ(たとえば、アクティブ制御のブラ)実現にでも挑戦してみるようか悩んでいるところです。
2010-07-14[n年前へ]
■「正のフィードバック」と「負のフィードバック」
今日の「n年前へ」から。
電子機器・メカ機器で多く使われるフィードバックシステムは、「負のフィードバック」だ。なぜなら、それにより「システムの安定化」を実現化することができるからである。逆に言えば、そういう風にシステムを作らなければ、安定して機器を動かすことはできない。
その一方、ユーザーインターフェースをつかさどる機器は、「正のフィードバック」として動くものも多い。たとえば、車のハンドルを動かすパワーステアリングなどは、入力の増幅が出力の増幅を生み出す「正のフィードバック」システムだ。少ない力で人の手助けをするシステムを作ろうとするならば、「正のフィードバック」を使うのが自然で人に優しい、というわけである。そういった、ユーザの反応を増幅拡大して見せるポジティブ・フィードバック系が多い。
ユーザの操作・反応がとても重要であり、同時にマスメディアでもあるようなツールを作ろうとするときには、この「フィードバック」特性を意識することは、きっと何かの知見を与える、と思う。「正のフィードバック」と「負のフィードバック」、そして、それらのフィードバック・システムが生み出すシステム、そういったものの挙動をシステムに関わる人々が想像してみることは、きっと何かの役に立つのではないだろうか、と思う。
「メディアの特性」と「制御工学の安定性」