• ベストアンサー

Mathematicaを用いて連立微分方程式を解く

私はMathematicaについては素人ですが、頑張って勉強しています。 2種間の競争を表すモデルを解いていますが、うまくいきません。 微分方程式は以下のようです。 dx/dt=r1x(1-(x+ay)/K1) dy/dt=r2y(1-(bx+y)/K2) 上記の方程式をMathematicaで次のように書きました。 r1 = 1; r2 = 2; K1 = 80; K2 = 70; a = 0.7; b = 1.1; ok = Dsolve[{x'[t] == r1 x [t](1 - (x[t] + a y[t])/K1), y'[t] == r2 y[t](1 - (b x[t] + y[t]/K2)), x[0] == 0, y[0] == 0}, {x[t], y[t]}, t]; これでいいのですか?また、これをx,y軸の範囲が0から100としてPlotしたいですが、どのように書けばいいのですか? よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.5

基本的にはOKです。まず数式処理ソフトで計算をするときには、答えを得るための一般的なアルゴリズムが組み込まれているかどうか知っておく必要があります。つまり問題の微分方程式を解析的に解くことが出来るかどうかをしっていなくてはなりません。微分方程式は簡単な場合以外大抵解けないので数値計算することを進めます。 以下のことを確認してください。 (1)DsolveはちゃんとDSolveと書いていますか? (2)上の事を確認しても動かない場合にはmathematicaのエラーメッセージを見ましたか? (3)最後にyooさんの与えた初期条件では答えは常にゼロですが、そういう初期条件に興味があるんでしょうか? 試しにx[0]==0.1とか変えてみるとゼロではない答えになるはずです。 数値計算で良いなら以下の事に注意してプログラムを書いてください。 (1)数値的な微分方程式の解法プログラムはNDSolveです。 (2)suchikai=NDSolve[{方程式1,方程式2,・・・}, {x,y}, {t,0,10}] NDSolveの最初括弧には微分方程式と初期条件をyooさんが質問で書いているように入力します。二つ目の括弧には求めたい関数x,yを{x[t],y[t]}ではなく{x,y}と入力します。最後の括弧はx、yの時間tが0~10までの答え求めるという意味です。最初は1~10で試してうまくいったら適当に調節してください。 (3)suchikaiを実行した結果を見ればわかりますが、mathematicaは答えを{{・・・・・}}という形式で表示しています。この2重括弧をはずすために First[suchikai]という命令を使います。 なぜ二重括弧で出力するのか不明ですが、これをはずさないと次の関数を定義したときに、答えの出力形式が変わってきますから注意です。(4)の説明を読んだ後で自分でFirstを付けない場合の答えの表示を確認してください、違いがわかります。 (4)それではsuchikaiを使って答えのx[t]を定義します。 xkotae[t_]:=x[t]/.First[suchikai] これでxkotae[t]が定義されています。y[t]も同様に ykotae[t_]:=y[t]/.First[suchikai] でOKです。suchikaiにx、y両方情報が入っていますからどちらもFirst[suchikai]で定義できます。 (5)使い方です。試しに xkotae[0] とか ykotae[1]とかやってみて下さい。 数字が返ってくるはずです。後は普通の関数のようにPlotで絵がかけるはずです。ただしtは0~10までしか定義されてませんから。 (6)二つを同時に表示したいでしょうから Plot[{xkotae[t],ykotae[t]},{t,0,10}, PlotStyle->{Hue[0.5],Hue[1]}] とすればx[t]とy[t]が一つの絵に描かれます。 Hueは色合いという意味です。二つの線を一つのグラフに描く場合には色を変えたほうがよいでしょうから、覚えておくと便利なオプションです。 最後ですが、私の書いたものをそのままにコピーしてもmathematicaが動くように正確に書いたつもりですが、スペル等の間違いがないとも限りませんから、常にmathematicaのエラーメッセージを読んでください。

yoo7660
質問者

お礼

ご返事どうも有難うございました。できました。本当に助かりました。 これからもよろしくお願いいたします。

その他の回答 (4)

  • m234023b
  • ベストアンサー率20% (54/266)
回答No.4

同じ意味ではありません.

yoo7660
質問者

お礼

ご返事有難うございました。なんとか出来ました。*とスペースの差についてはまだ理解できませんが、これについては改めて質問させて頂きます。

  • m234023b
  • ベストアンサー率20% (54/266)
回答No.3

スペースではいけません

yoo7660
質問者

補足

スペースの代わりに*を入れましたが、それでも出来ません。話がちょっと違いますが、スペースと*は同じ機能を持っているものではないんでしょうか?

  • m234023b
  • ベストアンサー率20% (54/266)
回答No.2

書き忘れたのでもう一言… r1×x[t]などをr1x[t]としていますがr1*x[t]という風に「*」を忘れては行けません

yoo7660
質問者

補足

早々ご回答有難うございます。r1とx[t]間にちゃんとスペースを入れています。

  • m234023b
  • ベストアンサー率20% (54/266)
回答No.1

Plot[ok,{x,0,100},Plotrange->{0,100}] でいかがなもんでしょうか??

yoo7660
質問者

補足

早々ご回答有難うございます。できません。