参考来源:
https://numpy.org/doc/stable/reference/generated/numpy.polyfit.html
背景:
问题
今天遇到一个问题:外部电源给设备供电,设备里面的芯片使用ADC去采样电源电压得到一个采样值。那么就有许多电源电压和采样值的离散数据。现在需要知道,ADC采样到值之后,算出外部的电源电压。
解决思路
记录大量外部电源电压和ADC采样值,形成大量离散的数据。再根据这些离散的数据,求一个最佳匹配曲线函数。那么我们知道ADC采样值之后,就可以根据函数算出对应的电压值。
实现方式
1.excel有离散点画图,再求拟合函数。 尝试操作了下没搞定。
2.使用python 里面的数学工具,整个解决这个问题,在半小时左右,简单快捷。
1.相关介绍
在数据分析和机器学习领域,拟合曲线是一项常见的任务。numpy是一个非常强大的数学工具库,提供了许多用于拟合曲线的函数和方法。其中,polyfit函数被广泛应用于多项式拟合。
1.1拟合多项式曲线函数numpy.polyfit()介绍
polyfit函数是numpy提供的用于拟合多项式曲线的函数。最小二乘多项式拟合。
numpy.polyfit(x, y, deg, rcond=None, full=False, w=None, cov=False)
x: 自变量的数据,一维数组或列表。
y: 因变量的数据,一维数组或列表。
deg: 所需多项式的阶数。
rcond:奇异值分解过程中的阈值,默认为None。
full: 是否返回完整的输出,默认为False,即只返回拟合系数。
w: 每个点的相对权重,默认为None。
cov: 是否返回拟合系数的协方差矩阵,默认为False。
import numpy as np
#y=ax^2 + bx + c
#y=3x^2 + 4x + 5
# 生成数据
x = np.array([1, 2, 3, 4, 5])
y = np.array([12, 25, 44, 69, 100])
# 使用polyfit函数进行多项式拟合
coefs = np.polyfit(x, y, deg=2)
print('coefs:', coefs)
#coefs: [3. 4. 5.]
#输入x, y的序列,求出x和y的函数关系,2表示2次函数,
#类似于 y =ax^2 + bx^1 + c
#输出为方程系数 [a. b. c]
1.2 绘制曲线函数plt.plot( )介绍
plt.plot(x,y,format_string,**kwargs)
x: 表示二维坐标中X轴数据(列表或数据,可选)
y: 表示二维坐标中Y轴数据(列表或数据)
format_string: 表示控制曲线的格式字符串(线宽,线型,颜色等等),可选
**kwargs: 表示第二组或更多(x,y,format_string)
注:可以通过成组传入多组x,y的值进行多个曲线的绘制工作,
但是当绘制多条曲线时,各条曲线的x值不能省略。
1.3 实际问题
import numpy as np
import matplotlib.pyplot as plt
import warnings
x = np.array(
[0.39360725 ,0.439033 ,0.4662495 ,0.47550825 ,0.4845465 ,0.4948735 ,
0.50329725 ,0.53007925 ,0.57519025 ,0.62065975 ,0.66621775 ,0.7114355 ,
0.72965725 ,0.738696 ,0.74757725 ,0.7567855 ,0.765799 ,0.77464875 ,
0.7836055 ,0.801909 ,0.8196085 ,0.8376225 ,0.8553535 ,0.8731095 ,
0.89108 ,0.90869125 ,0.9267175 ,0.94443575 ,0.9622865 ,0.97977825 ,
0.99705575 ,1.01467375 ,1.032008 ,1.04943675 ,1.06643125 ,1.0838915 ,
1.100716 ,1.1175975 ,1.1344595 ,1.15084975 ,1.16759225 ,1.18381275 ,
1.20011475 ,1.21620925 ,1.23173725 ,1.24745375 ,1.2628435 ,1.278296 ,
1.29306225 ,1.3079605 ,1.3223365 ,1.32961275 ,1.336612 ,1.34375625 ,
1.350881 ,1.357729 ,1.3643885 ,1.37812875 ,1.39794925 ,1.417109 ,
1.4361555 ,1.4539875 ,1.4598785 ,1.46578875 ,1.471567 ,1.4772065 ,
1.4828465 ,1.488656 ,1.49957 ,1.52579175 ,1.57466675 ,1.618003 ,
1.65694525 ,1.692344 ,1.72419325 ,
])
y = np.array(
[5 ,5.5 ,5.8 ,5.9 ,6 ,6.1 ,
6.2 ,6.5 ,7 ,7.5 ,8 ,8.5 ,
8.7 ,8.8 ,8.9 ,9 ,9.1 ,9.2 ,
9.3 ,9.5 ,9.7 ,9.9 ,10.1 ,10.3 ,
10.5 ,10.7 ,10.9 ,11.1 ,11.3 ,11.5 ,
11.7 ,11.9 ,12.1 ,12.3 ,12.5 ,12.7 ,
12.9 ,13.1 ,13.3 ,13.5 ,13.7 ,13.9 ,
14.1 ,14.3 ,14.5 ,14.7 ,14.9 ,15.1 ,
15.3 ,15.5 ,15.7 ,15.8 ,15.9 ,16 ,
16.1 ,16.2 ,16.3 ,16.5 ,16.8 ,17.1 ,
17.4 ,17.7 ,17.8 ,17.9 ,18 ,18.1 ,
18.2 ,18.3 ,18.5 ,19 ,20 ,21 ,
22 ,23 ,24 ,
])
z_1 = np.polyfit(x, y, 1)
print("z_1:", z_1)
fun_1 = np.poly1d(z_1)
z_2 = np.polyfit(x, y, 2)
print("z_2:", z_2)
fun_2 = np.poly1d(z_2)
z_3 = np.polyfit(x, y, 3)
print("z_3:", z_3)
fun_3 = np.poly1d(z_3)
z_4 = np.polyfit(x, y, 4)
print("z_4:", z_4)
fun_4 = np.poly1d(z_4)
z_5 = np.polyfit(x, y, 5)
print("z_5:", z_5)
fun_5 = np.poly1d(z_5)
z_6 = np.polyfit(x, y, 6)
print("z_6:", z_6)
fun_6 = np.poly1d(z_6)
#生成0到2范围内,等距的10000个值
xp = np.linspace(0, 2, 10000)
#根据给出的点坐标做图,这里是2组数据。
plt.plot(x, y, '.', xp, fun_4(xp), '-')
#根据给出的点坐标做图,这里是4组数据。
#plt.plot(x, y, '.', xp, fun_1(xp), '-', xp, fun_2(xp), '-', xp, fun_6(xp), '-')
#设置y坐标的范围
#plt.ylim(0,36)
#设置x坐标的范围
#plt.xlim(0,2)
#生成图形
plt.show()