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

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

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

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Python

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

Q&A

解決済

1回答

959閲覧

Pythonで微分方程式を解き、グラフに表示させるコードについて

keigo.lab

総合スコア1

Anaconda

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Python

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

0グッド

0クリップ

投稿2021/05/19 05:10

編集2021/05/25 07:50

前提・実現したいこと

Pythonで微分方程式を解いてグラフに表示させたいです。
dy(i)/dt=-ay(i){b-exp(b-cx(i)**4)}+Σ[d*y(k)exp{(x(i)-x(k)/2)**2/(ex(k)**2)}]
Σの変数はkで0<k<3です。
縦軸に変数y、横軸に変数x(0<x<3)
時間は120sec,dt=6.0sec

F_dy=lambda value: -self._a*value[1]*(self._b-math.exp(self._b-self._c*value[0]**4))

この部分で、変数i,kをどのようにコードに組み込んだらいいのか分かりません。
式の前半部分は書けているのですが、Σ以降がまだ書けていません。
Python初心者なので分かりやすく教えていただきたいです。
宜しくお願いします。

現在のコードでのエラーはありません。

試したこと

現在のコードは以下の通りです。

import matplotlib.pyplot as plt import numpy as np import math class Phelps_Model(object): def __init__(self, a, b, c, d, e, t, dt, x, y): self._a=a self._b=b self._c=c self._d=d self._e=e self._t=t self._dt=dt self._x=x self._y=y def calc(self): resultx=[] resulty=[] F_dy=lambda value: -self._a*value[1]*(self._b-math.exp(self._b-self._c*value[0]**4)) for i in range(0,len(self._t)): yy=F_dy([self._x,self._y])*self._dt self._y+=yy resultx.append(self._x) resulty.append(self._y) self.show(resultx,resulty) def show(self,x,y): fig=plt.figure() ax=fig.add_subplot() ax.plot(x,y,'o') plt.xlim(0, 4.0) plt.ylim(0, 100) ax.set_xlabel('fiber length') ax.set_ylabel('Number of fibers') plt.show() a=0.2 b=1.0 c=1.337 d=0.002 e=0.02 x=0.0 y=0.0 dt=6.0 t=np.arange(0,120,dt) Phelps_Model(a,b,c,d,e,t,dt,x,y).calc()

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

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

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

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

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

etherbeg

2021/05/20 10:39 編集

Pythonはインデント(字下げ)が意味を持つプログラミング言語ですので、インデントが消えないように書き込んでいただく必要があります。ソースコードを直接地の文に書き込むと、それ以外にも表記上の不具合がありますので、ソースコードは以下を参考に、Markdown記法を使って書き込んでください。 https://teratail.com/help#about-markdown https://teratail.com/help/question-tips#questionTips3-5-1 あと、ソースコードの Phelps_Model(x,y,t).calc() の部分が抜けていませんか? 以上確認の上、修正をお願いします。
etherbeg

2021/05/20 10:42

Phelps_Model(x,y,t).calc() でPhelps_Modelに渡している x と y の定義(値の設定)もソースコード中に存在しません。ソースコードに追加をお願いします。
keigo.lab

2021/05/24 01:15

修正しました。確認を宜しくお願い致します。
etherbeg

2021/05/24 09:07

ソースコードを実行をしてみてどんなエラーが表示されたでしょうか。「発生している問題・エラーメッセージ」欄に記載されているエラーメッセージは、現在のソースコードの実行で発生しているエラーメッセージではないと思いますが。 私は微分方程式や数値計算での解法については詳しくないので(ましてや質問者さんの出された数式の背景については何も知らないので)、Pythonプログラムの具体的な不具合に対するアドバイスしかできません。質問者さんの書かれているPythonプログラム自体が、質問者さんの解決したい問題に対する解法(のプログラム表現)として間違っていたら、申し訳ないのですがそれは私には分かりません…。 今回はソースコード(とその実行)からだけでもわかる不具合が複数ありましたので、まとめて回答欄に記載しました。それらをすべて直せば、とりあえずエラーなしに動くようにはなると思います。
keigo.lab

2021/05/25 07:32

丁寧にご指摘くださりありがとうございます。 エラーなしで動きました。 この式にシグマの式をプラスしてプログラムを作成したいのですが、どうしたらよいかわからずご教授お願いしたいです。 コード等は修正してあります。宜しくお願い致します。
etherbeg

2021/05/27 10:18

新しく質問を立てられたんですね。私ではこれ以上お力になれそうになかったのでそうしていただいて良かったです。中途半端な回答しかできず申し訳ありませんでした。
keigo.lab

2021/05/27 14:37

とんでもないです。お力を貸していただき有難うございました。
guest

回答1

0

ベストアンサー

  1. Phelps_Model クラスの calc メソッドの中に F_dy=lambda value: -a*value[1]*(b-math.exp(b-c*value[0]**4)) というコードがありますが、math.exp() 関数を使う際に math モジュールが事前にインポートされていないために、エラーになります。先頭の import 文に import math を追加する必要があります。

  2. Phelps_Model クラスの calc メソッドの中に F_dy=lambda value: -a*value[1]*(b-math.exp(b-c*value[0]**4)) というコードがありますが、このスクリプトであれば F_dy=lambda value: -self._a*value[1]*(self._b-math.exp(self._b-self._c*value[0]**4)) とした方がいいですね。これについては直さなくてもエラーになるわけではないので、直すべきかどうか、直すならどう直すのが良いのか、私もちょっと悩むのですが…。

  3. Phelps_Model クラスの calc メソッドの中に self._x+=xx というコードがありますが、xx の値が事前に設定されていないために、エラーになります。xx の値を計算するコードを追加する必要があります。

  4. Phelps_Model クラスの show メソッドの中に ax.plot(x,y,'o') というコードがありますが、ax というオブジェクトが存在しないために、エラーになります。fig=plt.figure() の後に ax=fig.add_subplot()(もしくは ax=fig.subplots())というコードを追加する必要があります。

  5. Phelps_Model クラスの最後に def Phelps_Model.calc() というコードがありますが、コードとして意味を成さないために、シンタックスエラーとなります。何のためにこの一文をここに置いたのか分かりませんが、コード中で何も機能を果たしていませんので、単に削除するだけでいいでしょう。

  6. スクリプトの末尾に Phelps_Model(a,b,c,t,dt,x,y).calc() というコードがありますが、x と y の値が事前に設定されていないために、エラーになります。x と y の値(初期値ということになるのでしょうか)を設定するコードを追加する必要があります。

投稿2021/05/24 09:06

etherbeg

総合スコア1195

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問