数值分析实验之曲线最小二乘拟合含有噪声扰动(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 ...
随机推荐
- VBScript - 动态 Array 实现方法大全!
记录一些方法,关于 VBScript 中,动态 Array 的实现 ,也适用于 VBA, 很久以前,写 VBA 的时候,就觉得使用 Array 很不方便,因为大小固定, 当时想的是,要是 Array ...
- php _weakup()反序列化漏洞
概念&原理 序列化就是使用 serialize() 将对象用字符串的方式进行表示: 反序列化是使用 unserialize() 将序列化的字符串构造成相应的对象,为序列化的逆过程. 序列化的对 ...
- 爬虫scrapy框架的使用
第一步 下载scrapy模块: pip install scrapy 第二步 创建项目 在终端/cmd进入创建项目的目录:scrapy startproject douban(项目名) 导入pycha ...
- ConcurrentHashMap1.7和1.8的源码分析比较
ConcurrentHashMap 在多线程环境下,使用HashMap进行put操作时存在丢失数据的情况,为了避免这种bug的隐患,强烈建议使用ConcurrentHashMap代替HashMap,为 ...
- [一起读源码]走进C#并发队列ConcurrentQueue的内部世界
决定从这篇文章开始,开一个读源码系列,不限制平台语言或工具,任何自己感兴趣的都会写.前几天碰到一个小问题又读了一遍ConcurrentQueue的源码,那就拿C#中比较常用的并发队列Concurren ...
- 《快速认识 Three.js 》
此文仅作备份之用,为了更好的阅读体验,建议访问原文链接:<Three.js - 走进3D的奇妙世界.> ,感谢原作者的好文.
- Light of future-凡事预则立
目录 1.冲刺的时间计划安排 2.针对上一次作业同学.助教提出的问题的回答 3.针对前几次作业的不足的地方进行思考和总结 4.需要改进的团队分工 5.团队的代码规范 6.Github仓库链接 归属班级 ...
- Redis 笔记(五)—— HASH 常用命令
添加和删除键值对的散列操作 命令 用例和描述 HMGET HMGET key-name key [key ...] —— 从散列里面获取一个或多个键的值 HMSET HMSET key-name ke ...
- Java中如何通过try优雅地释放资源?
时间紧迫,长话短说,今天,小明给大家同步一个知识点,使用try-with-resources来优雅地关闭资源. 1. 背景 其实,在JDK 7就已经引入了对try-with-resources的支持, ...
- Vulnhub bulldog靶机渗透
配置 VM运行kali,桥接模式设置virtualbox. vbox运行靶机,host-only网络. 信息搜集 nmap -sP 192.168.56.0/24 或者 arp-scan -l #主机 ...