D2MatE Top page tklib Top page
機能: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)
機能: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)