2016-11-24 10 views
0

私は、捕食者の数が少なく、獲物の人口が多いので、捕食者と獲物の状況をシミュレートするコードを作成しようとしています。時間が経つと捕食者の人口は増加しますが、捕食者の人口は捕食者の人口を維持するにはあまりにも少なくなるまで減少します。捕食者の人口が死亡し、捕食者の人口が再び人口を増やすことができます。シミュレーションは、2つの母集団の1つが0に達するたびに停止することになっています。この場合、仮の母集団はシミュレーションの時間経過に伴って2つの母集団を停止してプロットします。これは、これまでの私のコードです:Python:ループで目的の結果が得られない

import matplotlib.pyplot as plt 

def simulate(initialPred, initialPrey, preyGrowth, predationRate, predShrink, predFedBirthRate): 
    preyCounts = [] 
    predatorCounts = [] 
    predatorI = initialPred 
    preyI = initialPrey 
    predator = predatorI 
    prey = preyI 



    while predator > 0 and prey > 0: 

      predator = predatorI * (1 - predShrink + predFedBirthRate * preyI) 
      prey = preyI * (1 + preyGrowth - predationRate * predatorI) 
      predatorCounts.append(predator) 
      preyCounts.append(prey) 
      predatorI = predator 
      preyI = prey 


    plt.plot(predatorCounts, 'r', preyCounts, 'b') 
    plt.show()  

    return preyCounts, predatorCounts 

simulate(50,1000,0.25,0.01,0.05,0.00002) 

その出力はこの です:enter image description here

しかし、次のように出てくることになっています: enter image description here

誰かが私を助けてくださいことはできますか?

*またさておき、私はこのように内部の値を持つ関数行の後に関数の外で私のプロットコードを置くたびに、このから:それは関数から値をプロットしていない

simulate(50,1000,0.25,0.01,0.05,0.00002) 
plt.plot(predatorCounts, 'r', preyCounts, 'b') 
plt.show() 

言うpredatorCountspreyCountsは未定義です。

+0

私が表示されませんwhileループ中の 'prey'の値を更新するコードはありますか?それは望ましい行動ですか? PS: 'matplotlib'については何も知りません –

+0

whileループの先頭にprintステートメントを置いて' '' 'predatorI'''と' '' preyI'''に何が起きているのかを知ることができます。手掛かり – wwii

+0

1つの問題は、あなたのwhile条件が機能していないことです。時にはあなたの条件は0.4匹の餌を有効と見なしますが、私はウサギの4分の1がかなり死んだと思います。 – wwii

答えて

1

私は集団の開始集団使用int()切り捨てを使用してプロットデータを初期化する場合、私はあなたが見ることになっていると言うのプロットを得る:

import matplotlib.pyplot as plt 

def simulate(initialPred, initialPrey, preyGrowth, predationRate, predShrink, predFedBirthRate): 
    preyCounts = [initialPrey] 
    predatorCounts = [initialPred] 
    predator = initialPred 
    prey = initialPrey 

    while predator > 0 and prey > 0: 
     predatorScaleFactor = 1.0 - predShrink + predFedBirthRate * prey 
     preyScaleFactor = 1.0 + preyGrowth - predationRate * predator 
     predator = int(predator * predatorScaleFactor) 
     prey = int(prey * preyScaleFactor) 
     predatorCounts.append(predator) 
     preyCounts.append(prey) 

    plt.plot(predatorCounts, 'r', preyCounts, 'b') 
    plt.show() 

    return preyCounts, predatorCounts 

simulate(50, 1000, 0.25, 0.01, 0.05, 0.00002) 
+0

私はちょうど1つの質問を持っていた 'preyCounts = [initialPrey]'と 'predatorCounts = [initialPred]' – Langfao

+0

ああ、実際に私はそれがなぜあなたの助けを借りて、 – Langfao

1

あなたはあなたのプロセス/計算を見ましたが、それは正しいようですが、結果を見ると面白いです。あなたがカウントを印刷するとき、あなたが気づくことの一つは...

print predatorI, preyI 

は、現実の世界では、意味がない、捕食者と獲物の端数があるということです。あなたは現実の世界をシミュレートしようとしています。あなたののレートのパラメータはすべて、おそらく分数ではなく、すべてのものに基づいています。つまり、あなたのシミュレーションで小数の人間は存在しないことを決定し、あなただけの enter image description here


あなたの関数は、カウントベクトルを返す...人口増加の計算後の全体の人間(int型)を扱います。関数の外にプロットステートメントを移動する場合は、関数の戻り値を名前に割り当ててからプロットに使用する必要があります。ここで

prey, predator, = simulate(50,1000,0.25,0.01,0.05,0.00002) 
plt.plot(predator, 'r', prey, 'b') 
plt.show() 

は、あなたがより多くの言語を使用して、定期的にそれらを読んでする必要があるかもしれません名、スコープ、名前空間 https://docs.python.org/3/tutorial/classes.html#a-word-about-names-and-objects https://docs.python.org/3/reference/executionmodel.html#naming-and-binding

に関するドキュメントから読み取るためにいくつかのものです。

+0

私は、現在の捕食者と獲物の値を計算した直後に整数に丸めると思いますか?また、関数の外にプロットステートメントを移動すると、プロットに使用する変数の名前が返されていると思いました。 – Langfao

+0

@Langfao、1.6トラは2つのトラの周りになりますが、計算後に1.6の存在があっても、実際には1つしかないと言います。 – wwii

+0

これはwhileループで設定された基準に問題があります? – Langfao

関連する問題