python - 如何拟合一些系数受限的多项式?

标签 python numpy scipy curve-fitting polynomials

使用 NumPy 的 polyfit(或类似的东西)是否有一种简单的方法来获得一个或多个系数被限制为特定值的解决方案?

例如,我们可以使用以下方法找到普通的多项式拟合:

x = np.array([0.0, 1.0, 2.0, 3.0,  4.0,  5.0])
y = np.array([0.0, 0.8, 0.9, 0.1, -0.8, -1.0])
z = np.polyfit(x, y, 3)

屈服

array([ 0.08703704, -0.81349206,  1.69312169, -0.03968254])

但是,如果我想要第三个系数(在上述情况下 z[2])必须为 1 的最佳拟合多项式怎么办?还是我需要从头开始编写配件?

最佳答案

在这种情况下,我会使用 curve_fitlmfit ;我很快就展示了第一个。

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

def func(x, a, b, c, d):
  return a + b * x + c * x ** 2 + d * x ** 3

x = np.array([0.0, 1.0, 2.0, 3.0,  4.0,  5.0])
y = np.array([0.0, 0.8, 0.9, 0.1, -0.8, -1.0])

print(np.polyfit(x, y, 3))

popt, _ = curve_fit(func, x, y)
print(popt)

popt_cons, _ = curve_fit(func, x, y, bounds=([-np.inf, 2, -np.inf, -np.inf], [np.inf, 2.001, np.inf, np.inf]))
print(popt_cons)

xnew = np.linspace(x[0], x[-1], 1000)

plt.plot(x, y, 'bo')
plt.plot(xnew, func(xnew, *popt), 'k-')
plt.plot(xnew, func(xnew, *popt_cons), 'r-')
plt.show()

这将打印:

[ 0.08703704 -0.81349206  1.69312169 -0.03968254]
[-0.03968254  1.69312169 -0.81349206  0.08703704]
[-0.14331349  2.         -0.95913556  0.10494372]

所以在无约束的情况下,polyfitcurve_fit 给出相同的结果(只是顺序不同),在有约束的情况下,固定参数为 2,如愿.

剧情如下:

enter image description here

lmfit 中,您还可以选择是否应拟合参数,因此您也可以将其设置为所需的值(检查 this answer)。

关于python - 如何拟合一些系数受限的多项式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48469889/

相关文章:

python - 分类到二进制 - 我做错了什么?

python - 获取创建 ConvexHull 的点的索引

python - fmin 具有多个参数的 python 函数

python - 如何在Python中进行curve_fit

Python加速列表中的元素

python - 从两个 int64 列构造 PeriodIndex

python - 在 python 中将列表中的索引表示为 x,y

python - 对于浮点 x,x==numpy.linspace(x,y,n)[0] 总是 True 吗?

python - 使用 numpy 计算成对互信息的最佳方法

python - 如何在gensim.doc2vec中使用infer_vector?