【发布时间】:2021-05-31 23:19:35
【问题描述】:
我正在使用 LMFIT 将分段多项式拟合到正弦波的第一象限。 我希望能够在多项式输出上添加一个约束——而不是对其参数。 例如,我想确保输出是 >= 0 和
我知道使用 np.polyfit 可能会更好,但最终我想添加更多非线性约束,并且 LMFIT 框架更灵活。
import numpy as np
from lmfit.models import LinearModel
#split sine wave in 4 segments with 1024 points
nseg = 4
frac = 2**10
npoints = nseg*frac
xfrac = np.linspace(0, 1, num=frac, endpoint=False)
x = np.linspace(0, 1, num=npoints, endpoint=False)
y = np.sin(x*np.pi/2)
yseg = np.reshape(y, (nseg, frac))
mod = LinearModel()
coeff = []
bestfit = []
for i in range(nseg):
pars = mod.guess(yseg[i], x=xfrac)
out = mod.fit(yseg[i], pars, x=xfrac)
coeff.append([out.best_values['slope'], out.best_values['intercept']])
bestfit.append(out.best_fit)
bestfit = np.reshape(bestfit, (1, npoints))[0]
【问题讨论】:
-
我只能看到如何在模型参数上添加约束,而不是它的输出(这里是每个段中 y=mx+b 的结果)
-
我是否正确地说您的分段函数不是连续的?关于输出参数的限制,我猜你必须手动计算输入参数的相应限制。
-
你说得对,它不是连续的。强制连续性似乎不是一个通用的约束,所以我认为需要完成与下面发布的相同的想法。
-
你可以尝试线性 B 样条的意义
标签: python constraints curve-fitting lmfit piecewise