Numpy.polyfit不返回多项式

hivapdat  于 2023-01-26  发布在  其他
关注(0)|答案(2)|浏览(156)

我正在尝试创建一个python程序,用户在其中输入一组数据,程序会输出一个输出,在其中创建一个最适合数据的直线/多项式图形。
这是密码:

from matplotlib import pyplot as plt
import numpy as np

x = []
y = []
x_num = 0
while True:
  sequence = int(input("Input 1 number in the sequence, type 9040321 to stop"))
  if sequence == 9040321:
    
    poly = np.polyfit(x, y, deg=2, rcond=None, full=False, w=None, cov=False)
    plt.plot(poly)
    plt.scatter(x, y, c="blue", label="data")
    plt.legend()
    plt.show()
    break
  else:
    y.append(sequence)
    x.append(x_num)
    x_num += 1

我使用了多项式,其中我分别输入了1, 2, 4, 8,MatPlotLib正确地绘制了它,但是,对于次数为2的多项式,输出如下所示:

这显然是不正确的,但是我不确定问题出在哪里。我认为这与度有关,但是当我将度改为3时,它仍然不适合。我正在寻找一个像y = sqrt(x)这样的图形来检查每个点,当这不可能时,创建一条最适合的线。
编辑:我添加了一个print(poly)特性,对于上面选择的输入,它会给出[0.75 0.05 1.05]。我不知道该怎么做。

hjqgdpho

hjqgdpho1#

import numpy as np
import matplotlib.pyplot as plt

x = [1, 2, 3, 4]
y = [1, 2, 4, 8]

coeffs = np.polyfit(x, y, 2)
print(coeffs)
poly = np.poly1d(coeffs)
print(poly)

x_cont = np.linspace(0, 4, 81)
y_cont = poly(x_cont)

plt.scatter(x, y)
plt.plot(x_cont, y_cont)
plt.grid(1)
plt.show()

执行代码,你有上面的图表,这是打印在终端:

[ 0.75 -1.45  1.75]
      2
0.75 x - 1.45 x + 1.75

在我看来,您对polyfit的输出抱有错误的期望。

vltsax25

vltsax252#

二次多项式逼近

np.polyfit给出了多项式在给定点附近的系数。要使用matplotlib将多项式绘制成平滑曲线,您需要计算大量的x,y对。使用np.linspace(start, stop, numsteps)作为x,numpy的矢量化允许一次性计算所有对应的y。例如ys = a * x**2 + b * x + c

from matplotlib import pyplot as plt
import numpy as np

x = [0, 1, 2, 3, 4, 5, 6]
y = [1, 2, 4, 8, 16, 32, 64]
plt.scatter(x, y, color='crimson', label='given points')

poly = np.polyfit(x, y, deg=2, rcond=None, full=False, w=None, cov=False)
xs = np.linspace(min(x), max(x), 100)
ys = poly[0] * xs ** 2 + poly[1] * xs + poly[2]
plt.plot(xs, ys, color='dodgerblue', label=f'$({poly[0]:.2f})x^2+({poly[1]:.2f})x + ({poly[2]:.2f})$')
plt.legend()
plt.show()

高次逼近多项式

给定N个点,一个N-1次多项式可以精确地通过其中的每一个点。下面是一个具有7个点和最高6次多项式的示例。

from matplotlib import pyplot as plt
import numpy as np

x = [0, 1, 2, 3, 4, 5, 6]
y = [1, 2, 4, 8, 16, 32, 64]
plt.scatter(x, y, color='black', zorder=3, label='given points')

for degree in range(0, len(x)):
    poly = np.polyfit(x, y, deg=degree, rcond=None, full=False, w=None, cov=False)
    xs = np.linspace(min(x) - 0.5, max(x) + 0.5, 100)
    ys = sum(poly_i * xs**i for i, poly_i in enumerate(poly[::-1]))
    plt.plot(xs, ys, label=f'degree {degree}')
plt.legend()
plt.show()

∮另一个例子∮

x = [0, 1, 2, 3, 4]
y = [1, 1, 6, 5, 5]

相关问题