質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1140閲覧

オイラー法を使ったpython

ngm_programmer

総合スコア5

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2021/12/24 08:53

編集2021/12/25 01:05

Q。

という問題で、オイラー法を使って解く問題なのですが、分からないのでご教授お願い致します。

python

1import math 2import matplotlib.pyplot as plt 3import pandas as pd 4 5r = 0.01 6k = 30 7n = 1 8t = 2 9 10while r > 0: 11 r1 = r - n*t 12 k1 = k - n*t 13 print(r1,k1)

こんな感じで書いてみたんですが、同じ値しか出てきませんでした。

どうかよろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

srsnsts

2021/12/24 09:01

解くべき微分方程式の記述がないようですが。
ngm_programmer

2021/12/24 09:08

dn/dt = r(1-n/k)n です。大変申し訳ございません。よろしくお願いいたします。
srsnsts

2021/12/24 09:11

ご返答ありがとうございます。 微分方程式了解です。 回答を書くのでしばらくお待ち下さい。
ngm_programmer

2021/12/24 09:13

すみません。 ありがとうございます。 自分では、何が何だかわからないので、差し支えなければ、詳細に御教授頂けますと幸いです。 よろしくお願いいたします。
srsnsts

2021/12/24 09:18

ご返答ありがとうございます。 > 自分では、何が何だかわからないので、差し支えなければ、詳細に御教授頂けますと幸いです。 まぁ最初は誰でもそうですよ。 ちょっと待ってて下さい。
ngm_programmer

2021/12/24 09:51

御親切にありがとうございます。 心折れかけていたので、、、。 よろしくお願いいたします。
srsnsts

2021/12/25 01:58

> Q:ケージでネズミを飼っているとする。1匹のネズミは複数匹出産するので個体数は増えるが、個体数が増えるほ > ど餌や生活空間の取り合いで成長率が個体数に比例して減少すると考えられる。このとき、ネズミの個体数の時間 > 変化を計算し、グラフに表せ(横軸を時間、縦軸を個体数とする)。簡単のため、ネズミは死なないし、雌雄の区別な > く単体で継続して出産できるものとする。 > 解くべき微分方程式は次のようになる。r = 0.01 [/日], k = 30 [匹] とし、最初 1匹だったネズミの個体数を1日後 > までプロットせよ。 この部分を質問から削除したのはなぜですか? あとから見た人がどんな質問なのかわからなくなるじゃないですか。 もとに戻していただけませんか? このようなことをしたら、以後あなたの質問に対して回答しませんよ?
guest

回答1

0

ベストアンサー

解くべき微分方程式は

dn/dt = r(1 - n/k)n

ですね。この式の左辺を離散化します。

微少時間 dt の間に、n が next_n に変化するとします。

すると微分方程式の左辺はオイラー法に従うと

(next_n - n)/dt と離散化できます。

つまり、

(next_n - n)/dt = r(1 - n/k)n

となります。この式を next_nについて解くと、

next_n = n + dt * r * (1 - n/k) * n

となります。

初期値として n = 1.0, r = 0.01, k = 30.0 を代入すると、next_n を計算することができます。

next_n を求めた後、n に 求めた next_n の値を代入し、繰り返し next_n の値を求めればよいです。

これをpythonでコード化します。

依頼を受けてグラフを表示できるように修正しました。

python

1import matplotlib.pyplot as plt 2 3r = 0.01 4k = 30.0 5n = 1.0 6dt = 1.0 7 8t = 0 9x = [t] 10y = [n] 11while t <= 1000: 12 next_n = n + dt * r * ( 1.0 - n / k ) * n 13 t = t + 1 14 x.append(t) 15 y.append(next_n) 16 n = next_n 17 18plt.plot(x,y) 19plt.show()

このプログラムで計算すると、900秒ぐらいでnが30に収束することがわかります。
参考にしてみて下さい。

投稿2021/12/24 10:05

編集2021/12/24 12:42
srsnsts

総合スコア508

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ngm_programmer

2021/12/24 10:20

ご回答いただきまして、誠にありがとうございます。 とても勉強になりました。 オイラー法の当てはめ方と今回の計算方法を理解することができました。 ありがとうございます。 これをグラフにするにはどのようにしたらよろしいでしょうか。。。 申し訳ございません。よろしくお願いいたします。
srsnsts

2021/12/24 10:23

> オイラー法の当てはめ方と今回の計算方法を理解することができました。 > ありがとうございます。 それはなにより。 > これをグラフにするにはどのようにしたらよろしいでしょうか。。。 > 申し訳ございません。よろしくお願いいたします。 あ〜僕はgnuplot使ったんだけど、 gnuplotって知ってる? それともパイソニスタっぽいやり方のほうがいい?
ngm_programmer

2021/12/24 11:55

ご連絡遅くなってしまい申し訳ございません。 現在使用しているものがGoogle Colaboになっております。。。
srsnsts

2021/12/24 12:17

ブラウザで動くPython環境みたいな感じかな?
srsnsts

2021/12/24 12:23

僕が提示したプログラムをPythonだけでグラフ表示できるようにしてみるね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問