🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
パラメータ

関数やプログラム実行時に与える設定値をパラメータと呼びます。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Python

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

Q&A

解決済

3回答

4302閲覧

積分関数を含む式を使って2つのパラメータでフィッティング

voigt

総合スコア1

パラメータ

関数やプログラム実行時に与える設定値をパラメータと呼びます。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Python

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

0グッド

0クリップ

投稿2021/01/02 08:58

編集2021/01/02 13:07

前提・実現したいこと

pythonで積分関数(フォークト関数)を使ってフィッティングしようとしています。
単純な関数ではフィッティングができたのですが、積分を組み込むとうまくいきません。
フォークト関数では、zについて積分をします。
パラメータは2つでparam1とparam2です。

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

--------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-10-baa10670dc7d> in <module> 21 22 p0 = 0.5, 0.5 ---> 23 popt, pcov = curve_fit(func, array_x, array_y, p0) ~\Anaconda3\lib\site-packages\scipy\optimize\minpack.py in curve_fit(f, xdata, ydata, p0, sigma, absolute_sigma, check_finite, bounds, method, jac, **kwargs) 750 # Remove full_output from kwargs, otherwise we're passing it in twice. 751 return_full = kwargs.pop('full_output', False) --> 752 res = leastsq(func, p0, Dfun=jac, full_output=1, **kwargs) 753 popt, pcov, infodict, errmsg, ier = res 754 cost = np.sum(infodict['fvec'] ** 2) ~\Anaconda3\lib\site-packages\scipy\optimize\minpack.py in leastsq(func, x0, args, Dfun, full_output, col_deriv, ftol, xtol, gtol, maxfev, epsfcn, factor, diag) 381 if not isinstance(args, tuple): 382 args = (args,) --> 383 shape, dtype = _check_func('leastsq', 'func', func, x0, args, n) 384 m = shape[0] 385 ~\Anaconda3\lib\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): ~\Anaconda3\lib\site-packages\scipy\optimize\minpack.py in func_wrapped(params) 456 if transform is None: 457 def func_wrapped(params): --> 458 return func(xdata, *params) - ydata 459 elif transform.ndim == 1: 460 def func_wrapped(params): <ipython-input-10-baa10670dc7d> in func(x, param1, param2) 17 def voigt(z): 18 return param1 * 0.8256 / np.pi**(3/2) / param2 / widthL * np.exp((-1) * (2 * z / param2)**2 * np.log(2)) / (1 + (2 * (x - z) / widthL)**2) ---> 19 integration = integrate.quad(voigt, -np.inf, np.inf)[0] 20 return integration 21 ~\Anaconda3\lib\site-packages\scipy\integrate\quadpack.py in quad(func, a, b, args, full_output, epsabs, epsrel, limit, points, weight, wvar, wopts, maxp1, limlst) 339 if weight is None: 340 retval = _quad(func, a, b, args, full_output, epsabs, epsrel, limit, --> 341 points) 342 else: 343 retval = _quad_weight(func, a, b, args, full_output, epsabs, epsrel, ~\Anaconda3\lib\site-packages\scipy\integrate\quadpack.py in _quad(func, a, b, args, full_output, epsabs, epsrel, limit, points) 448 return _quadpack._qagse(func,a,b,args,full_output,epsabs,epsrel,limit) 449 else: --> 450 return _quadpack._qagie(func,bound,infbounds,args,full_output,epsabs,epsrel,limit) 451 else: 452 if infbounds != 0: TypeError: only size-1 arrays can be converted to Python scalars

該当のソースコード

python

1import numpy as np 2from scipy import integrate 3from scipy.optimize import curve_fit 4import math 5import pandas as pd 6 7Eins = 2.01 * 10**8 8Lorentzbroad = Eins / 2 / math.pi 9widthL = Lorentzbroad / 10**9 10 11# フィッティング用データの宣言 12df = pd.read_csv('book1.csv') 13array_x=np.array(df['t']) 14array_y=np.array(df['y']) 15 16def func(x, param1, param2): 17 def voigt(z): 18 return param1 * 0.8256 / np.pi**(3/2) / param2 / widthL * np.exp((-1) * (2 * z / param2)**2 * np.log(2)) / (1 + (2 * (x - z) / widthL)**2) 19 integration = integrate.quad(voigt, -np.inf, np.inf)[0] 20 return integration 21 22p0 = 0.5, 0.5 23popt, pcov = curve_fit(func, array_x, array_y, p0)

