获得连续模型,作为两个独立变量在其定义范围之外的函数



我有一个时间数组times=[58418 58422 58424 58426 58428 58430 58540 58542 58650 58654 58656 58658 58660 58662 58664 58666 58668 58670 58672 58674 58768 58770 58772 58774 58776 58778 58780 58782 58784 58786 58788 58790 58792 58794 58883 58884 58886 58888 58890 58890 58892 58894 58896 58898 58904]

以及相应的观测量y_obs =[ 0.00393986 0.00522288 0.00820794 0.01102782 0.00411525 0.00297762 0.00463183 0.00602662 0.0114886 0.00176694 0.01241464 0.01316199 0.01108201 0.01056611 0.0107585 0.00723887 0.0082614 0.01239229 0.00148118 0.00407329 0.00626722 0.01026926 0.01408419 0.02638901 0.02284189 0.02142943 0.02274845 0.01315814 0.01155898 0.00985705 0.00476936 0.00130343 0.00350376 0.00463576 -0.00610933 0.00286234 0.00845177 0.00849791 0.0151215 0.0151215 0.00967625 0.00802465 0.00291534 0.00819779 0.00366089]和相对误差:

y_obs_err = [6.12189334e-05 6.07487598e-05 4.66365096e-05 4.48781264e-05 5.55250430e-05 6.18699105e-05 6.35339947e-05 6.21108524e-05 5.55636135e-05 7.66087180e-05 4.34256323e-05 3.61131000e-05 3.30783270e-05 2.41312040e-05 2.85080015e-05 2.96644612e-05 4.58662869e-05 5.19419065e-05 6.00479888e-05 6.62586953e-05 3.64830945e-05 2.58120956e-05 1.83249104e-05 1.59433858e-05 1.33375408e-05 1.29714326e-05 1.26025166e-05 1.47293107e-05 2.17933175e-05 2.21611713e-05 2.42946630e-05 3.61296843e-05 4.23009806e-05 7.23405476e-05 5.59390368e-05 4.68144974e-05 3.44773949e-05 2.32907036e-05 2.23491451e-05 2.23491451e-05 2.92956472e-05 3.28665479e-05 4.41214301e-05 4.88142073e-05 7.19116984e-05]

我定义了一个函数,该函数将CCD_,一些参数和另一个自变量

p= [ 2.82890497 3.75014266 5.89347542 7.91821558 2.95484056 2.13799544 3.32575733 4.32724456 8.2490644 1.26870083 8.91397925 9.45059128 7.95712563 7.58669608 7.72483557 5.19766853 5.93186433 8.89793105 1.06351782 2.92471065 4.49999613 7.37354766 10.11275281 18.94787684 16.40097363 15.38679306 16.33387783 9.44782842 8.29959664 7.07757293 3.42450524 0.93588962 2.515773 3.32857547 7.180216 2.05522399 6.06855409 6.1016838 10.8575614 10.8575614 6.94775991 5.76187014 2.09327787 5.88619335 2.62859611]

在这里,我定义了计算y变量的函数:

import numpy as np
import matplotlib.pyplot as plt
from lmfit import Model
import scipy.integrate as it
import scipy.constants as scc
def new_f_function(t, sum, f0, a, b,c, T0):
n= 2 * np.pi * sum 
obs_f = f0 + it.cumtrapz(-a * p**c + b, t-T0, initial=0)
new_f = obs_f*(1+sum/scc.c)
return new_f

我创建了一个模型,并用第一个猜测初始化我的参数:

# Create Model
model = Model(new_f_function, independent_vars=['t'])
# Initialize Parameter
params = model.make_params()
params['sum'].value = 1.483 
params['sum'].min = 1.47
params['sum'].max = 1.50
.... # and so on for the others

然后我拟合模型

`result = model.fit(y, params, weights=(1./y_err)), t=times, scale_covar=False)`

以获得最佳拟合参数CCD_ 7。最后,我可以绘制的最佳拟合

fig, (ax1, ax2) = plt.subplots(nrows=2, ncols=1, figsize=(3, 6), sharex='all') ax2.plot(times, result.best_fit, label='best fit')

我的问题是:如何在变量p未定义的点绘制/定义函数(例如,我没有数据(?我想问题与这里类似:Scipy curve_fit:如何绘制数据点之外的拟合曲线?

但在函数具有两个独立变量的情况下,尽管我可以为x轴变量(即时间(定义额外的数据范围,但我不能为观测变量p定义相同的数据范围。

在函数有两个自变量的情况下,尽管我可以为x轴变量定义一个额外的数据范围,即时间,但我不能对观测变量p做同样的事情。

如果你有一个函数f(x,y(=z,你有两个独立的输入变量x和y以及一个输出变量(如果我是对的,这是你观察到的变量(。

您可以通过创建一个二维数组(根据您的需要,与拟合前的时间无关(来绘制它,将每个点传递给函数并绘制所有计算的z。这显然不能用普通的x-y图来绘制。一种方法是3d绘图或2d彩色地图绘图。

不确定我说得对不对。

model对象存储适合的函数,适合的最佳参数存储在result.best_values属性中。

要获得某些新值的函数输出,可以使用以下代码:

new_times_to_evaluate = np.array([56789, 54321])  # Or whatever values you'd like
new_predictions = model.eval(  # evaluate your model
**result.best_values,  # unpack the dictionary of best parameters to use for evaluation
t=new_times_to_evaluate  # evaluate on these new times
)
ax2.plot(new_times_to_evaluate, new_predictions, label='my new values')

我认为您要求在用于拟合的点之外的点上评估最佳拟合模型。FWIW,这是一件需要做的好事,可以在拟合范围之外对模型进行插值或外推。

要做到这一点,只需执行:

result = model.fit(y, params, weights=(1./y_err)), t=times, 
scale_covar=False)
predicted = result.eval(t=new_times)

只要把它理解为"在新的时代评估结果"。

最新更新