8

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
4

1 に答える 1