数值分析实验之曲线最小二乘拟合含有噪声扰动(python实现)
一、实验目的
掌握最小二乘法拟合离散数据,多项式函数形式拟合曲线以及可以其他可以通过变量变换转化为多项式的拟合曲线目前待实现功能:
1. 最小二乘法的基本实现。
2. 用不同数据量,不同参数,不同的多项式阶数,比较实验效果。
3. 语言python。
二、实验原理
最小二乘法(又称最小平方法)是一种数学优化技术。它通过最小化误差的平方和寻找数据的最佳函数匹配。利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小。最小二乘法还可用于曲线拟合。其他一些优化问题也可通过最小化能量或最大化熵用最小二乘法来表达。
三、实验内容
求y=f(x)=sin(x)+h(x)在区间[0,10]上按101等距节点确定的离散数据点组(xi,yi)的直线拟合以及曲线拟合,其中是服从h(x)标准正态分布的噪声扰动
四、程序实现
• 一次拟合:
import numpy as np
import matplotlib.pyplot as plt
import math
#定义x、y散点坐标
x = np.arange(0.0, 10.0,0.1)
x = np.array(x)
print('x is :\n',x)
num = np.sin(x)+np.random.randn(100)
y = np.array(num)
print('y is :\n',y)
f1 = np.polyfit(x, y, 1)#用1次多项式拟合,若要多次拟合,相应的改变这个常数即可
print('f1 is :\n',f1) p1 = np.poly1d(f1)
print('p1 is :\n',p1) #也可使用yvals=np.polyval(f1, x)
yvals = p1(x) #拟合y值
print('yvals is :\n',yvals)
#绘图
plot1 = plt.plot(x, y, 's',label='original values',color="blue")
plot2 = plt.plot(x, yvals, 'r',label='polyfit values',color="red")
plt.xlabel('x')
plt.ylabel('y')
plt.legend(loc=4) #指定legend的位置右下角
plt.title('polyfitting')
plt.show()
运行结果:

所得图形:

• 曲线拟合(用a*sin(x)+b拟合):
import numpy as np
import matplotlib.pyplot as plt
import math
from scipy.optimize import curve_fit #自定义函数
def func(x, a, b):
return a*np.sin(x)+b #定义x、y散点坐标
x = np.arange(0.0, 10.0,0.1)
x = np.array(x)
num = np.sin(x)+np.random.randn(100)
y = np.array(num) #非线性最小二乘法拟合
popt, pcov = curve_fit(func, x, y)
#获取popt里面是拟合系数
print(popt)
a = popt[0]
b = popt[1]
#c = popt[2]
#d = popt[3]
#e = popt[4]
yvals = func(x,a,b) #拟合y值
print('popt:', popt)
print('系数a:', a)
print('系数b:', b)
#print('系数c:', c)
#print('系数d:', d)
#print('系数e:', e)
print('系数pcov:', pcov)#方差
print('系数yvals:', yvals)#x代入拟合出的函数得到的函数值
#绘图
plot1 = plt.plot(x, y, 's',label='original values',color="purple")
x_test = np.arange(0.0, 10.0, 0.01)
y_test = func(x_test,a,b)
plot2 = plt.plot(x_test, y_test, 'r',label='polyfit values',color="red")
plt.xlabel('x')
plt.ylabel('y')
plt.legend(loc=4) #指定legend的位置右下角
plt.title('curve_fit')
plt.show()
运行结果

所得图形:

•曲线拟合(用a*np.sin(b*x+c)+d拟合):
import numpy as np
import matplotlib.pyplot as plt
import math
from scipy.optimize import curve_fit #自定义函数
def func(x, a, b, c, d):
return a*np.sin(b*x+c)+d #定义x、y散点坐标
x = np.arange(0.0, 10.0,0.1)
x = np.array(x)
num = np.sin(x)+np.random.randn(100)
y = np.array(num) #非线性最小二乘法拟合
popt, pcov = curve_fit(func, x, y)
#获取popt里面是拟合系数
print(popt)
a = popt[0]
b = popt[1]
c = popt[2]
d = popt[3]
yvals = func(x,a,b,c,d) #拟合y值
print('popt:', popt)
print('系数a:', a)
print('系数b:', b)
print('系数c:', c)
print('系数d:', d)
print('系数pcov:', pcov)#方差
print('系数yvals:', yvals)#x代入拟合出的函数得到的函数值
#绘图
plot1 = plt.plot(x, y, 's',label='original values',color='orange')
x_test = np.arange(0.0, 10.0, 0.01)
y_test = func(x_test,a,b,c,d)
plot2 = plt.plot(x_test, y_test, 'r',label='polyfit values',color='brown')
plt.xlabel('x')
plt.ylabel('y')
plt.legend(loc=4) #指定legend的位置右下角
plt.title('curve_fit')
plt.show()
运行结果:

