【发布时间】:2017-04-08 18:24:02
【问题描述】:
我尝试使用以下代码将三项高斯函数拟合到数据中:
import ROOT
#from ROOT import TF1
import numpy as np
data = np.loadtxt('V_lambda_n.dat')
r = data[:, 0]
V = data[:, 1]
graph = ROOT.TGraph()
for i in range(len(V)):
graph.SetPoint(i, r[i], V[i])
def myfunc(x, p):
return p[0]*np.exp(-(x/p[1])**2) + p[1]*np.exp(-(x/p[2])**2) + p[2]*np.exp(-(x/p[3])**2)
func=ROOT.TF1("func", myfunc, 0.0e-15,4e-15, 4)
func.SetParameters(-1.0, -1.0, 1.0, 1.0)
graph.Fit(func)
canvas = ROOT.TCanvas("name", "title", 1024, 768)
graph.GetXaxis().SetTitle("r") # set x-axis title
graph.GetYaxis().SetTitle("V") # set y-axis title
graph.Draw("AP")
我收到以下错误:
TypeError: none of the 2 overloaded methods succeeded. Full details:
TFitResultPtr TGraph::Fit(const char* formula, const char* option = "", const char* goption = "", double xmin = 0, double xmax = 0) =>
could not convert argument 1 (expected string or Unicode object, TF1 found)
TFitResultPtr TGraph::Fit(TF1* f1, const char* option = "", const char* goption = "", double xmin = 0, double xmax = 0) =>
TFN python function call failed (C++ exception of type runtime_error)
我该如何解决这个错误?它似乎在抱怨类对象“func”。这是数据
r V
0.1700 192.8424
0.1800 168.5586
0.1900 147.4645
0.2000 128.8915
0.2100 112.3266
0.2200 97.3737
0.2300 83.7266
0.2400 71.1502
0.2500 59.4669
0.2600 48.5469
0.2700 38.3009
0.2800 28.6740
0.2900 19.6411
0.3000 11.2018
0.3100 3.3759
0.3200 -3.8022
0.3300 -10.2887
0.3400 -16.0363
0.3500 -21.0003
0.3600 -25.1442
0.3700 -28.4448
0.3800 -30.8960
0.3900 -32.5114
0.4000 -33.3251
0.4100 -33.3908
0.4200 -32.7797
0.4300 -31.5765
0.4400 -29.8754
0.4500 -27.7754
0.4600 -25.3755
0.4700 -22.7709
0.4800 -20.0496
0.4900 -17.2902
0.5000 -14.5601
0.5100 -11.9151
0.5200 -9.3994
0.5300 -7.0462
0.5400 -4.8785
0.5500 -2.9108
0.5600 -1.1499
0.5700 0.4033
0.5800 1.7530
0.5900 2.9069
0.6000 3.8756
0.6100 4.6715
0.6200 5.3081
0.6300 5.7995
0.6400 6.1599
0.6500 6.4034
0.6600 6.5436
0.6700 6.5934
0.6800 6.5651
0.6900 6.4700
0.7000 6.3186
0.7100 6.1206
0.7200 5.8847
0.7300 5.6189
0.7400 5.3303
0.7500 5.0252
0.7600 4.7092
0.7700 4.3874
0.7800 4.0639
0.7900 3.7426
0.8000 3.4266
0.8100 3.1185
0.8200 2.8207
0.8300 2.5348
0.8400 2.2624
0.8500 2.0046
0.8600 1.7620
0.8700 1.5352
0.8800 1.3245
0.8900 1.1298
0.9000 0.9512
0.9100 0.7882
0.9200 0.6405
0.9300 0.5076
0.9400 0.3887
0.9500 0.2832
0.9600 0.1904
0.9700 0.1094
0.9800 0.0395
0.9900 -0.0202
1.0000 -0.0705
1.0100 -0.1122
1.0200 -0.1460
1.0300 -0.1729
1.0400 -0.1934
1.0500 -0.2083
1.0600 -0.2183
1.0700 -0.2240
1.0800 -0.2260
1.0900 -0.2248
1.1000 -0.2209
1.1100 -0.2148
1.1200 -0.2068
1.1300 -0.1974
1.1400 -0.1869
1.1500 -0.1755
1.1600 -0.1636
1.1700 -0.1514
1.1800 -0.1390
1.1900 -0.1266
1.2000 -0.1144
1.2100 -0.1024
1.2200 -0.0909
1.2300 -0.0798
1.2400 -0.0692
1.2500 -0.0592
1.2600 -0.0498
1.2700 -0.0410
1.2800 -0.0328
1.2900 -0.0252
1.3000 -0.0183
1.3100 -0.0120
1.3200 -0.0062
1.3300 -0.0010
1.3400 0.0037
1.3500 0.0078
1.3600 0.0115
1.3700 0.0147
1.3800 0.0175
1.3900 0.0199
1.4000 0.0219
1.4100 0.0236
1.4200 0.0250
1.4300 0.0262
1.4400 0.0270
1.4500 0.0277
1.4600 0.0281
1.4700 0.0284
1.4800 0.0285
1.4900 0.0285
1.5000 0.0284
1.5100 0.0281
1.5200 0.0278
1.5300 0.0273
1.5400 0.0269
1.5500 0.0263
1.5600 0.0258
1.5700 0.0251
1.5800 0.0245
1.5900 0.0239
1.6000 0.0232
1.6100 0.0225
1.6200 0.0219
1.6300 0.0212
1.6400 0.0205
1.6500 0.0199
1.6600 0.0192
1.6700 0.0186
1.6800 0.0180
1.6900 0.0174
1.7000 0.0168
1.7100 0.0162
1.7200 0.0157
1.7300 0.0152
1.7400 0.0147
1.7500 0.0142
1.7600 0.0137
1.7700 0.0133
1.7800 0.0128
1.7900 0.0124
1.8000 0.0120
1.8100 0.0116
1.8200 0.0113
1.8300 0.0109
1.8400 0.0106
1.8500 0.0103
1.8600 0.0099
1.8700 0.0096
1.8800 0.0094
1.8900 0.0091
1.9000 0.0088
1.9100 0.0086
1.9200 0.0083
1.9300 0.0081
1.9400 0.0079
1.9500 0.0076
1.9600 0.0074
1.9700 0.0072
1.9800 0.0070
1.9900 0.0068
2.0000 0.0066
2.0100 0.0065
2.0200 0.0063
2.0300 0.0061
2.0400 0.0060
2.0500 0.0058
2.0600 0.0057
2.0700 0.0055
2.0800 0.0054
2.0900 0.0052
2.1000 0.0051
2.1100 0.0050
2.1200 0.0048
2.1300 0.0047
2.1400 0.0046
2.1500 0.0045
2.1600 0.0043
2.1700 0.0042
2.1800 0.0041
2.1900 0.0040
2.2000 0.0039
2.2100 0.0038
2.2200 0.0037
2.2300 0.0036
2.2400 0.0035
2.2500 0.0034
2.2600 0.0033
2.2700 0.0033
2.2800 0.0032
2.2900 0.0031
2.3000 0.0030
2.3100 0.0029
2.3200 0.0029
2.3300 0.0028
2.3400 0.0027
2.3500 0.0026
2.3600 0.0026
2.3700 0.0025
2.3800 0.0024
2.3900 0.0023
2.4000 0.0023
2.4100 0.0022
2.4200 0.0021
2.4300 0.0021
2.4400 0.0020
2.4500 0.0019
2.4600 0.0019
2.4700 0.0018
2.4800 0.0017
2.4900 0.0017
2.5000 0.0016
2.5100 0.0016
2.5200 0.0015
2.5300 0.0014
2.5400 0.0014
2.5500 0.0013
2.5600 0.0013
2.5700 0.0012
2.5800 0.0011
2.5900 0.0011
2.6000 0.0010
2.6100 0.0010
2.6200 0.0009
2.6300 0.0009
2.6400 0.0008
2.6500 0.0007
2.6600 0.0007
2.6700 0.0006
2.6800 0.0006
2.6900 0.0005
2.7000 0.0005
2.7100 0.0004
2.7200 0.0004
2.7300 0.0003
2.7400 0.0003
2.7500 0.0003
2.7600 0.0002
2.7700 0.0002
2.7800 0.0001
2.7900 0.0001
2.8000 0.0001
2.8100 0.0000
2.8200 -0.0000
2.8300 -0.0001
2.8400 -0.0001
2.8500 -0.0001
2.8600 -0.0001
2.8700 -0.0002
2.8800 -0.0002
2.8900 -0.0002
2.9000 -0.0002
2.9100 -0.0003
2.9200 -0.0003
2.9300 -0.0003
2.9400 -0.0003
2.9500 -0.0004
2.9600 -0.0004
2.9700 -0.0004
2.9800 -0.0004
2.9900 -0.0004
3.0000 -0.0004
3.0100 -0.0004
3.0200 -0.0004
3.0300 -0.0005
3.0400 -0.0005
3.0500 -0.0005
3.0600 -0.0005
3.0700 -0.0005
3.0800 -0.0005
3.0900 -0.0005
3.1000 -0.0005
3.1100 -0.0005
3.1200 -0.0005
3.1300 -0.0005
3.1400 -0.0005
3.1500 -0.0005
3.1600 -0.0006
3.1700 -0.0006
3.1800 -0.0006
3.1900 -0.0006
3.2000 -0.0006
3.2100 -0.0006
3.2200 -0.0006
3.2300 -0.0006
3.2400 -0.0006
3.2500 -0.0006
3.2600 -0.0007
3.2700 -0.0007
3.2800 -0.0007
3.2900 -0.0007
3.3000 -0.0007
3.3100 -0.0007
3.3200 -0.0008
3.3300 -0.0008
3.3400 -0.0008
3.3500 -0.0008
3.3600 -0.0008
3.3700 -0.0008
3.3800 -0.0009
3.3900 -0.0009
3.4000 -0.0009
3.4100 -0.0009
3.4200 -0.0010
3.4300 -0.0010
3.4400 -0.0010
3.4500 -0.0010
3.4600 -0.0010
3.4700 -0.0011
3.4800 -0.0011
3.4900 -0.0011
3.5000 -0.0011
3.5100 -0.0011
3.5200 -0.0012
3.5300 -0.0012
3.5400 -0.0012
3.5500 -0.0012
3.5600 -0.0012
3.5700 -0.0013
3.5800 -0.0013
3.5900 -0.0013
3.6000 -0.0013
3.6100 -0.0013
3.6200 -0.0013
3.6300 -0.0013
3.6400 -0.0013
3.6500 -0.0014
3.6600 -0.0014
3.6700 -0.0014
3.6800 -0.0014
3.6900 -0.0014
3.7000 -0.0014
3.7100 -0.0014
3.7200 -0.0014
3.7300 -0.0014
3.7400 -0.0014
3.7500 -0.0014
3.7600 -0.0014
3.7700 -0.0014
3.7800 -0.0014
3.7900 -0.0014
3.8000 -0.0014
3.8100 -0.0014
3.8200 -0.0014
3.8300 -0.0014
3.8400 -0.0014
3.8500 -0.0014
3.8600 -0.0013
3.8700 -0.0013
3.8800 -0.0013
3.8900 -0.0013
3.9000 -0.0013
3.9100 -0.0013
3.9200 -0.0013
3.9300 -0.0013
3.9400 -0.0013
3.9500 -0.0013
3.9600 -0.0013
3.9700 -0.0013
3.9800 -0.0013
3.9900 -0.0013
4.0000 -0.0013
【问题讨论】:
-
你能发布一些数据吗?您可以尝试更改参数的初始猜测(先绘制数据并手动播放)。
-
@Cleb 我在帖子末尾包含了数据。谢谢
-
好的,它必须是
ROOT还是scipy 的curve_fit也可以接受另一个合适的工具? -
过去三天我一直在尝试使用 scipy 的曲线拟合,但没有成功。在这一点上,我欢迎任何编程语言的适合。
-
您的模型与您的数据不匹配(而且,真的不能)。您也许可以使用三个均以零为中心的高斯,但不能使用 ps2 既是 peak1 的宽度又是 peak2 的幅度等的约束。
标签: python-2.7 curve-fitting data-fitting pyroot