【发布时间】:2018-11-12 18:53:45
【问题描述】:
the link of data from dropboxbadfitting我尝试使用curve_fit来拟合我在python中的pre_defined函数的数据,但结果远非完美。代码很简单,如下所示。我不知道出了什么问题。 由于我是python新手,有没有其他适合我的预定义函数的优化或拟合方法?
提前致谢!
import numpy as np
import math
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
def func(x, r1, r2, r3,l,c):
w=2*math.pi*x
m=r1+(r2*l*w)/(r2**2+l**2*w**2)+r3/(1+r3*c**2*w**2)
n=(r2**2*l*w)/(r2**2+l**2*w**2)-r3**3*c*w/(1+r3*c**2*w**2)
y= (m**2+n**2)**.5
return y
def readdata(filename):
x = filename.readlines()
x = list(map(lambda s: s.strip(), x))
x = list(map(float, x))
return x
# test data
f_x= open(r'C:\Users\adm\Desktop\simpletry\fre.txt')
xdata = readdata(f_x)
f_y= open(r'C:\Users\adm\Desktop\simpletry\impedance.txt')
ydata = readdata(f_y)
xdata = np.array(xdata)
ydata = np.array(ydata)
plt.semilogx(xdata, ydata, 'b-', label='data')
popt, pcov = curve_fit(func, xdata, ydata, bounds=((0, 0, 0, 0, 0), (np.inf, np.inf, np.inf, np.inf, np.inf)))
plt.semilogx(xdata, func(xdata, *popt), 'r-', label='fitted curve')
print(popt)
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.show()
如您所料,这是一个 LCR 电路模型。现在我正在尝试用相同的参数拟合两条曲线,例如
def func1(x, r1, r2, r3,l,c):
w=2*math.pi*x
m=r1+(r2*l*w)/(r2**2+l**2*w**2)+r3/(1+r3*c**2*w**2)
return m
def func2(x, r1, r2, r3,l,c):
w=2*math.pi*x
n=(r2**2*l*w)/(r2**2+l**2*w**2)-r3**3*c*w/(1+r3*c**2*w**2)
return n
是否可以使用curve_fitting优化参数?
【问题讨论】:
-
能否请您发布指向数据文件的链接?
-
你知道大概的正确答案是什么吗?您可以使用它来指定可能有助于曲线拟合例程的起点和边界。
-
看起来最适合的部分参数具有 负 值,因此您应该删除调用的
bounds=...部分。 (另外,我怀疑您的拟合可能存在一些退化——即,不止一组参数也同样适合数据。) -
是的,这就是问题所在。我曾试图删除界限,它可以很好地适应。但事实是所有参数都必须是正数。
标签: python optimization scipy curve-fitting