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

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

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

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

PyCharm

エディター・開発ツール

Q&A

解決済

1回答

1352閲覧

pythonでmatplotlibを使いグラフを図示できない

rario

総合スコア13

Matplotlib

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

PyCharm

エディター・開発ツール

0グッド

0クリップ

投稿2018/10/02 04:04

編集2018/10/02 04:55

ガウス関数を定義し、その全体の積分値と点tを中心とする幅0.02e-9の区間の積分値の比を取って、横軸がt縦軸が比となるように、matplotlibを使い図示したいが、次のようなエラーが出てしまいます。どのように改善したらよいでしょうか?

The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

python

1import numpy as np 2import matplotlib.pyplot as plt 3 4#あるガウス関数をを定義 5def f(x): 6 delta = 0.017 7 A = 2 * np.log(2) 8 I1 = 4 * ((9.3894 * 10 ** 7)) * np.exp(-((x - (468.5376849) * 10 ** (-9)) / ((delta / A) * 10 ** (-9))) ** 2) 9 I2 = 4 * ((4.9071 * 10 ** 7)) * np.exp(-((x - (468.5407225) * 10 ** (-9)) / ((delta / A) * 10 ** (-9))) ** 2) 10 I3 = 2 * ((9.7947 * 10 ** 6)) * np.exp(-((x - (468.5524404) * 10 ** (-9)) / ((delta / A) * 10 ** (-9))) ** 2) 11 I4 = 2 * ((4.9070 * 10 ** 7)) * np.exp(-((x - (468.5568006) * 10 ** (-9)) / ((delta / A) * 10 ** (-9))) ** 2) 12 I5 = 6 * ((2.0600 * 10 ** 8)) * np.exp(-((x - (468.5703849) * 10 ** (-9)) / ((delta / A) * 10 ** (-9))) ** 2) 13 I6 = 6 * ((1.1266 * 10 ** 8)) * np.exp(-((x - (468.5704380) * 10 ** (-9)) / ((delta / A) * 10 ** (-9))) ** 2) 14 I7 = 4 * ((5.5631 * 10 ** 5)) * np.exp(-((x - (468.5757080) * 10 ** (-9)) / ((delta / A) * 10 ** (-9))) ** 2) 15 I8 = 4 * ((1.1266 * 10 ** 7)) * np.exp(-((x - (468.5757974) * 10 ** (-9)) / ((delta / A) * 10 ** (-9))) ** 2) 16 I9 = 8 * ((2.2070 * 10 ** 8)) * np.exp(-((x - (468.5804092) * 10 ** (-9)) / ((delta / A) * 10 ** (-9))) ** 2) 17 I10 = 6 * ((1.4716 * 10 ** 7)) * np.exp(-((x - (468.5830890) * 10 ** (-9)) / ((delta / A) * 10 ** (-9))) ** 2) 18 I11 = 4 * ((5.0067 * 10 ** 6)) * np.exp(-((x - (468.5884123) * 10 ** (-9)) / ((delta / A) * 10 ** (-9))) ** 2) 19 I12 = 4 * ((5.0067 * 10 ** 6)) * np.exp(-((x - (468.5884123) * 10 ** (-9)) / ((delta / A) * 10 ** (-9))) ** 2) 20 I13 = 2 * ((5.5636 * 10 ** 6)) * np.exp(-((x - (468.5917884) * 10 ** (-9)) / ((delta / A) * 10 ** (-9))) ** 2) 21 y=I1+I2+I3+I4+I5+I6+I7+I8+I9+I10+I11+I12+I13 22 return y 23 24x=np.linspace(468.48*10**(-9),468.65*10**(-9),10000) 25 26 27from scipy import integrate 28 29#ある点tを中心に幅0.02*10**(-9)の区間を積分する 30def g(t): 31 a=integrate.quad(f,t-0.01*10**(-9),t+0.01*10**(-9)) 32 wide = integrate.quad(f, 468.48 * 10 ** (-9), 468.65 * 10 ** (-9)) 33 ratio=wide[0]/a[0] 34 return ratio 35 36t = np.linspace(468.49*10**(-9),468.64*10**(-9),10000) 37 38#横軸t、縦軸ratioで図示する 39plt.plot(t,g(t)) 40plt.show() 41

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

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

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

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

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

guest

回答1

0

ベストアンサー

エラーの原因は、integrate.quad()の第2引数と第3引数にarrayが入力されていることによるものです。
integrate.quad()の第2引数と第3引数への入力はスカラーの必要があると思います。

以下のソースのようにループ等を使用して、各点ごとに積分値を計算するのはどうでしょうか?

python

1from scipy import integrate 2 3#ある点tを中心に幅0.02*10**(-9)の区間を積分する 4def g(t): 5 a=integrate.quad(f,t-0.01*10**(-9),t+0.01*10**(-9)) 6 return a 7 8 9t = np.linspace(468.49*10**(-9),468.64*10**(-9),10000) 10y = np.zeros((0,2)) 11for z in t: 12 y = np.vstack((y, g(z))) 13wide = integrate.quad(f, 468.48 * 10 ** (-9), 468.65 * 10 ** (-9)) 14#横軸t、縦軸ratioで図示する 15plt.plot(t,y[:,0]/wide[0]) 16plt.show()

投稿2018/10/02 05:42

gemstone

総合スコア36

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

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

rario

2018/10/03 00:45 編集

私のコードの中のg(t)関数の中でa[0]として、第一引数のみを抽出できているように思えるのですが、なぜこれでは実行されないのでしょうか?
gemstone

2018/10/03 01:10 編集

g(t)関数中の ratio=wide[0]/a[0] よりも前の a=integrate.quad(f,t-0.01*10**(-9),t+0.01*10**(-9)) の部分で 引数中の t がarrayとなっているためにエラーが発生しています。 この引数 t をスカラーにすることにより、エラーが発生しなくなるはずです。
rario

2018/10/03 07:30 編集

f(x)中のxも同様にarrayとなっていますが、それは問題ないのですか?
gemstone

2018/10/03 08:07

添付してあるソースコード上の x=np.linspace(468.48*10**(-9),468.65*10**(-9),10000) は宣言されているだけで、どこにも使用されていないと思います。 なお、f(x)へarrayを与えた際に問題となるかという問いにつきましては、f(x)関数内でxを使用している関数np.exp()はarrayの入力に対応しているため問題ありません。 f(x)へarrayを与えると、与えたarrayと同じサイズの y が返ってきます。
rario

2018/10/04 01:15

ありがとうございます。納得できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問