• 締切済み

Mathematicaのループ文について

現在Mathematicaを使って交通のシュミレーションをしているのですが、思ったようにループ文が作れずに悩んでいます。 もし条件式が1から4まであったとして、その条件式を毎回ループさせると考えたらどういった式を作ればよいでしょうか? ↓ちなみに条件式です。これを50回ループさせようと考えています。 road = Table[0, {2}, {54}]; road[[1, 1]] = 0; road[[2, 1]] = 0; road[[1, 2]] = 0; road[[2, 2]] = 0; road[[1, 53]] = 0; road[[2, 53]] = 0; road[[1, 54]] = 0; road[[2, 54]] = 0; road[[1, 3]] = a; road[[2, 3]] = b; If[0.5 < Random[], a = 1, a = 0]; If[0.5 < Random[], b = 1, b = 0];

みんなの回答

  • tinantum
  • ベストアンサー率56% (26/46)
回答No.2

とりあえず,周期境界条件の件は r = RotateLeft[IdentityMatrix[n]]; r[[n, 1]] = 0; として,rを次々に掛ければよいのでは? 例えば keepOnTrucking[p_, t_, n_] := Module[{road = Table[0, {n}]}, road[[1]] = a; If[p < Random[], a = 1, a = 0]; r = RotateLeft[IdentityMatrix[n]]; r[[n, 1]] = 0; road2 = road; s = Table[ road2 = (road2.r).r, {j, 0, t}]; Insert[s, road, {1}]; x = Table[0.5, {n}]; y = RotateRight[Append[s, road]]; y; z = y; Table[z = Insert[z, x, {2j}], {j, t + 1}]; z] Show[Graphics[RasterArray[Reverse[keepOnTrucking[0.2, 30, 50] /. {0 -> RGBColor[0.8, 0.8, 0.8], 1 -> RGBColor[ Random[], Random[], Random[]], 0.5 -> RGBColor[1, 1, 1]}]], AspectRatio -> Automatic]] 忙しいのと,RasterArrayなど慣れてないものなので,プログラム自体は不細工なものになってます.. 車の台数を複数にしたいのであればもう少し考えて見ます. そのかわり,車のスピードは同じものでよいのか? 車のスピードは違うものを想定する場合,追い越しはありか? ということを教えてください. また,もし既に解決している場合,プログラムを教えていただけると私の勉強にもなりますので,よろしくお願いします. それと, drive[1, 0, _, _, _, _, _] = 0; drive[1, 1, _, _, 0, _, 0] = 0; drive[1, 1, _, _, 1, _, _] = 1; drive[0, 1, 1, _, _, _, _] = 1; drive[0, _, 0, _, 1, 1, _] = 1; drive[0, _, 0, 1, _, _, _] = 1; drive[x_, _, _, _, _, _, _] := x; の使い方がいまいちわからないので教えてくれますか?

  • tinantum
  • ベストアンサー率56% (26/46)
回答No.1

やりたいことがいまいちわかりません. 書いてあることを素直にループさせると,変わるのはいつも road[1,3] road[2,3] の要素だけですが,それでよいのですか・・? そうでなければ,50回のループ中の1,2回くらい書くか,行列roadの要素をどういう繰り返しをさせて変えたいのか書いてくれれば考えてみます.

montan0213
質問者

補足

