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。数据要求从键盘输入,画出每一个数据点还有画出最适合的直线。
答案:
- 陈述问题
已知有一系列含有噪声的数据 ( (x, y) ),用最小二乘法计算 m 和 b。数据要求从键盘输入,画出每一个数据点还有画出最适合的直线。
- 定义输入输出值
这个程序所需的输入值为点的个数,以及点的坐标。输出是用最小二乘法得到的斜率以及 y 轴上的截距。
- 设计算法
这个问题被分解为 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:');
暂无评论