4節 シミュレーション
[第5章 問題解決とその方法] 
放水による貯水池の水量(確定的モデル)
授業 第6回 ※未実施
【課題】
最大貯水量15000㎥ の本北方貯水池は次のように管理されている。
毎日,残りの貯水量に対して15%の割合に当たる量を放水する。
残りの貯水量が最大貯水量の20%以下となったとき放水を停止する。
さて,最初の貯水量が12000m³であるとき,今後30日間の貯水量が
どうなるか調べてみよう。

【考察】
数式モデル
[放水量]=[貯水量]×[放水割合]
[仮貯水量]=[前日の貯水量]ー[前日の放水量]
  ※放水停止量を下回った時点で放水は停止するが,停止しないものとして仮に算出しておく。
[貯水量]=[仮貯水量]と[放水停止量]の大きい方
  ※仮貯水量が放水停止量より多いときは仮貯水量,少ないときは放水停止量となる。
変数一覧
貯水量
最大貯水量
最初の貯水量
仮貯水量
放水量
放水割合
放水停止量
放水停止割合
経過日数
最大経過日数
:chosui
:chosuimax
:chosuistart
:chosuikari
:hosui
:hosuiwariai
:hosuiteishi
:hosuiteishiwariai
:day
:daymax
※日々変動する貯水量 


※貯水量が放水停止量より少なくなっても
 放水を停止せず,そのまま続けたときに
 到達すると考えられる計算上の貯水量

※放水を停止するときの貯水量

※初日は「0」とする
※ここでは「30」である
  アルゴリズムの工夫
 放水量は,その時点での貯水量(前日の貯水量)から算出している。
 ところが,放水中に貯水量が放水停止量を下回ったならば,本来はその時点で放水を停止しなくてはならない。従ってその日の放水量は先に計算をした放水量より少なくなる。
 これを実現するため,放水停止量を下回っても気にせず,そのまま計算した仮貯水量という仮想的な数量を導入する。そしてもしその値が放水停止量以上ならば,そのまま仮貯水量を貯水量とし,放水量も計算どおりとする。逆にもし下回るようならば,貯水量は放水停止量とし,放水量は元の貯水量と放水停止量の差として求めることにした。
【DNCL】
chosuimax = 15000
chosuistart = 12000
hosuiwariai = 0.15
hosuiteishiwariai = 0.20
daymax = 30

hosuiteishi = chosuimax * hosuiteishiwariai
chosui = chosuistart

day を 0 から daymax まで 1 ずつ増やしながら繰り返す:
│   hosui = chosui * hosuiwariai
│   chosuikari = chosui - hosui
│   もし chosuikari < hosuiteishi ならば:
│   ⎿   hosui = chosui - hosuiteishi
│   表示する(day,"日:貯水量",chosui,":放水量",hosui)
⎿   chosui = chosui - hosui
 ⇨ IDEで動作確認 
 
chosuimax*hosuiteishiwariai chosuisart*hosuiwariai chosuistart*hosuiteishiwariai chosui*hosuiwariai chosui+hosui chosui-hosui chosuikari-housui chosui+hosuiteishi chosui-hosuiteishi
×
[通常版]
chosuimax = 15000 chosuistart = 12000 hosuiwariai = 0.15 hosuiteishiwariai = 0.20 daymax = 30 hosuiteishi = chosuimax * hosuiteishiwariai chosui = chosuistart for day in range(0,daymax+1): hosui = chosui * hosuiwariai chosuikari = chosui - hosui if chosuikari < hosuiteishi: hosui = chosui - hosuiteishi print(day,"日:貯水量",chosui,":放水量",hosui) chosui = chosui - hosui
[研究:グラフ表示版] ※授業で用いたmonacaでは動作しません。
import matplotlib.pyplot as plt chosuimax = 15000 chosuistart = 12000 hosuiwariai = 0.15 hosuiteishiwariai = 0.20 daymax = 30 x_day = [] y_chosui = [] y_hosui = [] hosuiteishi = chosuimax * hosuiteishiwariai chosui = chosuistart for day in range(0,daymax+1): hosui = chosui * hosuiwariai chosuikari = chosui - hosui if chosuikari < hosuiteishi: hosui = chosui - hosuiteishi print(day,"日:貯水量",chosui,":放水量",hosui) x_day.append(day) y_chosui.append(chosui) y_hosui.append(hosui) chosui = chosui - hosui plt.plot(x_day,y_chosui) plt.plot(x_day,y_hosui) plt.show()