Python Scipy曲线拟合函数使用初始猜测值,而不是实际拟合

Python Scipy曲线拟合函数使用初始猜测值,而不是实际拟合,python,numpy,matplotlib,scipy,curve-fitting,Python,Numpy,Matplotlib,Scipy,Curve Fitting,我是编程方面的新手,尤其是曲线拟合方面。但我尝试将模型曲线拟合到我使用Python和Numpy进行的一些测量中 我成功地将一条“拟合”曲线绘制成一组数据。嗯,看起来是这样的。结果证明,该函数只使用初始猜测,并不尝试实际拟合曲线。我通过对不同数据集使用相同的初始猜测来测试这一点。结果是: fitParams的输出是fitcarvariances(这似乎是非常奇怪的值): def fitFunc()的输出只是重复的初始猜测值 我首先尝试了我的第五个数据集脚本,这似乎有些什么好的。但是你可以看到,每

我是编程方面的新手,尤其是曲线拟合方面。但我尝试将模型曲线拟合到我使用Python和Numpy进行的一些测量中

我成功地将一条“拟合”曲线绘制成一组数据。嗯,看起来是这样的。结果证明,该函数只使用初始猜测,并不尝试实际拟合曲线。我通过对不同数据集使用相同的初始猜测来测试这一点。结果是:

fitParams
的输出是
fitcarvariances
(这似乎是非常奇怪的值):

def fitFunc()
的输出只是重复的初始猜测值

我首先尝试了我的第五个数据集脚本,这似乎有些什么好的。但是你可以看到,每一条“拟合曲线”都是完全相同的,它只是使用了最初的猜测

以下是脚本:

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
import scipy
import math
import csv
import matplotlib as mpl

mpl.rcParams['text.usetex']=True
mpl.rcParams['text.latex.unicode']=True

#model
def fitFunc(P_max, x, x_0, w_z):
    print P_max
    print x_0
    print w_z
    return 0.5 * P_max * (1 - scipy.special.erf((scipy.sqrt(2) * (x - x_0)) / w_z))

fig = plt.figure()

#for-loop to read and curve fit for all data sets
for n in range (1,7):
    x_model = np.linspace(-1,6,5000)
    y_model = []
    x = []
    P = []
    name = 'data_' + str(n)
    with open(name + '.csv', 'rb') as f:
        data = csv.reader(f, delimiter = ';')
        for row in data:
            x.append(float(row[1]))
            P.append(float(row[2]))
        fitParams, fitCovariances = curve_fit(fitFunc, np.array(x), np.array(P), [540, 2.5, 2])
        print fitParams
        print fitCovariances

    for i in range(0, len(x_model)):
        y_model.append(fitFunc(fitParams[0], x_model[i], fitParams[1], fitParams[2]))

    ax = fig.add_subplot(2,3,n, axisbg='white')
    ax.scatter(x,P)
    ax.plot(x_model,y_model)
    ax.set_xlim([0, 6])
    ax.set_ylim([0, 600])
    ax.set_xlabel(r'\Delta x')
    ax.set_ylabel(r'P (\mu W)')

plt.tight_layout()
plt.show()
我真的找不出我做错了什么。我希望你们能帮助我。谢谢:)


注意:您可以下载数据文件来尝试使用相同数据的脚本。

您唯一的问题是
fitFunc
的定义。从
帮助(曲线拟合)

这意味着您必须移动
x
输入以成为函数的第一个参数。这只影响两行:您对
fitFunc
的定义

#def fitFunc(P_max, x, x_0, w_z): #original
def fitFunc(x, P_max, x_0, w_z):
    print(P_max)
    print(x_0)
    print(w_z)
    return 0.5 * P_max * (1 - scipy.special.erf((scipy.sqrt(2) * (x - x_0)) / w_z))
打印时显式调用
fitFunc

for i in range(0, len(x_model)):
    y_model.append(fitFunc(x_model[i], fitParams[0], fitParams[1], fitParams[2]))
结果:

我认为你和西皮都做得很好:)

效率注意事项:

我看不出您的
fitFunc
无法处理向量值
x
输入的原因(它确实可以)。这意味着,在绘制拟合模型时,您可以在
i
上省去循环,您可以说

 y_model = fitFunc(x_model, fitParams[0], fitParams[1], fitParams[2])

唯一的问题是
fitFunc
的定义。从
帮助(曲线拟合)

这意味着您必须移动
x
输入以成为函数的第一个参数。这只影响两行:您对
fitFunc
的定义

#def fitFunc(P_max, x, x_0, w_z): #original
def fitFunc(x, P_max, x_0, w_z):
    print(P_max)
    print(x_0)
    print(w_z)
    return 0.5 * P_max * (1 - scipy.special.erf((scipy.sqrt(2) * (x - x_0)) / w_z))
打印时显式调用
fitFunc

for i in range(0, len(x_model)):
    y_model.append(fitFunc(x_model[i], fitParams[0], fitParams[1], fitParams[2]))
结果:

我认为你和西皮都做得很好:)

效率注意事项:

我看不出您的
fitFunc
无法处理向量值
x
输入的原因(它确实可以)。这意味着,在绘制拟合模型时,您可以在
i
上省去循环,您可以说

 y_model = fitFunc(x_model, fitParams[0], fitParams[1], fitParams[2])

显示由脚本打印的输出。特别是,对于
拟合协方差
,你得到了什么?我已经把它添加到了问题中。我觉得很奇怪,
fitFunc
的协方差都是无限的。你确定
fitFunc
中的变量顺序是正确的吗<代码>帮助(曲线拟合)告诉我模型函数f(x,…)。它必须将自变量作为第一个参数,并将要拟合的参数作为单独的剩余参数。。显示脚本打印的输出。特别是,对于
拟合协方差
,你得到了什么?我已经把它添加到了问题中。我觉得很奇怪,
fitFunc
的协方差都是无限的。你确定
fitFunc
中的变量顺序是正确的吗<代码>帮助(曲线拟合)告诉我模型函数f(x,…)。它必须将自变量作为第一个参数,并将要拟合的参数作为单独的剩余参数。。