所得图形:

•自定义函数实现:
import numpy as np
import matplotlib.pyplot as plt
import math
from scipy.optimize import curve_fit #自定义函数
def func(x, a0,a1,a2,a3,a4,a5,a6,a7,a8,b1,b2,b3,b4,b5,b6,b7,b8,w):
return a0 + a1*np.cos(x*w) + b1*np.sin(x*w) + \
a2*np.cos(2*x*w) + b2*np.sin(2*x*w) + a3*np.cos(3*x*w) + b3*np.sin(3*x*w) + \
a4*np.cos(4*x*w) + b4*np.sin(4*x*w) + a5*np.cos(5*x*w) + b5*np.sin(5*x*w) + \
a6*np.cos(6*x*w) + b6*np.sin(6*x*w) + a7*np.cos(7*x*w) + b7*np.sin(7*x*w) + \
a8*np.cos(8*x*w) + b8*np.sin(8*x*w) #定义x、y散点坐标
x = np.arange(0.0, 10.0,0.1)
x = np.array(x)
num = np.sin(x)+np.random.randn(100)
y = np.array(num) #非线性最小二乘法拟合
popt, pcov = curve_fit(func, x, y)
#获取popt里面是拟合系数
print(popt)
a0 = popt[0]
a1 = popt[1]
a2 = popt[2]
a3 = popt[3]
a4 = popt[4]
a5 = popt[5]
a6 = popt[6]
a7 = popt[7]
a8 = popt[8]
b1 = popt[9]
b2 = popt[10]
b3 = popt[11]
b4 = popt[12]
b5 = popt[13]
b6 = popt[14]
b7 = popt[15]
b8 = popt[16]
w = popt[17]
yvals = func(x,a0,a1,a2,a3,a4,a5,a6,a7,a8,b1,b2,b3,b4,b5,b6,b7,b8,w) #拟合y值
print('popt:', popt)
print('系数a0:', a0)
print('系数a1:', a1)
print('系数a2:', a2)
print('系数a3:', a3)
print('系数a4:', a4)
print('系数a5:', a5)
print('系数a6:', a6)
print('系数a7:', a7)
print('系数a8:', a8)
print('系数b1:', b1)
print('系数b2:', b2)
print('系数b3:', b3)
print('系数b4:', b4)
print('系数b5:', b5)
print('系数b6:', b6)
print('系数b7:', b7)
print('系数b8:', b8)
print('系数w:', w)
print('系数pcov:', pcov)#方差
print('系数yvals:', yvals)#x代入拟合出的函数得到的函数值
#绘图
plot1 = plt.plot(x, y, 's',label='original values',color='yellow')
x_test = np.arange(0.0, 10.0, 0.01)
y_test = func(x_test,a0,a1,a2,a3,a4,a5,a6,a7,a8,b1,b2,b3,b4,b5,b6,b7,b8,w)
plot2 = plt.plot(x_test, y_test, 'r',label='polyfit values',color='blue')
plt.xlabel('x')
plt.ylabel('y')
plt.legend(loc=4) #指定legend的位置右下角
plt.title('curve_fit')
plt.show()
实现结果:

所得图形:

