【发布时间】:2020-10-22 06:23:17
【问题描述】:
我的非线性数据使用公式Asin(wt+phase)exp(-decay*t) 的最小二乘拟合来近似,同时保持omega(w) 为常数。我尝试了几种方法都没有成功。
下面是我的代码
import numpy as np
from numpy import loadtxt
import lmfit
np.random.seed(2)
x = np.linspace(0, 10, 101)
decay = 4.5
shift = 0
amp = 0.0015
y = amp * np.sin(x*5+shift) * np.exp(-x*decay)
yn = y + np.random.normal(size=y.size, scale=0.450)
def resid(params, x, ydata):
decay = params['decay'].value
shift = params['shift'].value
amp = params['amp'].value
y_model = amp * np.sin(x*5+shift) * np.exp(-x*decay)
return y_model - ydata
params = lmfit.Parameters()
params.add('shift', 0.0, min=-np.pi, max=np.pi)
params.add('amp', 0.0015, min=0, max=0.02)
params.add('decay', 4.0, min=0, max=10.0)
fit = lmfit.minimize(resid, params, args=(x, yn), method='differential_evolution')
print("\n\n# Fit using differential_evolution:")
lmfit.report_fit(fit)
plt.plot(x, y, 'ko', lw=2)
plt.plot(x, yn+fit.residual, 'b--', lw=2)
plt.legend(['data', 'leastsq', 'diffev'], loc='upper left')
plt.show()
【问题讨论】:
-
请阅读如何创建 MCVE:stackoverflow.com/help/minimal-reproducible-example 我们喜欢在 Stackoverflow 上提供帮助,但我们大多数人没有太多时间提供帮助。借助 MCVE,您可以让我们轻松重现您的问题,以便我们可以花更多时间专注于您遇到的实际问题。
-
请提供准确的输入和准确的预期输出。也可以链接到理论。
-
查看您的数据:与幅度相比,您的衰减很大,导致小值问题。您有大约 10 个数据点的行为类似于您的预期公式,但有 90 个点基本上为零 - 最重要的是,您用随机噪声掩盖了这些值。您的方法适用于较小的衰减值和较大的安培值。