4

一段时间以来,我一直在尝试为某些数据拟合函数,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

这是由上面的代码生成的绘图图像: 在此处输入图像描述

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
4

2 回答 2

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])

首先给你给出的拟合函数最大值为1,因为你的数据中的峰值是600,它永远不会拟合。所以我加了一个整体因素b。其次,尝试帮助可怜的老curve_fit摆脱困境。如果通过肉眼你可以看到它的峰值,x~35然后通过p0. 这需要对函数的工作原理有一些直觉,但如果您要使用曲线拟合函数,这一点非常重要。

在此处输入图像描述

于 2013-10-11T09:56:24.677 回答
1

我查看了 XY 散点图上的原始数据,拟合该数据的方程似乎需要一个非常尖锐、狭窄的峰。您给出的方程式不会产生峰值响应。在我看来,由于这个原因,将这些数据与给定方程拟合是行不通的。

于 2013-10-15T19:44:37.627 回答