心得体会
通过本次实验,我对MATLAB的操作更加熟悉,也对本学期正在学习的Python有了更深层次的认识,对着两种编程软件更加熟悉。最重要的是:对最小二乘法理解深入,以及可以应用推广,对数值分析理论的学习有很重要的作用,总而言之收获颇多。
数值分析实验之曲线最小二乘拟合含有噪声扰动(python实现)的更多相关文章
- 非线性函数的最小二乘拟合及在Jupyter notebook中输入公式 [原创]
突然有个想法,能否通过学习一阶RC电路的阶跃响应得到RC电路的结构特征——时间常数τ(即R*C).回答无疑是肯定的,但问题是怎样通过最小二乘法.正规方程,以更多的采样点数来降低信号采集噪声对τ估计值的 ...
- 最小二乘拟合(scipy实现)
Scipy库在numpy库基础上增加了众多数学,科学及工程计算中常用库函数.如线性代数,常微分方程数值求解,信号处理,图像处理,稀疏矩阵等. 如下理解通过Scipy进行最小二乘法拟合运算 最小二乘拟合 ...
- 最小二乘拟合(转)good
在物理实验中经常要观测两个有函数关系的物理量.根据两个量的许多组观测数据来确定它们的函数曲线,这就是实验数据处理中的曲线拟合问题.这类问题通常有两种情况:一种是两个观测量x与y之间的函数形式已知,但一 ...
- python 最小二乘拟合,反卷积,卡方检验
import numpy as np # from enthought.mayavi import mlab ''' ogrid[-1:5:6j,-1:5:6j] [array([[-1. ], [ ...
- OpenCV 最小二乘拟合方法求取直线倾角
工业相机拍摄的图像中,由于摄像质量的限制,图像中的直线经过处理后,会表现出比较严重的锯齿.在这种情况下求取直线的倾角(其实就是直线的斜率),如果是直接选取直线的开始点和结束点来计算,或是用opencv ...
- halcon之最小二乘拟合直线
如果不了解最小二乘算法 请先阅读: Least squares的算法细节原理https://en.wikipedia.org/wiki/Least_squares 通常在halcon中拟合直线会用ho ...
- 实验8、31个最重要的Python Flask面试问题和答案
实验介绍 1. 实验内容 内容涵盖了31个最热门的Flask面试问题,帮助学生更好的理解Flask. 2. 实验要点 了解面试Flask开发人员的常见问题 实验内容 Flask面试问答 Q:Flask ...
- MATLAB数值分析实验
1.用Newton迭代法求方程 的第一个正根. 作者:凯鲁嘎吉 - 博客园http://www.cnblogs.com/kailugaji/ newton.m: function x1=newto ...
- 用正交多项式作最小二乘拟合的java实现(转)
import java.util.Scanner; public class Least_square_fit { public static double Least_square_method(i ...
随机推荐
- 【Redis】入门
Redis概述 Redis常用数据结构 Redis删除过期数据策略 Redis内存淘汰机制 Redis持久化机制 缓存问题及解决方案 Redis概述 Redis是一个开源的.基于内存的数据结构存储器 ...
- java面试基础篇-List
一.ArrayList: 底层为数组实现,线程不安全,查询,修改快,增加删除慢, 数据结构:数组以0为下标依次连续进行存储 数组查询元素:根据下标查询就行 数组增加元素:如果需要给index为10的位 ...
- 算法(algorithm)
算法是什么? 算法是指令的集合,是为解决特定问题而规定的一系列操作. 它是明确定义的可计算过程,以一个数据集合作为输入,并产生一个数据集合作为输出. 一个算法通常来说具有以下五个特性: 1.输入:一个 ...
- Supervisor 使用和进阶4 (Event 的使用)
本文主要介绍 supervisor Event 的功能. supervisor 作为一个进程管理工具,在 3.0 版本之后,新增了 Event 的高级特性, 主要用于做(进程启动.退出.失败等)事件告 ...
- 汇编学习二-VB(常见函数分析)
VB代码如下所示 push ebp 00401FF1 . 8BEC mov ebp,esp 00401FF3 . 83EC 0C sub esp,0xC push <jmp.&MSVBV ...
- HDU-1421-搬寝室(01背包改编版)
搬寝室是很累的,xhd深有体会.时间追述2006年7月9号,那天xhd迫于无奈要从27号楼搬到3号楼,因为10号要封楼了.看着寝室里的n件物品,xhd开始发呆,因为n是一个小于2000的整数,实在是太 ...
- win10配置易用命令行
在 win10 下配置易用命令行 win10 相比 Linux 最大的短板之一是命令行. 这篇文章不会将 win10 配置到像Linux那样一行命令解决所有包的安装,只是从最大程度上方便开发. 我们主 ...
- 《Three.js 入门指南》3.0 - 代码构建的最基本结构。
3.0 代码构建的最基本结构 说明: 我们必需首先知道,Three.js 的一些入门级概念: 我们需要知道,OpenGL 是一套三维实现的标准,为什么说是标准,因为它是跨平台,跨语言的.甚至CAD以及 ...
- gitlab问题
1.gitclone前http://10.10.11.4:9999/SZRDC/I`````````.git改为http://git.berchina.com:9999/~~~~``` 2.Cloni ...
- pinpoint配置使用
一.下载pinpoint包 从https://github.com/naver/pinpoint/releases 下载 pinpoint-agent.tar.gz pinpoint-collecto ...