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

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

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

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

NumPy

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

Python

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

Q&A

0回答

1064閲覧

Python 微分方程式のΣ内の計算について

keigo.lab

総合スコア1

Matplotlib

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

NumPy

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

Python

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

0グッド

0クリップ

投稿2021/05/27 07:53

編集2021/05/27 07:54

前提・実現したいこと

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でx(i)<x(k)<3.0です。
縦軸に変数y、横軸に変数x(0<x<3)
時間は120sec,dt=6.0sec

Σ内のy(k)をどう扱ったらよいか分からず、自分でプログラムを組んでみたのですがエラーが出てしまいました。

Python初心者なので分かりやすく教えていただきたいです。
宜しくお願いします。

発生している問題・エラーメッセージ

--------------------------------------------------------------------------- NameError Traceback (most recent call last) <ipython-input-38-6e757769c90d> in <module> 55 t=np.arange(0,120,dt) 56 ---> 57 Phelps_Model(a,b,c,d,e,t,dt,x,y).calc() <ipython-input-38-6e757769c90d> in calc(self) 29 F_dy=lambda value: -self._a*value[1]*(self._b-math.exp(self._b-self._c*value[0]**4))+sigma(G(k), value[0], 3.0) 30 for j in range(0,len(self._t)): ---> 31 yy=F_dy([self._x,self._y])*self._dt 32 self._y+=yy 33 resultx.append(self._x) <ipython-input-38-6e757769c90d> in <lambda>(value) 27 resultx=[] 28 resulty=[] ---> 29 F_dy=lambda value: -self._a*value[1]*(self._b-math.exp(self._b-self._c*value[0]**4))+sigma(G(k), value[0], 3.0) 30 for j in range(0,len(self._t)): 31 yy=F_dy([self._x,self._y])*self._dt <ipython-input-32-4694edbacd1d> in G(k) 4 5 def G(k): ----> 6 return self._d*value[1]*math.exp((value[0]-k/2)**2)/self._e*k**2 7 k=3 8 NameError: name 'self' is not defined

該当のソースコード

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 G(k): return self._d*value[1]*math.exp((value[0]-k/2)**2)/self._e*k**2 def sigma(func, frm, to): result = 0; for i in range(frm, to+0.1): result += func(i) return result def calc(self): resultx=[] resulty=[] F_dy=lambda value: -self._a*value[1]*(self._b-math.exp(self._b-self._c*value[0]**4))+sigma(G(k), value[0], 3.0) for j 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/28 04:07

def G(k): は def G(self, k): にしてください。 def sigma(func, frm, to): も def sigma(self, func, frm, to): にしてください。
etherbeg

2021/05/28 12:23

実際に動かしてみたら上のだけじゃなくていっぱいエラー出てきますね…。上のみたいに単なる文法エラーもあれば、プログラムしようとしているモデルを理解していないと直せそうにないのまで、いろいろあります。 上のを直すと今度は NameError: name 'sigma' is not defined というエラーが出ます。これは F_dy=lambda value: -self._a*value[1]*(self._b-math.exp(self._b-self._c*value[0]**4))+sigma(G(k), value[0], 3.0) を F_dy=lambda value: -self._a*value[1]*(self._b-math.exp(self._b-self._c*value[0]**4))+self.sigma(self.G(k), value[0], 3.0) と直せばいいです。ここまでは文法エラー。 次は NameError: name 'k' is not defined というエラーが出ます。このへんから単なる文法エラーじゃなくて内容に関わってきます。 変数 k は G というメソッドの中でだけ使われている変数なので、calc メソッドの中から G メソッドを呼び出すときは、その引数に k という変数は使えません。calc メソッドの中でも使える、「k と同じものを意味していて、すでに使われている別の変数」を使う必要があります。なければまずそれを作ってそれに値を設定してから渡す必要があります。 あと G メソッドの中で value という変数を使っていますが、これも NameError: name 'value' is not defined というエラーになります。value という変数は calc メソッドの中でしか使われてないので、G メソッドの中からは 「見えない」からです(こういう、変数の有効範囲のことを、変数の「スコープ」と言ったりします)。G メソッドを呼び出すときに引数として value も渡せば、とりあえずエラーは出なくなりますが、この解決方法がベストかどうかは、プログラム全体を理解してからでないと判断できません…。 背景知識がないのについまた口を出してしまいました。識者が現れて回答してくれればよいのですが。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問