我有一个简单的算法来计算数学模型的残差和一些带噪声的实验数据。目标是在振幅和频率已知的情况下找到相位。该算法在0到2 * pi之间循环所有相位值(精度为3个小数位)。然后计算每个阶段的每个模型计算的残差。然后,程序将每个阶段和残差附加到各自的列表中。我知道我可以使用scipy.optimize来解决这个问题,但我有理由想要使用这个算法。我的问题是,如何检索与最小残值相关的相位值?该计划如下:
import numpy as np
from numpy import loadtxt
data = loadtxt('foo.txt', float)
x = data[:,0]
y = data[:,1]
a = 1.5
f = 0.01
p = []
phase = 0.000
residuals = []
for i in range(0, 6284):
p.append(phase)
model = a*np.sin(2*np.pi*f*x+phase)
res = sum((y-model)**2)
residuals.append(res)
phase += 0.001
print min(residuals)
有关如何检索与最小残差相关的相位值的任何帮助都会有所帮助。感谢。
答案 0 :(得分:1)
使用以下代码
p[residuals.index(min(residuals))]
答案 1 :(得分:0)
你可以这样做:
min_index, min_value = min(enumerate(residuals), key=lambda p: p[1])
phase_at_min = p[min_index]
但根据您的用例,更好的方法可能是为结果存储元组(甚至使用字典):
results = []
for phase in range(0, 6.284, 0.001):
model = a*np.sin(2*np.pi*f*x+phase)
res = sum((y-model)**2)
results.append((phase, res))
print(min(results, key=lambda x: x[1]))
通过这种方式,您可以更轻松地查找各种阶段数量的结果。