mar*_*sch 4 python numpy matplotlib curve-fitting data-fitting
我一直在尝试使用一些功能来使用某些数据,scipy.optimize.curve_fit但我确实遇到了困难.我真的看不出为什么这不起作用的原因.
# encoding: utf-8
from __future__ import (print_function,
division,
unicode_literals,
absolute_import,
with_statement)
import numpy as np
from scipy.optimize import curve_fit
import matplotlib.pyplot as mpl
x, y, e_y = np.loadtxt('data.txt', unpack=True)
def f(x, a, k):
return (1/(np.sqrt(1 + a*((k-x)**2))))
popt, pcov = curve_fit(f, x, y, maxfev = 100000000)
mpl.plot(x, f(x, *popt), 'r-', label='Fit')
mpl.plot(x, y, 'rx', label='Original')
mpl.legend(loc='best')
mpl.savefig('curve.pdf')
print(popt)
# correct values which should be calculated
# a=0.003097
# k=35.4
Run Code Online (Sandbox Code Playgroud)
这是由上层代码生成的情节图像:

data.txt:
#x y e_y
4.4 0.79 0.13
19.7 4.9 0.8
23.5 7.3 1.2
29.7 17 2.79
30.7 21.5 3.52
34 81 13.28
34.6 145 23.77
35.4 610 100
36.3 115 18.85
38.1 38 6.23
43.7 14 2.3
56.2 6.2 1.02
64.7 4.6 0.75
79.9 3.2 0.52
210 0.98 0.16
Run Code Online (Sandbox Code Playgroud)
Gre*_*reg 16
首先尽量不要增加maxfev这么大,这通常是其他问题出现的迹象!玩耍我可以通过以下添加得到一个合适的:
def f(x, b, a, k):
return (b/(np.sqrt(1 + a*((k-x)**2))))
popt, pcov = curve_fit(f, x, y, p0=[20, 600.0, 35.0])
Run Code Online (Sandbox Code Playgroud)
首先给出你给出的拟合函数最多为1,因为数据中的峰值是600,它永远不适合.所以我添加了一个整体因素b.其次,尝试帮助穷人的旧曲线.如果用眼睛你可以看到它的峰值,x~35然后通过它告诉它p0.这需要一些关于函数如何工作的直觉,但如果你要使用曲线拟合函数则非常重要.
