二次插值法

下表显示了数据点列表。

n xn yn
0 1.04 2.71
1 1.51 2.55
2 1.83 2.82

赢博体育数学中的一个常见任务是插值:给定一组数据点,构造一条穿过这些数据点的曲线,并使用该曲线来预测曲线在其他点的值。在当前的示例中,我们希望通过上面所示的三个数据点插入一条曲线。因为我们有三个数据点,经过这三个点的最简单的曲线将是一个二次多项式。我们的工作是计算这个多项式并用它来预测y在其他点的值。

计算多项式的第一种方法首先假设多项式的形式为

P (x) = ax2 + bx + c

把这三个数据点代入这条曲线,就得到了三个方程的三个未知数。

这些方程可以写成矩阵-向量方程组。

如果你知道如何计算矩阵的逆,你就可以解出这个系统的多项式系数。

牛顿多项式

这里有第二个方法来解决这个问题。这个方法是基于一个稍微不同的假设,关于我们要解的多项式的形式,即所谓的多项式的牛顿形式:

P (x) = a (x-x) (x- x1) + b (x-x) + c

求解这个多项式系数所需的代数要简单得多:

y = p(x) = c

y = p(x1) = b (x1 - x0) + y

在这个方法的大多数赢博体育中,我们对这个表达式进行了更多的操作,以使其变成更方便计算的形式:

用Python做算术

现在我们已经将多项式的计算简化为一组公式,剩下的最后一件事是做必要的算术来计算某个期望x的p(x)。

下面是一个Python程序的代码,它可以为我们进行必要的计算。在PyCharm中创建一个名为Quadratic的新项目,并向该项目添加一个文件quadrtic .py。将下面的代码粘贴到该文件中。

x0 = 1.04 y0 = 2.71 x1 = 1.51 y1 = 2.55 x2 = 1.83 y2 = 2.82 diff10 = (y1-y0)/(x1-x0) diff21 = (y2-y1)/(x2-x1) c = y0 b = diff10 a = (diff21-diff10)/(x2-x0) x = 1.7 p = a*(x-x1)*(x-x0)+b*(x-x0)+c print(‘在x = 1.7时,y近似=’,p)

当你运行这个程序时,它会输出p(1.7)的近似值。

示例程序演示了在Python中使用变量和算术的一些基础知识。要在Python程序中使用变量,我们只需编写一条语句,为变量赋值。

为了对存储在变量中的值进行算术运算,我们使用+、-、*、/和**操作符来进行加、减、乘、除和取幂。对于分组,我们使用数学中使用的括号符号。

添加注释

一旦程序超过了几行,您可能需要在程序中插入注释,以帮助解释程序的各个部分正在做什么。要在Python中键入注释,请键入哈希符号#,后面跟着注释的文本。Python将忽略注释的文本-注释只是用来帮助记录程序的各个部分正在做什么。

这是上面的程序,在适当的位置插入了注释,以帮助记录程序中正在发生的事情。

这是一个从一组数据点构造二次多项式的程序。我们使用牛顿法#构造多项式#初始数据点集。记它= 1.04 = 2.71 x1 = 1.51日元= 2.55 x2 = 1.83 y2 = 2.82 #构造多项式的系数diff10 = (y1-y0) / (x1-x0) diff21 = (y2-y1) / (x2-x1) c = y0 b = diff10 = (diff21-diff10) / (x2-x0) #这是x的值,我们需要评估x = 1.7 #计算多项式的值在x使用#牛顿多项式形式的p = * (x-x1) * (x-x0) + b * (x-x0) + c#打印结果打印(“大约1.7 x = y = = ', p)

编程任务

作为将二次多项式拟合到原始的三个数据点集的替代方法,您可以尝试进行两次单独的线性插值。对于第一个计算,构造通过数据点(x0, y0)和(x1, y1)的直线方程,并使用该线性函数来估计y在x = 1.7处的值。对于第二次计算,做同样的事情,而是构造一条穿过(x1, y1)和(x2, y2)的线。

编写一个Python程序来完成这两种线性插值,并让程序输出y(1.7)的两个估计值。

要提交作业进行评分,请将包含程序代码的Python文件作为电子邮件附件发送给我。