spin on the RITZ -130ページ目

状態遷移確率行列

下の図のように、状態s1とs2は矢印にある確率にそって、時間ごとに遷移する。




この時の矢印に書いてあるのが遷移確立。文字通り、遷移するときの条件付確率。
全体でどれだけがs1にいくか、またs2に行くかをあらわす確率(定常確率)を求めたい。

時間t=nの時に状態s1にある確率をPs1、s2にある確率をPs2とすると、下のような形の式が出来る。



この式の遷移確率で出来ている行列を遷移確立行列といい、この行列のn乗を考え、nを大きくしていくと定常確率が求められる・・・・・・・・・・・らしい。


授業はここで終わりました。行列計算が出来る関数電卓を持ってなかったので、家に帰ってからちょこちょこプログラミングしました。


#include <iostream>
#include <cstring>
#include <cstdio>

using namespace std;

class Matrix {
public:
    double m[2][2];
    Matrix() {
        memset(m, 0, sizeof(m));
    }
    Matrix& operator=(const Matrix& obj) {
        for (int i=0;i < 2;i++)
            for (int j=0;j < 2;j++)
                m[i][j] = obj.m[i][j];
        return *this;
    }
    Matrix operator*(const Matrix& obj) {
        Matrix temp;
        for (int i=0;i < 2;i++)
            for (int j=0;j < 2;j++)
                for (int k=0;k < 2;k++)
                    temp.m[i][j] += m[i][k]*obj.m[k][j];
        return temp;
    }
    void print() {
        for (int i=0;i < 2;i++) {
            for (int j = 0;j < 2;j++)
                cout << m[i][j] << " ";
            cout << endl;
        }
    }
};

int main()
{
    Matrix A, X, Y;

    A.m[0][0] = 0.3;    A.m[0][1] = 0.6;
    A.m[1][0] = 0.7;    A.m[1][1] = 0.4;
    X.m[0][0] = X.m[1][1] = 1;

    for (int i=0;i < 20;i++) {
        Y = A * X;
        Y.print();
        X = Y;
        getchar();
    }

    return 0;
}



2×2行列しか使えないぜッ!

ダメだぜッ!

友達に見せたら「Matrixクラス(笑)」とか言われそうorz


と り あ え ず


エンターキー押していくと、行列の掛け算していきます。

n=10くらいから上2つと下2つが同じ値になっていき、この値が定常確率になるそーですよー


足したら1になりそうだし、多分あってんでしょうよ!

Re:Re:Re:Re:

昨日一昨日わかったようなわかってないような演算子オーバーロードについてなんですが、実は授業の先生にメールで質問していましたとさ。



自分の予想では

「一時変数を参照するときはconst T&型にしなさい。そーゆー仕様です

そーしないと色々と困ります。スコープとか」

ってな感じだと思ってましたけど


先生の返答では

C++ の仕様では本来、一時的なオブジェクトを const 指定なしで参照する
ことは禁止されており、これが問題になっていると思います。

とのこと。


一緒じゃん!メールする必要なかったじゃん!


お手を煩わせて誠に申し訳ありませんでしたorz




だって、気づいたのメール出した後だったんだもん。




ちなみに、VisualStudioかなんかではconst指定しなくても良いそうです。This is 曖昧.

g++の方が一応仕様通りにやってくれていたようですね。だってさ。




まぁ、こんどはコピーコンストラクタのことで問題が増えたわけなんですがね


それはまた、別の話


追記:

別の話にしようと思ったけど、すぐに解決しました。

コピーコンストラクタの引数はconst参照だから、コピーコンストラクタが呼び出されるわけないよねそりゃ。

コピーコンストラクタでコピーコンストラクタが呼ばれるなんていうお粗末なことは起きませんよってこった。

僕は貴方を受け入れない

どうやら、昨日のプログラムで悩んでいたのはC++の仕様だったらしい

一時変数のような右辺値は現行の標準C++ではconst T&型としてでしか渡すことができないみたい


それに関連しての話なんですが、次期標準のC++0xでは右辺値参照なるものが出てくるらしいです、コピーをせずにポインタを移動するムーブセマンティクスの実現に用いられているとかいないとか


う~ん、ちょっとわからない。
まだまだ勉強不足だね。


とりあえず、現行のC++の勉強をしといてからちょっとずつ次期標準についても触れてみようかな


Faith and Brave - C++で遊ぼう さんのところで詳しく書いてあったりするのでみてくるのもよろしいかと

dpda






上のようなdpdaをあらわすのに、11個の状態遷移が必要だなんて・・・・・・
何もなしから作り出せるだろうか・・・・・・・


すっごいすっきりしてるオートマトンだよね。詰め込めるだけ詰め込んどいて、あとはひとつずつ逆から見ていくっていう。
パッと見わかりにくいんですが、よくよく考えると、とてつもなくわかりやすい内容になってます。


来週は究極のオートマトン、チューリング機械についてやるらしい
ちょっと楽しみ

ベビサイドの公式

F(s)/G(s)に部分分数A/(s-a)があるとすると、つぎのベビサイドの公式が成り立つことを示せ



ラプラス変換をするにあたって、こういう部分分数分解をすることが多いのですが、今日やっていた演習にうえのような問題がありました。

証明はどうも苦手です


先生は

「ベビサイドの公式とか使わなくても、普通に計算できるからいいよ別に」

とおっしゃっておりましたので、そうさせていただきます。
公式覚えるのって面倒だよねぇ~


復習しておくべきなのは、第1移動定理と、単位階段関数と、ディラックのデルタ関数くらいかな
あとは、まー、忘れたときに教科書見ればいいっしょ。多分。。



下のような式がありまして



下のようにラプラス変換しーのー部分分数分解しーのーで



逆変換しーのーで答えがジャジャンとでますよー





今の自分としては、これくらいならまだ普通にといたほうが早いような気がする(苦笑)

ypの方はは多分λが1と2だからすぐにexpは出るしー
yhの方はyh=Kx+Mとか置いたらK=2、M=3ってすぐに出そうだねー


まぁ、道はいくつもあるってことですかね