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

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

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

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

Python

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

Q&A

1回答

2547閲覧

定義した関数がうまく使えない。quadpack.error: Supplied function does not return a valid float.

youseiranbu7

総合スコア6

NumPy

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

Python

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

0グッド

0クリップ

投稿2017/11/13 16:51

編集2017/11/13 17:08

###前提・実現したいこと
積分を含むある関数を定義して、使おうとしているのですが、具体的な値を代入するとうまくいきません。

最終的にやりたいことは、以下の関数m_model_00(x)のグラフをxy平面上に書くことです。
###発生している問題・エラーメッセージ
quadpack.error: Supplied function does not return a valid float.

###該当のソースコード
python

import math
import numpy as np
import scipy.optimize
from scipy import integrate
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt
import scipy

def dL(z,omega_m,omega_l,H0,c):
def integrand(x):
return 1. / np.sqrt((1.+x)*2.(1.+xomega_m)-x(2.+x)*omega_l)

if omega_m + omega_l ==1: i=integrate.quad(integrand,0.,z) return c*(1.+z)/H0*i[0] elif omega_m + omega_l > 1: i=integrate.quad(integrand,0.,z) return c*(1.+z)/(H0*np.sqrt(abs(1.-omega_m-omega_l)))*np.sin(np.sqrt(abs(1.-omega_m-omega_l))*i[0]) else: i=integrate.quad(integrand,0.,z) return c*(1.+z)/(H0*np.sqrt(abs(1.-omega_m-omega_l)))*np.sinh(np.sqrt(abs(1.-omega_m-omega_l))*i[0])

dL = numpy.vectorize(dL, excluded=("omega_m","omega_l","H0","c"))

def m_model(z,omega_m,omega_l,H0,MB,):
return MB + 5.0*np.log(dL(z,omega_m,omega_l,H0,1.))+25.0

def m_model_00(x):
return m_model(x,0.,0.,0.7,-1.8,1.)

以下、ターミナルで実行した結果です。

execfile("problem_set_04_1b.py")
m_model_00(0.4)

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "problem_set_04_1b.py", line 44, in m_model_00
return m_model(x,0.,0.,0.7,-1.8)
File "problem_set_04_1b.py", line 31, in m_model
return MB + 5.0np.log(dL(z,omega_m,omega_l,H0))+25.0
File "problem_set_04_1b.py", line 26, in dL
return c
(1.+z)/(H0*np.sqrt(abs(1.-omega_m-omega_l)))*np.sinh(np.sqrt(abs(1.-omega_m-omega_l))*integrate.quad(integrand,0.,z))
File "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/scipy/integrate/quadpack.py", line 252, in quad
retval = _quad(func,a,b,args,full_output,epsabs,epsrel,limit,points)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/scipy/integrate/quadpack.py", line 317, in _quad
return _quadpack._qagse(func,a,b,args,full_output,epsabs,epsrel,limit)
quadpack.error: Supplied function does not return a valid float.

###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報

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

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

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

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

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

guest

回答1

0

エラーの
File "problem_set_04_1b.py", line 26, in dL
return c*(1.+z)/(H0*np.sqrt(abs(1.-omega_m-omega_l)))*np.sinh(np.sqrt(abs(1.-omega_m-omega_l))*integrate.quad(integrand,0.,z))
の部分に相当するものが上に貼り付けてあるコードに含まれてないのは気のせいでしょうか?


追記:
不思議な質問ですね。
貼り付けてあるコードは普通に動きます。(一部numpy->npのミスがありますが)
正しく修正した後に過去のエラーを勘違いしていませんか?
i=integrate.quad(integrand,0.,z)
.....*i[0]
とご自身で訂正されています?

python

1import math 2import numpy as np 3import scipy.optimize 4from scipy import integrate 5from scipy.optimize import curve_fit 6import matplotlib.pyplot as plt 7import scipy 8 9def dL(z,omega_m,omega_l,H0,c): 10 def integrand(x): 11 return 1. / np.sqrt((1.+x)**2.*(1.+x*omega_m)-x*(2.+x)*omega_l) 12 13 if omega_m + omega_l ==1: 14 i=integrate.quad(integrand,0.,z) 15 return c*(1.+z)/H0*i[0] 16 elif omega_m + omega_l > 1: 17 i=integrate.quad(integrand,0.,z) 18 return c*(1.+z)/(H0*np.sqrt(abs(1.-omega_m-omega_l)))*np.sin(np.sqrt(abs(1.-omega_m-omega_l))*i[0]) 19 else: 20 i=integrate.quad(integrand,0.,z) 21 return c*(1.+z)/(H0*np.sqrt(abs(1.-omega_m-omega_l)))*np.sinh(np.sqrt(abs(1.-omega_m-omega_l))*i[0]) 22 23dL = np.vectorize(dL, excluded=("omega_m","omega_l","H0","c")) 24 25def m_model(z,omega_m,omega_l,H0,MB,sth): 26 return MB + 5.0*np.log(dL(z,omega_m,omega_l,H0,sth))+25.0 27 28def m_model_00(x): 29 return m_model(x,0.,0.,0.7,-1.8,1.) 30 31print(m_model_00(0.4))

投稿2017/11/14 06:42

編集2017/11/14 06:53
mkgrei

総合スコア8560

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問