使用数据点确定二次方程的 a、b、c

use*_*443 -1 python python-2.7

我需要确定y=ax2+bx+c使用最多 100 个点变化的数据点集的 a、b、c 值。例如 (-270,69) (-269,90) (-280,50)。我已经使用使用点生成二次方程来插值数据url 来确定 a、b、c 值。但是我发现这两种方法中 a、b、c 值之间存在差异。注意:我无法在生产代码中使用 Numpy。

def coefficent(x,y):
    x_1 = x[0]
    x_2 = x[1]
    x_3 = x[2]
    y_1 = y[0]
    y_2 = y[1]
    y_3 = y[2]

    a = y_1/((x_1-x_2)*(x_1-x_3)) + y_2/((x_2-x_1)*(x_2-x_3)) + y_3/((x_3-x_1)*(x_3-x_2))

    b = -y_1*(x_2+x_3)/((x_1-x_2)*(x_1-x_3))
    -y_2*(x_1+x_3)/((x_2-x_1)*(x_2-x_3))
    -y_3*(x_1+x_2)/((x_3-x_1)*(x_3-x_2))

    c = y_1*x_2*x_3/((x_1-x_2)*(x_1-x_3))
    + y_2*x_1*x_3/((x_2-x_1)*(x_2-x_3))
    + y_3*x_1*x_2/((x_3-x_1)*(x_3-x_2))

    return a,b,c

x = [1,2,3]
y = [4,7,12]

a,b,c = coefficent(x, y)
print a,b,c


> import numpy as np
>>> A, B, C = np.polyfit([1,2,3],[4,7,12],2)
>>> print A, B, C
1.0 -4.2727620148e-15 3.0
>>> print A, 'x^2 +', B, 'x +', C
1.0 x^2 + -4.2727620148e-15 x + 3.0
>>>
Run Code Online (Sandbox Code Playgroud)

Jon*_*ler 6

在发布 SO 之前,您是否将计算行b和行分开?c问题中粘贴的代码将无法编译。这个版本做了:

def coefficient(x,y):
    x_1 = x[0]
    x_2 = x[1]
    x_3 = x[2]
    y_1 = y[0]
    y_2 = y[1]
    y_3 = y[2]

    a = y_1/((x_1-x_2)*(x_1-x_3)) + y_2/((x_2-x_1)*(x_2-x_3)) + y_3/((x_3-x_1)*(x_3-x_2))

    b = (-y_1*(x_2+x_3)/((x_1-x_2)*(x_1-x_3))
         -y_2*(x_1+x_3)/((x_2-x_1)*(x_2-x_3))
         -y_3*(x_1+x_2)/((x_3-x_1)*(x_3-x_2)))

    c = (y_1*x_2*x_3/((x_1-x_2)*(x_1-x_3))
        +y_2*x_1*x_3/((x_2-x_1)*(x_2-x_3))
        +y_3*x_1*x_2/((x_3-x_1)*(x_3-x_2)))

    return a,b,c

x = [1,2,3]
y = [4,7,12]

a,b,c = coefficient(x, y)

print "a = ", a
print "b = ", b
print "c = ", c
Run Code Online (Sandbox Code Playgroud)

输出是无可挑剔的:

a =  1
b =  0
c =  3
Run Code Online (Sandbox Code Playgroud)

这比 的答案更准确(的系数为 4*10 -15左右) 。这三个数据点在数学上也是准确的。bnumpy

您的代码给出的答案有什么问题?