4.4附加例子第四章循环结构第109页

4.4附加例子例4.7用最小二乘法画噪声数据的近似曲线

下落物体将会作匀加速度运动,它的速度符合下面的公式:

[ v(t) = at + v_0 ]

( v(t) ) 代表物体在 t 时刻的速度。加速度为 g,初速度 ( v_0 ) 为 0。这个公式出现在基础物理学中,我们大家都非常熟悉。如果我们要画出下落物体的速度时间图象,我们得到的 ( (v, t) ) 测量值应当在同一条直线上。但是,学习物理的同学都知道,在实验室得到的测量值不一定是直线。为什么会这样呢?因为所有的测量都有误差。在所有测量值中都有一定的噪声。

在工程和科研方面,有许多像这个例子一样带有噪声,而我们希望得到最符合的结果。这个问题叫做线性待定问题。给出一系列带噪声的测量值 ( (x, y) ),它遵循一条直线,如何确定“最符合”这条直线的解析式呢?如果我们确定了待定系数 m 和 b,那么我们就确定了解析式 4.4:

[ y = mx + b ]

确定待定系数 m 和 b 的标准方法为最小二乘法。之所以称为最小二乘法,是因为根据偏差的平方和为最小的条件来选择常数 m 和 b 的。公式如下:

[ m = \frac{( \sum xy ) - ( \sum x ) y}{( \sum x^2 ) - ( \sum x ) x} ]

[ b = y - mx ]

( \sum x ) 代表所有测量值 x 之和,( \sum y ) 代表所有测量值 y 之和,( \sum xy ) 代表所有对应的 x 与 y 的乘积之和,( \bar{x} ) 代表测值量 x 的数学期望,( \bar{y} ) 代表测值量 y 的数学期望。

已知有一系列含有噪声的数据 ( (x, y) ),编写程序用最小二乘法计算出 m 和 b。数据要求从键盘输入,画出每一个数据点还有画出最适合的直线。

答案:

  1. 陈述问题

已知有一系列含有噪声的数据 ( (x, y) ),用最小二乘法计算 m 和 b。数据要求从键盘输入,画出每一个数据点还有画出最适合的直线。

  1. 定义输入输出值

这个程序所需的输入值为点的个数,以及点的坐标。输出是用最小二乘法得到的斜率以及 y 轴上的截距。

  1. 设计算法

这个问题被分解为 6 个大步骤:

  • 获取输入数据点的个数

  • 读取输入数据值

  • 计算所需的统计量

  • 计算斜率和截距

  • 输出斜率和截距

  • 绘制输入点和拟合直线

第一大步是读取输入量的个数,所以我们要用到 input 函数。下一步我们要在 for 循环中使用 input 函数读取输入量 ( (x, y) )。每一个输入值将会产生一个数组 ([x, y]),然后这个函数将会返回这个数组到调用程序。注意在这里应用 for 循环是合适的,因为我们事先知道循环要执行多少次。

上述步骤的伪代码如下:


Print message describing purpose of the program

n_points ← input('Enter number of [x y] pairs:');