2009-03-07[n年前へ]
■静的・動的/連続・離散化、経済循環モデルの実装は難しい…
まだまだ、中谷巌 「入門マクロ経済学」のページをめくりつつ、その中にあるマクロ経済循環の図をなぞりつつ、Simulinkモデルを作っています。作っているSimulinkのmdlファイルは、ここ(今日時点での最新版はmacromodel_basic_20090307.mdl)に逐次置いてます。
ラフスケッチ的なモデルであったとしても、全体像を形作ろうとすると色々な勘違いや、まったく理解できていない点にたくさん気づかされます。「入門マクロ経済学」のイントロダクションに書かれている
経済学の難しさは、細部についてかなりの理解に到達したとしても、全体像がつかめないと、なかなか論理の一貫した議論ができないという点にあります。という言葉だけがイヤというほどよくわかるようになります。しかも、よほど素早く物事を納得することができる人でないと、「細部についてかなりの理解」すら難しいのです。なんだか、全体像がつかめないと、「細部」すらわかないのではないだろうか…と頭を抱えたくなくるくらい、全然わかりません。
教科書のページをめくりながら、Simulkinkでモデル実装しようとすると、まず読んでいる頁に書かれている事項が「静的(静学的)」なのか「動的(動学的)」なのか、ということが今ひとつわかりません。どうも静的・動的の区別がつかないと、モデル実装のしようがありません。
さらに、動的な場合、連続的なものなのか離散化されたものなのか、という点についてもよくわからず悩みます。さらに、離散化されたものの場合には、その時間ステップについて、異なる時間ステップのものが混在していないか、どう切り分けるか…といった点について悩むわけです。また、何かの値を使うとき、その値をどういった微分・積分の階層で整理・実装するかなども、悩むところです。
何だか「機械・制御システム」を作る時に感じるだろう課題が、この経済循環モデル実装作業には、てんこ盛りに詰まっているように思います。入っていないのは浮動小数点から固定小数点や整数処理に変える際の精度保証・オーバーフロー対策の苦労くらいではないか、と思うくらいです。逆に言えば、その難しさが魅力的だということも言えるかもしれません。
Simulinkで今日作ってみたSinmulinkモデルが、下図になります。各市場部分の内部は(mdlファイルを眺めればわかるように)比較的単純な分配サブシステムになっています。そして、オレンジ色で囲んだ部分を見るとわかるように、これは計算時間ステップがほぼ1週間(Time=0.25)という動的離散化モデルで実装されています。そして、「Time=0~11(単位は月)=1年間」の計算終了時に、その1年間の国民総生産(GNP)などが計算される、というイメージで作ってみました。
前回作ったモデルとサブシステム配置はよく似ていますが、信号線を流れている値は一階層”微分”されたもの、が流れているという具合にした「つもり」です。あくまで、「つもり」なので、間違っているところも多々ありそうです。
それにしても、本当に「一部を説明した文章・式」を納得することはできても、そういった一部が組み合わさった全体の実装は、とても難しいということをつづく感じさせられます。
なぜか、以前書いた「長い文章を書くと言うこと」を思い出したのです。
一言ふと漏らすコメントは非常に的確なものなのが普通です。だって、そのクローズアップされた狭い景色の中では特に「歪み」も「矛盾」もないのが普通ですから。だから、短い言葉・文章というのは、見事なまでに「その狭い世界」を写し取っているはずだと思います。
ところが、もう少し広い世界を写し取ろうとすると、もう少し長い文章を使って大きなものを書こうとすると、途端に色んな「食い違い」が見えてきます。
2014-05-09[n年前へ]
■エクセル(に限らず)表示されてる値は「ホント」の値とイコールだとは限りません!?
Microsoft Excelでルックアップテーブル(入力値と出力値の対応表を使い、入力値から出力値を返す機能)を使いハマった方がいました。その状態を再現してみたのが、下に貼り付けた画面です。(画面右にある)「入力値Table(Index)と出力値Table(Value)を対応付ける対応表」を使い、LOOKUP関数およびVLOOKUP関数により、画面左上部にある入力値(Index)から値出力をさせてみたところです。見るとわかるように、入力値(Index)には1.8とタイプされていて、(対応表は入力・出力の組み合わせとして同じ値が入っているので)返ってくるのも1.8かと思いきや、出力されているのは1.7という結果です。・・・一体なぜなのでしょうか? エクセルの「バグ」なのでしょうか?
これは、浮動小数点演算の結果によるものです。対応表は1に0.1を繰り返し足すことで作ってあるのですが、10進法の0.1は2進法の分数で表現される浮動小数点では正確に表すことができないため、この「対応表に”1.8”と表示されている値」は、本当は1.8とイコールな値ではないのです。だから、エクセルのLOOKUP関数は1.8とイコールな箇所を見つけることができず、1.7を返すわけです。
ちなみに、エクセルのブックオプション(計算方法)にある「表示桁数で計算する」というオプションにチェックを入れると、こうした現象は(たいていの場合は)出なくなります。なぜかというと、表示している程度に丸められてしまうため、「本当は1.8とイコールな値ではないもの」も1.8に丸められてしまうからです。
というわけで、エクセル(に限らず)表示されてる値は「ホント」の値とイコールだとは限りません!?というのが、今日の教訓でした。・・・あるいは、単純明快で無いことをエクセルでやってはイケマセンというのが、本当の今日の教訓かもしれません。