Python の講義を受けたので、自分のデータに合わせて Python を使いたいと思っていました。しばらく試してみましたが、なぜこれが機能しないのかまだわかりません。
やりたいこと
サブフォルダー (ここでは 'Test' と呼ばれます) からデータ ファイルを 1 つずつ取得し、データを少し変換して、ローレンツ関数に合わせます。
問題の説明
以下に投稿されたコードを実行すると、何にも適合せず、4 つの関数呼び出しの後に初期パラメーターが返されます。Pythonのドキュメントを何度も何度もチェックした後、データをスケーリングして遊んでみましたが、何も改善されませんでしftol
た。maxfev
また、リストをnumpy.arrays
明示的に変更してみました。また、質問 scipy.optimize.leastsq に与えられた解決策は、new best fit ではなく最良の推測パラメーターを返します, x = x.astype(np.float64)
. 改善なし。奇妙なことに、一部の選択されたデータ ファイルについては、この同じコードがある時点で機能しましたが、大多数のデータ ファイルではまったく機能しませんでした。Origin では、Levenberg-Marquard フィッティング ルーチンでかなり良い結果が得られるため、確実にフィッティングできます。
誰かが何がうまくいかないのか、または代替案を指摘できますか...?
import numpy,math,scipy,pylab
from scipy.optimize import leastsq
import glob,os
for files in glob.glob("*.txt"):
x=[]
y=[]
z=[]
f = open(files, 'r')
raw=f.readlines()
f.close()
del raw[0:8] #delete Header
for columns in ( raw2.strip().split() for raw2 in raw ): #data columns
x.append(float(columns[0]))
y.append(float(columns[1]))
z.append(10**(float(columns[1])*0.1)) #transform data for the fit
def lorentz(p,x):
return (1/(1+(x/p[0] - 1)**4*p[1]**2))*p[2]
def errorfunc(p,x,z):
return lorentz(p,x)-z
p0=[3.,10000.,0.001]
Params,cov_x,infodict,mesg,ier = leastsq(errorfunc,p0,args=(x,z),full_output=True)
print Params
print ier