早速の回答有難うございます。 私が今考えているのは2列の配列を初期値0で設定し、一番端の部分をある一定の確率で1を出現させてセルオートマトン方を用いて交通のシュミレーションを作ろうと考えています。 今作成したプログラムはこんな感じです。 keepOnTrucking[p_, t_, n_] := Module[{road=Table[0, {2}, {n}], drive}, road[[1, 1]] = a; road[[2, 1]] = b; If[p < Random[], a = 1, a = 0]; If[p < Random[], b = 1, b = 0]; drive[1, 0, _, _, _, _, _] = 0; drive[1, 1, _, _, 0, _, 0] = 0; drive[1, 1, _, _, 1, _, _] = 1; drive[0, 1, 1, _, _, _, _] = 1; drive[0, _, 0, _, 1, 1, _] = 1; drive[0, _, 0, 1, _, _, _] = 1; drive[x_, _, _, _, _, _, _] := x; NestList[MapThread[drive, {#, RotateRight[#, {0, -1}], RotateRight[#, {0, 1}], RotateRight[#, {0, 2}], RotateRight[#, {1, 0}], RotateRight[#, {1, -1}], RotateRight[#, {1, 1}]}, 2] &, road, t] ] Map[Show[Graphics[RasterArray[# /. {0 -> RGBColor[0.8, 0.8, 0.8], 1 -> RGBColor[0.1, 0.1, 0.1]}]], AspectRatio -> Automatic] &, keepOnTrucking[0.2, 50, 50]] これで作動したら2つの問題点が出てきてしまうんです。 1つは周期的境界条件が発生して、最後に消えた車が次のステップで出発地点から出てきてしまう。 2つ目は2ステップ目から車が発生しないと言う点です。 もし分かるようでしたらアドバイスをお願いします。

関連するQ&A

  • 10進ベーシックでループを抜けたい

    for文で作った2重ループの中にif文があります。 if文の条件を満たしたらループを抜けるようにしたいのですが、 「goto 行番号」や「EXIT FOR」 を使ってもうまくいきません。 一度に2重ループを抜けたいのですが、どうすればいいでしょうか?

  • ループの仕方

    select文で、まずデータが何件あるかカウントしたあと、 そのカウントした数の分だけ、ループしたいです。 ループに入れ込みたいSQLは以下のような感じです。 1.select 1a,1b from TABLE1 where 条件; 2.select 2a,2b from TABLE2 where 条件; カウントした数の受け渡しとかも、分からないような状態なのですが、 初心者向けに教えていただけないでしょうか。 宜しくお願いします。

  • Mathematicaで条件を変えてプロット

    Mathematicaで y(x) = ax + b といった式をaとbの条件を変えて同じグラフにプロットするにはどうしたらいいのでしょうか? 例えば、a=1 b=2、a=2 b=3についてそれぞれプロットするには y1(x) = x + 2 y2(x) = 2x + 3 とそれぞれ定義して同じグラフにプロットすることは出来るのですが、 条件が多い場合、また式が煩雑な場合となると大変になるので 簡単にする方法があれば教えていただきたいです。

  • Mathematicaについて

    Mathematicaについての質問です。 授業でMathematicaを使ったものやプログラミングなどの演習を行っているのですが Mathematicaの方の課題の一部がいまいちわからずに困っています。 添付画像は単一パルス波形の図です。 以下が設問になります。 (1)A=1,|B|=π/2で図のパルス波形を-4≦t≦4の範囲で示しなさい。 ただし単位ステップ関数[=u(t)]を用いること。 (2)A=1,|B|=π/4,π/2,πとして各フーリエ変換F(ω)を求め、各グラフ(0≦ω≦10の範囲)を表示しなさい。 (3)A=3,|B|=π/2,πの条件でフーリエ変換F(ω)を求め、各グラフ(0≦ω≦10の範囲)を表示しなさい。 当然のことながらMathematicaのサイトや資料等を参考にコードを打ち込んでいるのですが おそらく間違っているため表示されず困っています。 Mathematicaにお詳しい方、お手数ですがコードでご回答していただけると助かります。 もともとパソコン関係は得意ではないうえに もう3週間程手詰まり状態なのでお助けください。お願い致します。

  • while文と無限ループの違い

    はじめまして。大学でC++を習い始めたばかりの初心者です。 最近while文とwhile文と使った無限ループを知ったのですが、 両者の違いがイマイチわかりません。 私のイメージですと、while文は条件が真である限り何度でも判定し 条件が偽になればループを抜ける。 一方無限ループもif文を使った条件が真にならない限りbreakしない。 while文の偽と判定する部分がif文で真と判定するだけで、同じような気がするのですが… ド素人の考えで恥ずかしいのですが、違いをわかりやすく教えてください。

  • エクセルのIF文

    基本的な質問ですが、 エクセルのIF文で下記の条件式を教えてください。 A1が1ならばB1には普通と表示、2ならば当座、0ならば空白というIF文を作りたいのですが、どのように作れば良いのでしょうか? よろしくお願い致します。

  • Mathematicaで恒等式を解く方法

    最近、少しMathematicaをかじり始めたものです。 さっそくですが、以下のような恒等式を解かせるにはどうすればよいのか教えてください。 y^3 + y^2 + 3 = a y^3 + b y^2 + cy + d この式から (a, b, c, d) = (1, 1, 0, 3) という答えを得たいわけです。 さらには y1 y2 + y1^2 y2 + y1 y2^2 = a y1 y2 + b y1^2 x2 + c y1 y2^2 という式から (a, b, c) = (1, 1, 1) と計算させたいと考えています。 よろしくお願い致します。

  • if文の書き方

    if文の書き方 if(!$a){$b=1;}の内容で、条件を右に持ってくる書き方だと$b=1 if(!$a);だと思いますが、 if(!$a){$b=1;}else{$b=2;}の内容で、条件を右に持ってくる書き方はできないでしょうか?

    • ベストアンサー
    • Perl
  • Forループの制御について

    VB 2005,Framework2.0を使用しています。 For文を使ったループについてお尋ねしたいことがあります。 For i As Integer = 0 To 10     ’処理 Next i とあったとします。 そうするとループ変数iが0から10になるまで連続してループを行うのですが、これをある条件の時に現在のループ変数から一つ飛ばして次のループからまた処理を行いたい場合どのようにすれば良いのでしょうか? 例えば0~10回中に、現在5回目で特定の条件が一致したときその次の6回目のループは飛ばして7回目のループから再開したいです。 ちなみにこの様に書いても0から10回必ずループされてしまいました。 Dim TEST(10) As Integer TEST(5) = 1 For i As Integer = 0 To 10 If TEST(i) = 1 Then i = i + 1 End If Next i

  • UWSCでの多重ループ

    最近プログラムを組み始めた初心者です。 メインのAというループの中にもう一つBというループを作り、Bの条件が満たされたら又Aのループに戻る というスクリプトを書きたいのですがどのようにすればよいでしょうか? While~Wendでいけると思ってやってみたのですがなかなかうまくいきません。 どなたか手ほどきをよろしくお願いします。 ループA(メインループ)←←                ↑                ↑    ループB(サブループ)この中の条件が満たされた時ループAに戻る方法    ループB終わり ループA終わり