我试着用余弦函数作为我的模型来拟合数据,有些是不起作用的.

以下是我的代码:

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


def model(x,a,psi,b):
    return a*np.cos(x + psi)+b
err_y = 0.5
err_x = 2
x = np.arange(10, 370,20)
x_r = x* (np.pi/180)
y = np.array([5.7, 7.9, 8, 6.6, 4.4, 1.3, 0.09, 1.2, 2.9, 5.9, 7.8, 9, 7, 4.2, 1.5, 0.17, 0.57, 2.5])
error = err_y * np.ones(y.size)


popt, pcov = curve_fit(model, x_r, y,p0 = (4, 3.14, 4), sigma = error,absolute_sigma = True)
print(popt)
plt.scatter(x,y)
plt.errorbar(x, y, yerr=err_y, fmt='none', c='k')
plt.xlabel('Angle(degree)')
plt.ylabel('Readout (V)')
plt.plot(x, model(x_r, *popt), color='red')

enter image description here

我try 了许多不同的参数初始猜测,但都不起作用.

推荐答案

你的数据有两个0到360度的周期--但你的拟合函数只允许一个周期.

试着在余弦中加入频率和相位.

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


def model(x,a,omega,psi,b):
    return a*np.cos(omega*x + psi)+b
err_y = 0.5
err_x = 2
x = np.arange(10, 370,20)
x_r = x* (np.pi/180)
y = np.array([5.7, 7.9, 8, 6.6, 4.4, 1.3, 0.09, 1.2, 2.9, 5.9, 7.8, 9, 7, 4.2, 1.5, 0.17, 0.57, 2.5])
error = err_y * np.ones(y.size)


popt, pcov = curve_fit(model, x_r, y,p0 = (4, 2.0, 3.14, 4), sigma = error,absolute_sigma = True)
print(popt)
plt.scatter(x,y)
plt.errorbar(x, y, yerr=err_y, fmt='none', c='k')
plt.xlabel('Angle(degree)')
plt.ylabel('Readout (V)')
plt.plot(x, model(x_r, *popt), color='red')
plt.show()

输出(角频率为1.98...或者,实际上,2)

[4.16352559 1.98440219 4.77715943 4.26330405]

enter image description here

Python相关问答推荐

计算相同形状的两个张量的SSE损失

多处理代码在while循环中不工作

如何在Deliveryter笔记本中从同步上下文正确地安排和等待Delivercio代码中的结果?

将特定列信息移动到当前行下的新行

Python json.转储包含一些UTF-8字符的二元组,要么失败,要么转换它们.我希望编码字符按原样保留

带条件计算最小值

修复mypy错误-赋值中的类型不兼容(表达式具有类型xxx,变量具有类型yyy)

我如何使法国在 map 中完全透明的代码?

在单个对象中解析多个Python数据帧

Django—cte给出:QuerySet对象没有属性with_cte''''

在Python 3中,如何让客户端打开一个套接字到服务器,发送一行JSON编码的数据,读回一行JSON编码的数据,然后继续?

在matplotlib中删除子图之间的间隙_mosaic

判断solve_ivp中的事件

在pandas/python中计数嵌套类别

从旋转的DF查询非NaN值

如何在一组行中找到循环?

如何从比较函数生成ngroup?

时长超过24小时如何从Excel导入时长数据

如何在Python中创建仅包含完整天数的月份的列表

Groupby并在组内比较单独行上的两个时间戳