繁体   English   中英

用指数函数拟合python图

[英]fitting the python plot with exponential function

我试图用指数函数拟合我的python图。 我在这里附上了代码。 任何输入均受到高度赞赏。

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

x=[0.21, 0.43, 0.50, 0.65, 0.86, 1.0, 1.5, 2.0, 2.5, 3.0, 4.0]
y=[43, 33, 30, 24, 18, 16, 14, 13, 14, 13, 13]
yerr= [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2]
xerr=[0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01, 0.01,0.01,0.01]
plt.ylim (0,60)
plt.xlabel ('Thickness (d) [mm]')
plt.ylabel ('Counts')
def exponenial_func(x, a, b, c):
    return a*np.exp(-b*x)+c
popt, pcov = curve_fit(exponenial_func, x, y, p0=(1, 1e-6, 1))
yy = exponenial_func(x, *popt)

plt.plot(x,y,'o', x, yy)
#plt.errorbar(x,y,yerr=yerr,xerr=xerr, fmt= '.')
plt.show()

我总是收到一个错误消息:

Traceback (most recent call last):
  File "/home/manisha/Desktop/Moessbauer effect/countsvsd.py", line 16, in <module>
    yy = exponenial_func(x, *popt)
  File "/home/manisha/Desktop/Moessbauer effect/countsvsd.py", line 14, in exponenial_func
    return a*np.exp(-b*x)+c
TypeError: 'numpy.float64' object cannot be interpreted as an index

由于我是新程序员,所以我不知道这意味着什么。 请帮忙。

您的问题在于您尝试定义yy 您不能在列表 x上调用函数。 而是在x每个单独项目上调用它,例如,在这样的列表迭代中:

yy = [exponenial_func(i, *popt) for i in x]

然后,代码中的其他所有内容都可以正常工作: 指数的

[编辑] :要外推指数函数中的零(根据您的评论),您可以执行以下操作:

xx = x.copy()    
yy = [exponenial_func(i, *popt) for i in [0]+xx]
plt.plot(x,y,'o',[0]+xx,yy)

或者,仅查看值,请执行以下操作:

exponenial_func(0, *popt)

尽管@sacul的答案有效,但它还不能告诉您正在发生什么。

如果有list ,则可以通过乘法将此list副本附加到其自身。

my_list = [1, 2]
print(my_list * 2) #[1, 2, 1, 2]

因此,当您尝试将listfloat乘以时,将变得不确定要复制的行为,并引发Exception

print(my_list * 1.5) #TypeError: can't multiply sequence by non-int of type 'float'

尝试使用浮点对象这样做会在评估时间之前被捕获,并引发以下错误:

a = 1.5
print(my_list*a) #TypeError: 'numpy.float64' object cannot be interpreted as an integer

因此,针对您的问题有多种解决方案。 您可以像@sacul提供的答案一样,将list的单个项逐个馈入函数,或者将容器转换为将产生数组行为的类型,如您期望的那样:

def exponenial_func(x, a, b, c):
    if isinstance(x,list):
        x = np.array(x)
    return a*np.exp(-b*x)+c

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM