###前提・実現したいこと
scipy.optimizeのlastsqを用いたフィッティングについて質問です。
フィッティングする関数に、積分関数を使いたいと思ってます。
残渣を求める行にintegrate.quad関数を用いて、その引数にパラメーターを指定してフィッティングをしようと思いましたが、下記のエラーが出てつまづいています。
###発生している問題・エラーメッセージ
--------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-32-02de193ee868> in <module>() 25 26 param0 = [1.2, 1, 10.5, -24.3] ---> 27 param = optimize.leastsq(fanction_gauss, param0, args=(x, y)) ~/.pyenv/versions/anaconda3-2.4.1/lib/python3.5/site-packages/scipy/optimize/minpack.py in leastsq(func, x0, args, Dfun, full_output, col_deriv, ftol, xtol, gtol, maxfev, epsfcn, factor, diag) 375 if not isinstance(args, tuple): 376 args = (args,) --> 377 shape, dtype = _check_func('leastsq', 'func', func, x0, args, n) 378 m = shape[0] 379 if n > m: ~/.pyenv/versions/anaconda3-2.4.1/lib/python3.5/site-packages/scipy/optimize/minpack.py in _check_func(checker, argname, thefunc, x0, args, numinputs, output_shape) 24 def _check_func(checker, argname, thefunc, x0, args, numinputs, 25 output_shape=None): ---> 26 res = atleast_1d(thefunc(*((x0[:numinputs],) + args))) 27 if (output_shape is not None) and (shape(res) != output_shape): 28 if (output_shape[0] != 1): <ipython-input-32-02de193ee868> in fanction_gauss(param, x, y) 21 22 def fanction_gauss(param, x, y): ---> 23 residual = y - integrate.quad((param[0]*np.exp(-(x-param[2])**2/(2*param[1]))+param[3]), x-0.25, x+0.25) 24 return residual 25 ~/.pyenv/versions/anaconda3-2.4.1/lib/python3.5/site-packages/scipy/integrate/quadpack.py in quad(func, a, b, args, full_output, epsabs, epsrel, limit, points, weight, wvar, wopts, maxp1, limlst) 321 if (weight is None): 322 retval = _quad(func, a, b, args, full_output, epsabs, epsrel, limit, --> 323 points) 324 else: 325 retval = _quad_weight(func, a, b, args, full_output, epsabs, epsrel, ~/.pyenv/versions/anaconda3-2.4.1/lib/python3.5/site-packages/scipy/integrate/quadpack.py in _quad(func, a, b, args, full_output, epsabs, epsrel, limit, points) 370 def _quad(func,a,b,args,full_output,epsabs,epsrel,limit,points): 371 infbounds = 0 --> 372 if (b != Inf and a != -Inf): 373 pass # standard integration 374 elif (b == Inf and a != -Inf): ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
###該当のソースコード
python
1import sys, csv 2import numpy as np 3from scipy import integrate 4sys.path.append("") 5import matplotlib.pyplot as plt 6 7cnt = 0 8x = np.array([]) 9y = np.array([]) 10da_int = np.array([]) 11 12f = open("beamsize_y_up_45mm.csv", "r", encoding="utf_8_sig") 13try: 14 reader = csv.reader(f) 15 for row in reader: 16 x = np.append(x, float(row[0])) 17 y = np.append(y, float(row[1])) 18 cnt = cnt + 1 19finally: 20 f.close() 21 22def fanction_gauss(param, x, y): 23 residual = y - integrate.quad((param[0]*np.exp(-(x-param[2])**2/(2*param[1]))+param[3]), x-0.25, x+0.25) 24 return residual 25 26param0 = [1.2, 1, 10.5, -24.3] 27param = optimize.leastsq(fanction_gauss, param0, args=(x, y))
###試したこと
フィッティング関数を単なるgaussianにするとうまくいきました。
python
1def gaussian(param, x, y): 2 residual = y - (((param[0]/(np.sqrt(2*np.pi)*param[1]))*np.exp(-(x-param[2])**2/(2*param[1]**2)))+param[3]) 3 return residual
回答をいただいた後、次のようにfanction_gaussを変更しました。
python
1def fanction_gauss(param, x, y): 2 def f(x): 3 return param[0]*np.exp(-(x-param[2])**2/(2*param[1]))+param[3] 4 residual = y - integrate.quad(f, x-0.25, x+0.25)[0] 5 return residual
array型のyからfloatを引いてしまっている?と、書きながら思いました。
###補足情報(言語/FW/ツール等のバージョンなど)
Python 3.5.3 :: Anaconda 2.4.1 (x86_64)を使っています。
python初心者です。よろしくお願いいたします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/08/03 23:19 編集
2017/08/12 14:23