一、实验目的

掌握最小二乘法拟合离散数据,多项式函数形式拟合曲线以及可以其他可以通过变量变换转化为多项式的拟合曲线目前待实现功能:

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实现)的更多相关文章

  1. 非线性函数的最小二乘拟合及在Jupyter notebook中输入公式 [原创]

    突然有个想法,能否通过学习一阶RC电路的阶跃响应得到RC电路的结构特征——时间常数τ(即R*C).回答无疑是肯定的,但问题是怎样通过最小二乘法.正规方程,以更多的采样点数来降低信号采集噪声对τ估计值的 ...

  2. 最小二乘拟合(scipy实现)

    Scipy库在numpy库基础上增加了众多数学,科学及工程计算中常用库函数.如线性代数,常微分方程数值求解,信号处理,图像处理,稀疏矩阵等. 如下理解通过Scipy进行最小二乘法拟合运算 最小二乘拟合 ...

  3. 最小二乘拟合(转)good

    在物理实验中经常要观测两个有函数关系的物理量.根据两个量的许多组观测数据来确定它们的函数曲线,这就是实验数据处理中的曲线拟合问题.这类问题通常有两种情况:一种是两个观测量x与y之间的函数形式已知,但一 ...

  4. python 最小二乘拟合,反卷积,卡方检验

    import numpy as np # from enthought.mayavi import mlab ''' ogrid[-1:5:6j,-1:5:6j] [array([[-1. ], [ ...

  5. OpenCV 最小二乘拟合方法求取直线倾角

    工业相机拍摄的图像中,由于摄像质量的限制,图像中的直线经过处理后,会表现出比较严重的锯齿.在这种情况下求取直线的倾角(其实就是直线的斜率),如果是直接选取直线的开始点和结束点来计算,或是用opencv ...

  6. halcon之最小二乘拟合直线

    如果不了解最小二乘算法 请先阅读: Least squares的算法细节原理https://en.wikipedia.org/wiki/Least_squares 通常在halcon中拟合直线会用ho ...

  7. 实验8、31个最重要的Python Flask面试问题和答案

    实验介绍 1. 实验内容 内容涵盖了31个最热门的Flask面试问题,帮助学生更好的理解Flask. 2. 实验要点 了解面试Flask开发人员的常见问题 实验内容 Flask面试问答 Q:Flask ...

  8. MATLAB数值分析实验

    1.用Newton迭代法求方程   的第一个正根. 作者:凯鲁嘎吉 - 博客园http://www.cnblogs.com/kailugaji/ newton.m: function x1=newto ...

  9. 用正交多项式作最小二乘拟合的java实现(转)

    import java.util.Scanner; public class Least_square_fit { public static double Least_square_method(i ...

随机推荐

  1. Oracle 11g服务端的安装和配置

    1.双击Oracle11g_database安装目录下的Setup.exe. 2.选择“基本安装”,设置“安装位置”,填写“数据库名”和“口令”,点击“下一步”. 3.点击“下一步”. 4.一般会出现 ...

  2. NatApp 外网映射工具

    外网映射工具 在做微信开发或者是对接第三方支付接口时,回调接口可能需要外网访问,这时候开发者在本地测试的时候,需要用到外网测试工具.常用的外网测试工具有natapp.ngrok NatApp简介服务器 ...

  3. 如何测试Linux命令运行时间?

    良许在工作中,写过一个 Shell 脚本,这个脚本可以从 4 个 NTP 服务器轮流获取时间,然后将最可靠的时间设置为系统时间. 因为我们对于时间的要求比较高,需要在短时间内就获取到正确的时间.所以我 ...

  4. Python查看3Dnii文件

    from nibabel.viewers import OrthoSlicer3D from nibabel import nifti1 import nibabel as nib from matp ...

  5. Mysql数据库的基本操作(1)

    一.启动数据库 1. 我的电脑(此电脑)--->右键点击[管理]--->[服务和应用程序]--->[服务] 找到MySQL8.0可以选择手动启动或者自动启动. 2.可以直接通过命令行 ...

  6. M_map(五)

    一.圆形区域的画图 1. clear all LATLIMS=[14 22]; LONLIMS=[108 118];%南海边界范围 m_proj('miller','lon',LONLIMS,'lat ...

  7. @Configuration和@Bean 配置类注入

    @Configuration和@Bean 1. 概述 @Configuration 注解标记在类上, 就像下面的配置文件. 我们将该类成为配置类. <?xml version="1.0 ...

  8. PTA数据结构与算法题目集(中文) 7-10

    PTA数据结构与算法题目集(中文)  7-10 7-10 公路村村通 (30 分)   现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低 ...

  9. Spring 中使用 WebSocket 笔记

    编写 WebSocket 消息处理类,比较简单的方式就是直接继承AbstractWebSocketHandler,并覆写其中的处理方法,下面为一个简单的 demo public class WebSo ...

  10. 手把手教你分析Mysql死锁问题

    前言 前几天跟一位朋友分析了一个死锁问题,所以有了这篇图文详细的博文,哈哈~ 发生死锁了,如何排查和解决呢?本文将跟你一起探讨这个问题 准备好数据环境 模拟死锁案发 分析死锁日志 分析死锁结果 环境准 ...