試したこと

補足情報(FW/ツールのバージョンなど)

python3 Anaconda3

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

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

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

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

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

meg_

2021/01/02 11:08

・コードは「コードの挿入」で記入しましょう。 ・エラーメッセージは全文掲載しましょう。
voigt

2021/01/03 03:00

2点修正いたしました。 宜しくお願いいたします。
meg_

2021/01/03 04:09

エラーは「integration = integrate.quad(voigt, -np.inf, np.inf)[0]」で発生していますね。 未定義の変数(x)があるのとbook1.csvのデータが不明の為検証は出来ませんが、curve_fitを使う前の不具合ですね。
guest

回答3

0

下記関数でnumpy配列を返しているのがエラーの原因ではないでしょうか?(要素数1のnumpy配列であればOKです)

python

1def voigt(z): 2 return param1 * 0.8256 / np.pi**(3/2) / param2 / widthL * np.exp((-1) * (2 * z / param2)**2 * np.log(2)) / (1 + (2 * (x - z) / widthL)**2)

【追記】

積分したい関数に複数引数を与えたいという意味であれば、下記サイト等が参考になるかと思います。
SciPyによる積分(scipy.integrate)①|SciPy入門 #8

投稿2021/01/03 04:25

編集2021/01/04 10:30
meg_

総合スコア10734

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

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

voigt

2021/01/03 04:48

ご確認、ご回答いただきありがとうございます。 データには問題ないことは確認しております。 voigt関数はxの値毎にzで積分した値を得るために使っておりますが、 x毎の値を返すにはどうしたら良いのでしょうか?
meg_

2021/01/03 13:45

param1とparam2が配列値ですよね?そのため計算結果も配列になっているかと思います。
voigt

2021/01/04 06:42

理解力不足で申し訳ありませんが、どのように修正すべきなのでしょうか? 複数パラメータでのフィッティングのため、出力を確認しながらdef functionの引数は設定しました。 よろしくお願い致します。
guest

0

積分関数を組み込んで計算したい人のために一応こちらもあげておきます。
numpy.vectrizeを使うことで計算することができました。
ただし、Faddeeva関数の方が格段に計算速度が速いので、そちらがおすすめです。

Python

1import math 2import numpy as np 3import scipy.optimize 4import scipy.integrate 5import matplotlib.pyplot as plt 6import pandas as pd 7 8df = pd.read_csv('data.csv') 9array_x=np.array(df['t']) 10array_y=np.array(df['y']) 11 12def integrand(x, param): 13 z, peak, gw, lw = param 14 return peak / math.pi**(3/2) / gw / lw * math.exp((-1) * (2 * x / gw)**2 * np.log(2)) / (1 + (2 * (z - x) / lw)**2) 15 16def curve(z, peak, gw, lw): 17 model = scipy.integrate.quad(integrand, -np.inf, np.inf, [z, peak, gw, lw]) 18 return model[0] 19 20vcurve = np.vectorize(curve, excluded=set([1])) 21 22popt, pcov = scipy.optimize.curve_fit(vcurve, array_x, array_y, p0=[1, 1, 1])

投稿2021/01/07 02:28

voigt

総合スコア1

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

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

0

自己解決

Faddeeva関数を計算する方法に変更しました。

Python

1import numpy as np 2import scipy.special 3from scipy.optimize import curve_fit 4import pandas as pd 5 6df = pd.read_csv('book1.csv') 7array_x=np.array(df['t']) 8array_y=np.array(df['y']) 9 10def voigt(xval,norm,center,lw,gw): 11 z = (xval - center + 1j*lw)/(gw * np.sqrt(2.0)) 12 w = scipy.special.wofz(z) 13 model_y = norm * (w.real)/(gw * np.sqrt(2.0*np.pi)) 14 return model_y 15 16popt, pcov = curve_fit(voigt, array_x, array_y)

投稿2021/01/05 02:50

voigt

総合スコア1

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問