@@ -87,7 +87,7 @@ def setData():
87
87
return xData,yData,func,prior
88
88
89
89
if __name__ == ' __main__' :
90
- xData,yData,func,prior = setData()
90
+ xData,yData,func,prior = setData
91
91
fit = lsqfit.nonlinear_fit(data = (xData,yData),fcn = func,prior = prior)
92
92
print (fit.format(maxline = True ))
93
93
```
@@ -100,18 +100,18 @@ Least Square Fit:
100
100
Parameters:
101
101
w 2.95(35)e-14 [ 2.0 (1.0) ] *
102
102
h 3.9712361677636982548733612930 (43) [ 3.80 (10) ] *
103
- w2 8.038(69)e-17 [ 0.1 (1.0) ]
104
- h2 5.0774354372295347204158133536 (13) [ 4 (10) ]
103
+ w2 8.038(69)e-17 [ 0.1 (1.0) ]
104
+ h2 5.0774354372295347204158133536 (13) [ 4 (10) ]
105
105
106
106
Fit:
107
107
x[k] y[k] f(x[k],p)
108
108
---------------------------------------
109
109
8 34.67 (18) 34.33 (12) *
110
- 9 16.489 (93) 16.562 (50)
110
+ 9 16.489 (93) 16.562 (50)
111
111
10 7.910 (49) 8.000 (21) *
112
- 11 3.884 (26) 3.8702 (99)
112
+ 11 3.884 (26) 3.8702 (99)
113
113
12 1.861 (14) 1.8753 (60) *
114
- 13 0.9110 (75) 0.9104 (40)
114
+ 13 0.9110 (75) 0.9104 (40)
115
115
14 0.4476 (40) 0.4429 (27) *
116
116
117
117
Settings:
@@ -121,5 +121,64 @@ Settings:
121
121
```
122
122
第一部分是用于评价拟合质量的参数,第二部分是拟合得到的参数,后面的一个 * 代表期望值与数据相差一个 $\sigma$
123
123
124
+ ## Eaxmple: 两点关联函数拟合(two-state fit)
125
+ 以下是一个 two-state fit 例子。注意总是把能级最高的态考虑为所有高激发态的污染项。
126
+
127
+ 假设一个两点关联函数的变量 ` correlator ` , 形状为 ` correlator.shape = (Ncfg, Nt) ` 。
128
+
129
+ 第一步是计算带误差的两点关联函数,误差由统计学中的重抽样方法(resampling)给出。格点中一般使用的重抽样方法包括: Jackknife (刀切法)或 Bootstrap 方法。
130
+
131
+ 调用函数 ` gv.dataset.avg_data ` 做重抽样给出误差,
132
+ ``` python
133
+ corr = gv.dataset.avg_data(correlator[:, :])
134
+ print (corr)
135
+ ```
136
+ 你会看到输入的 ` (Ncfg, Nt) ` 后, 输出 ` (Nt) ` 长度的带误差的两点关联函数。即是我们要拟合的 ` ydata ` 。
137
+
138
+ 定义两点关联函数的拟合函数 ` func ` ,
139
+ ``` python
140
+ def func (t , p ):
141
+ E1 = p[' E1' ]
142
+ E2 = p[' E2' ]
143
+ Z1 = p[' Z1' ]
144
+ Z2 = p[' Z2' ]
145
+
146
+ ans = Z1 * (gv.exp(- E1 * t) + gv.exp(- E1 * (Nt - t)))
147
+ ans += Z2 * (gv.exp(- E2 * t) + gv.exp(- E2 * (Nt - t)))
148
+ return ans
149
+ ```
150
+
151
+ 接下来要定义一个给程序做拟合用的初值,
152
+ ```
153
+ prior = {
154
+ 'Z1': gv.gvar(1, 10),
155
+ 'Z2': gv.gvar(1, 10),
156
+ 'E1': gv.gvar(0.55, 0.2),
157
+ 'E2': gv.gvar(0.90, 0.2),
158
+ }
159
+ ```
160
+
161
+ > ** 注意:**
162
+ > - 初值的输入参数有两个:` prior ` 或 ` p0 ` 。` prior ` 是带误差的` gv.Gvar ` 类型, ` p0 ` 是一个数。
163
+ > - ` prior ` 和 ` p0 ` 作为输入参数互斥,即二选一输入。
164
+ > - 如果你使用 ` prior ` , 建议误差给大一些。
165
+ > - * (重要)* :` prior ` 或 ` p0 ` 改变可能导致拟合失败。但已经拟合上的前提下,拟合结果不应该依赖 ` prior ` 或 ` p0 ` 。
166
+
167
+ 然后做拟合,
168
+ ```
169
+ fit_window = np.arange(15, 64)
170
+ xdata = np.arange(Nt)[fit_window]
171
+ ydata = gv.dataset.avg_data(correlator[:, :])[fit_window]
172
+
173
+ fit = lsqfit.nonlinear_fit(data=(xdata, ydata),
174
+ fcn=func,
175
+ prior=prior,
176
+ )
177
+ print(fit.format(maxline=True))
178
+ fit_E = fit.p["E1"] if gv.mean(fit.p["E1"]) < gv.mean(fit.p["E2"]) else fit.p["E2"]
179
+ fit_func = fit.fcn(np.arange(Nt), fit.p)
180
+ ```
181
+
182
+ ## Example: 联合拟合(joint fit)
124
183
125
184
0 commit comments