python求拟合函数

参考来源:
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()

在这里插入图片描述

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值