【发布时间】:2022-01-08 05:08:05
【问题描述】:
这是我的代码,这是我的数据,这是代码的输出。我尝试在 x 轴上添加一个值,认为也许值这么少可以解释为零。我不知道 true_divide 可能是什么,我无法解释这个除以零错误,因为我的数据中没有一个零,检查了我所有的 2500 个数据点。希望你们中的一些人可以提供一些澄清。提前致谢。
import pandas as pd
import matplotlib.pyplot as plt
from iminuit import cost, Minuit
import numpy as np
frame = pd.read_excel('/Users/lorenzotecchia/Desktop/Analisi Laboratorio/Analisi dati/Quinta Esperienza/500Hz/F0000CH2.xlsx', 'F0000CH2')
data = pd.read_excel('/Users/lorenzotecchia/Desktop/Analisi Laboratorio/Analisi dati/Quinta Esperienza/500Hz/F0000CH1.xlsx', 'F0000CH1')
# tempi_500Hz = pd.DataFrame(frame,columns=['x'])
# Vout_500Hz = pd.DataFrame(frame,columns=['y'])
tempi_500Hz = pd.DataFrame(frame,columns=['x1'])
Vout_500Hz = pd.DataFrame(frame,columns=['y1'])
# Vin_500Hz = pd.DataFrame(data,columns=['y'])
def fit_esponenziale(x, α, β):
return α * (1 - np.exp(-x / β))
plt.xlabel('ω(Hz)')
plt.ylabel('Attenuazioni')
plt.title('Fit Parabolico')
plt.scatter(tempi_500Hz, Vout_500Hz)
least_squares = cost.LeastSquares(tempi_500Hz, Vout_500Hz, np.sqrt(Vout_500Hz), fit_esponenziale)
m = Minuit(least_squares, α=0, β=0)
m.migrad()
m.hesse()
plt.errorbar(tempi_500Hz, Vout_500Hz, fmt="o", label="data")
plt.plot(tempi_500Hz, fit_esponenziale(tempi_500Hz, *m.values), label="fit")
fit_info = [
f"$\\chi^2$ / $n_\\mathrm{{dof}}$ = {m.fval:.1f} / {len(tempi_500Hz) - m.nfit}",]
for p, v, e in zip(m.parameters, m.values, m.errors):
fit_info.append(f"{p} = ${v:.3f} \\pm {e:.3f}$")
plt.legend()
plt.show()
【问题讨论】:
-
嗨洛伦佐。几厘米。 1)尝试给出一个最小的工作示例,即如果可能,提供一个导致相同错误的最小数据集。 excel表格的图像没有帮助。 2)您的数据为负数,因此 fit 函数中的偏移量可能是个好主意。 3) 非线性拟合中的搜索算法可能会测试
beta=0,因此会产生除以零。更好地使用y = off + a * ( 1 - exp( - b * x ) )。错误将b传播到beta。 -
嗨!真的很感谢您的回答,所以我的拟合中使用的偏移量应该与我调整数据时使用的偏移量相同,以便成为非负数?
-
当然,您可以像这样反转问题...它会在误差范围内为正
-
不幸的是,将 10 添加到我的值没有用,而且我得到了相同的输出....,我认为我在之前的回复中所说的操作与您在您的第一次重播,显然我一开始没看懂
-
试试
def fit( x, a, b, c) : return a * ( 1- exp( - b * x ) ) + c
标签: pandas numpy data-analysis curve-fitting iminuit