拟合实验数据并获得2个参数

时间:2018-07-29 13:56:16

标签: python scipy curve-fitting

我正在尝试为一些实验数据拟合一个混乱的表达式。该公式有2个自由参数(在用“ a”和“ b”表示的代码中),我需要找到a和b的值。我尝试使用scipy模块,但是在编译 curve_fit 过程时始终出现错误。我试图找到有关该错误的信息,但找不到解决该问题的信息。

出现错误的屏幕截图:

here

请记住,我在python方面的经验不是很好(基本上我刚刚开始学习此拟合过程)。如果可以简化代码,请参见以下代码段:

def fun1(x,a,b):
    result=tsd1(x,17,6.5,a,b)
    return result
params, extras = curve_fit(fun1,mydata.spin,mydata.energy)
print(params)

tsd1 是另一个依赖于某些参数的函数(tsd1函数的完整表达式可以在here中看到)和 mydata 是2个数组,它们带有自旋和能量,由数据文件中的第一和第二列表示。全部输入数据here

我想知道我的验配程序出了什么问题以及如何解决这个问题。

1 个答案:

答案 0 :(得分:2)

您遇到的问题是,您使用math模块的功能(它们在标量上工作)而不是设计用于数组的numpy函数。您问题的简化版本(我太懒了,无法遍历您声明的所有功能)将是:

from math import cos
import numpy as np
from matplotlib import pyplot as plt
from scipy.optimize import curve_fit
import pandas as pd

#works perfectly fine with the numpy arrays from the pandas data frame
def fun1(x, a, b, c, d):
    return a * np.cos(b * x / 1000 + c) + d

#this version doesn't work because math works only on scalars
#def fun1(x, a, b, c, d):
#    return a * cos(b * x / 1000 + c) + d

#read data from file you provided
mydata = pd.read_csv("test.txt", names = ["spin", "energy"])

#curve fit
params, extras = curve_fit(fun1,mydata.spin,mydata.energy)
print(params)

#generation of the fitting curve
x_fit = np.linspace(np.min(mydata.spin), np.max(mydata.spin), 1000)
y_fit = fun1(x_fit, *params)

#plotting of raw data and fit function
plt.plot(mydata.spin, mydata.energy, "ro", label = "data")
plt.plot(x_fit, y_fit, "b", label = "fit")
plt.legend()
plt.show()

因此,解决方案是在脚本中查找所有数学函数,例如sincossqrt,并用其numpy等效项替换它们。幸运的是,它们通常只是np.sin等。