附加例子-大学物理知识点总结
4.4附加例子第四章循环结构第109页4.4附加例子例4.7用最小二乘法画噪声数据的近似曲线
下落物体将会作匀加速度运动,它的速度符合下面的公式:
[ v(t) = at + v0 ]
(4.3)
v(t)代表物体在t时刻的速度。加速度为g,初速度v0为0。这个公式出现在基础物理学中,我们大家都非常的熟悉。如果我们要画出下落物体的速度时间图象,我们得到的(v,t)测量值应当在同一条直线上。但是,学习物理的同学都知道,在实验室得到的测量值不一定是直线。为什么会这样呢?因为所有的测量都有误差。在所有测量值中都有一定的噪声。在工程和科研方面,有许多像这个例子一样带有噪声,而我们希望得到最符合的结果。这个问题叫做线性待定问题。给出一系列带噪声的测量值(x,y),它遵循一条直线,如何确定“最符合”这条直线的解析式呢?
如果我们确定了待定系数m和b,那么我们就确定了解析式:
[ y=mx+b ]
(4.4)
确定待定系数m和b的标准方法为最小二乘法。之所以称为最小二乘法,是因为根据偏差的平方和为最小的条件来选择常数m和b的。公式如下:
[ m = \frac{(∑xy)-(∑x) \cdot y-}{(∑x^2)-(∑x) \cdot x-} ]
(4.5)
[ b = y- - m \cdot x- ]
(4.6)
∑x代表所有测量值x之和,∑y代表所有测量值y之和,∑xy代表所有对应的x与y的乘积之和,x-代表测值量x的数学期望,y-代表测值量y的数学期望。
已知有一系列含有噪声的数据(x,y),编写程序用最小二乘法计算出m和b。数据要求从键盘输入,画出每一个数据点还有画出最适合的直线。
答案:
- 陈述问题
已知有一系列含有噪声的数据(x,y),用最小二乘法计算m和b。数据要求从键盘输入,画出每一个数据点还有画出最适合的直线。
- 定义输入输出值
这个程序所需的输入值为点的个数,以及点的坐标。输出是用最小二乘法得到的斜率以及y上的截距。
- 设计算法
这个问题被分解为6个大步骤:
-
获取输入数据点的数量
-
读取输入数据值
-
计算所需的统计量
-
计算斜率和截距
-
输出斜率和截距
-
绘制输入点和拟合直线
第一步是读取输入量的个数,所以我们要用到input函数。下一步我们要在for循环中使用input函数读取输入量(x,y)。每一个输入值将会产生一个数组([x,y]),然后这个函数将会返回这个数组到调用程序。注意在这里应用for循环是合适的,因为我们事先知道循环要执行多少次。上述步骤的伪代码如下:
print("This program fits a line to noisy data using the least squares method.")
n_points = int(input("Enter number of [x, y] pairs: "))
data = []
for _ in range(n_points):
x, y = map(float, input("Enter x and y values: ").split())
data.append((x, y))
# 后续步骤:计算统计量、斜率、截距和绘图