D2MatE Top page tklib Top page

tkFitクラス

機能:scipy.optimize.minimize()を利用した非線形最適化・最小二乗法支援。関数変数が一つだけの場合のみ。

コード例

# tkFitのimport
from tklib.tksci.tkFit import tkFit

# tkFitインスタンスの作成。最適化条件を設定
fit = tkFit(tol = cparams.tol, nmaxiter = cparams.maxiter,
                 print_interval = cparams.outputinterval, plot_interval = cparams.graphupdateinterval)

# Excel/CSVファイルからデータを読み込む。xlabel, ylabelを指定すると、fit.x, fit.y にデータのリストが入る
# ラベルはExcelの行番号、あるいはラベル文字列の正規表現
fit.read_data(cparams.infile, xlabel = 0, ylabel = 1, xmin = None, xmax = None, usage = lambda: usage(app))

# fit.labelsにlabelのリスト, fit.datafileにtkVarisousData型で全データ、fit.datalist.dataィstpに2次元リストで全データが入る
labels = fit.labels
datafile = fit.datafile # tkVariousData 
datalist = fit.datalist # list of data set

# labelを指定して、対応する文字列labelと値リストを取得できる
label, v = fit.datafile.FindDataArray(cparams.xlabel, flag = 'i')

# 最適化変数の設定
fit.varname = [ "TD", "Cp0"]
fit.unit        = [ "K", ""]
fit.pk          = [cparams.TD, cparams.Cp0]
fit.optid      = [ 1, 1]

# 目的関数の設定
fit.func = lambda T, *pk: pk[1] * Cp(T, pk[0], pk[1]) #debye_function(T, pk[0])

# 初期値による関数と目的関数の計算
yini = fit.cal_ylist(fit.pk)
fini = fit.minimize_func(fit.pk)

# 初期関数のグラフ表示。interactive matplotlibを使うため、figureインスタンスを渡す
fig, axes = plt.subplots(1, 2, figsize = cparams.figsize)
fit.initial_plot(data_axis = axes[0], error_axis = axes[1], yini = yini, fmin = fini, fig = fig, fontsize = cparams.fontsize)

# 最適化
pfin, ffin, success, res = fit.minimize(cparams.method)
if success:
    print("")
    print(f"Converged at iteration: {res.nit}")
else:
    print("")
    print(f"Function did not converge")

print("Final parameters")
fit.print_variables()

# 収束値によるモデル関数の計算、関数値の表示
yfin = fit.cal_ylist(pfin)
fit.print_data(heading = "Initial and final functions", yini = yini, yfin = yfin)# 収束関数のグラフ表示

# 収束モデル関数のグラフ表示
fit.finalize_plot(yfin, iter = res.nit, fmin = ffin)

# フィッティング条件・結果をinilファイルに保存
fit.save_parameters(cparams.parameterfile, section = 'Parameters', heading = "Save parameters", 
     keys = fit.varname, values = fit.value, optid = fit.optid) 

# プログラムを終了。input()でpauseする
app.terminate("", pause = True)


tkFit_mクラス

機能:scipy.optimize.minimize()を利用した非線形最適化・最小二乗法支援。複数変数の目的関数に対応。

コード例

# tkFit_mのimport
from tklib.tksci.tkFit_m import tkFit_m

# tkFitインスタンスの作成。最適化条件を設定
fit = tkFit_m(tol = cparams.tol, nmaxiter = cparams.maxiter,
                   print_interval = cparams.outputinterval, plot_interval = cparams.graphupdateinterval)

# Excel/CSVファイルからデータを読み込む。xlabel, ylabelを指定すると、fit.x_list, fit.y にデータのリストが入る
# ラベル名は、Excelの行番号、あるいはラベルの正規表現
# fit.indexにデータ番号のリストが作られる
fit.read_data(cparams.infile, xlabels = [0, 1], ylabel = 2, xmin = None, xmax = None, usage = lambda: usage(app))

# 最適化変数の設定
fit.varname = [ "TD", "Cp0"]
fit.unit        = [ "K", ""]
fit.pk          = [cparams.TD, cparams.Cp0]
fit.optid      = [ 1, 1]

nx = len(fit.x_list)
ndata = len(fit.x_list[0])
nvars = len(fit.pk)

# モデル関数の設定
fit.func = lambda x_list, pk: cal_y(x_list, pk, app)

# 初期関数・モデル関数・目的関数の計算、関数値の表示
yini = fit.cal_ylist(fit.pk)
fini = fit.minimize_func(fit.pk)
fit.print_data(heading = "Initial functions", yini = yini)

# 初期モデル関数のグラフ表示。interactive matplotlibを使うため、figureインスタンスを渡す
# 関数変数が1つの場合、グラフの横軸はそのx変数
# 関数変数が複数の場合、グラフの横軸はデータのindex
fig, axes = plt.subplots(1, 2, figsize = cparams.figsize)
fit.initial_plot(data_axis = axes[0], error_axis = axes[1], yini = yini, fmin = fini, fig = fig, fontsize = cparams.fontsize)

# フィッティング変数の表示
fit.print_variables()

# 最適化
pfin, ffin, success, res = fit.minimize(cparams.method)
if success:
    print("")
    print(f"Converged at iteration: {res.nit}")
else:
    print("")
    print(f"Function did not converge")

print("Final parameters")
fit.print_variables()
print(f" f={ffin:12.6g}")

# 収束値によるモデル関数の計算、関数値の表示
yfin = fit.cal_ylist(pfin)
fit.print_data(heading = "Initial and final functions", yini = yini, yfin = yfin)

# 収束関数のグラフ表示
fit.finalize_plot(yfin, iter = res.nit, fmin = ffin)

# フィッティング結果をExcelファイルに保存
fit.to_excel(cparams.convergence_file, 
         [*fit.labels, cparams.olabel, 'initial', 'final'], [*fit.x_list, fit.y, yini, yfin])

# フィッティング条件・結果を ini ファイルに保存
fit.save_parameters(cparams.parameterfile, section = 'Parameters', heading = "Save parameters", 
       keys = fit.varname, values = fit.value, optid = fit.optid) 

# プログラムを終了。input()でpauseする
app.terminate("", pause = True)