gpt4 book ai didi

Python 指数衰减 curve_fit 给我一个线性拟合

转载 作者:太空宇宙 更新时间:2023-11-04 03:48:12 24 4
gpt4 key购买 nike

您好,我正在尝试为我的三个指数衰减中的每一个生成一个拟合。我没有成功地制作出令人满意的合身。这就是我得到的:http://i.imgur.com/Nx44wsS.jpg

非常感谢任何帮助。我的代码如下。

import pylab as plb
import matplotlib.pyplot as plt
import matplotlib.axes as ax
import scipy as sp
from scipy.optimize import curve_fit
from matplotlib import rc
rc('font',**{'family':'sans-serif','sans-serif':['Helvetica']})
## for Palatino and other serif fonts use:
#rc('font',**{'family':'serif','serif':['Palatino']})
rc('text', usetex=True)

data = plb.loadtxt('data.csv',skiprows=2)
yp = data[:,4]
yr = data[:,5]
yl = data[:,6]
x = data[:,0]

def func(x,a,b,c):
return a*np.exp(-b*x) + c

popt, pcov = curve_fit(func, x, yl,maxfev=20000)
a = popt[0]
b = popt[1]
c = popt[2]
print a
print b
print c
print func(x,a,b,c)

xf = np.linspace(0,70,100)
yf = a*np.exp(-b*x) + c

plt.clf()
plt.plot(x,yf,'r-', label="Fitted Curve")
plt.plot(x,func(x,*popt))

plt.plot(x,yp,'bo',label='Polished')
plt.plot(x,yr,'ro',label='Rough')
plt.plot(x,yl,'go',label='Lacquered')

plt.legend()
plt.ylabel("Temperature (K)")
plt.xlabel("Time (min)")
plt.show()

最佳答案

非线性拟合很困难,诀窍在于您必须提供合理的初始猜测。

这是您的代码版本,它执行两种拟合,一种是近似初始猜测,另一种是默认初始猜测:

import pylab as plb
import matplotlib.pyplot as plt
import matplotlib.axes as ax
import scipy as sp
from scipy.optimize import curve_fit
from matplotlib import rc
import numpy as np
rc('font', **{'family':'sans-serif', 'sans-serif':['Helvetica']})
rc('text', usetex=True)

# Fake data
x = np.arange(0, 70., 2.)
yl = 300 + 63*np.exp(-x/35.)

def func(x, a, b, c):
return a*np.exp(-b*x) + c

popt, pcov = curve_fit(func, x, yl, p0=(40, 0.012, 250), maxfev=20000)
a, b, c = popt
print 'a=', a, 'b=', b, 'c=', c
print 'func=', func(x, a, b, c)

popt2, pcov2 = curve_fit(func, x, yl, p0=None, maxfev=20000)
a2, b2, c2 = popt2
print 'a2=', a2, 'b2=', b2, 'c2=', c2
print 'func=', func(x, a2, b2, c2)

xf = np.linspace(0, 70, 100)
yf = a*np.exp(-b*x) + c

plt.clf()
plt.plot(x, yf, 'r-', label="Fitted Curve")
plt.plot(x, func(x, *popt))
plt.plot(x, func(x, *popt2), 'b-', label='Fit w/o guess')

plt.plot(x, yl, 'go', label='Lacquered')

plt.legend()
plt.ylabel("Temperature (K)")
plt.xlabel("Time (min)")
plt.show()

这里是结果拟合:

enter image description here

如您所见,具有合理初始猜测的拟合效果非常好(红线)。如果您不提供初始猜测,scipy 会假设所有参数均为 1,并且效果不佳(蓝线)。

关于Python 指数衰减 curve_fit 给我一个线性拟合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22626118/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com