一、实验目的

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

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. Dropout的前世与今生

    Dropout 是一类用于神经网络训练或推理的随机化技术,这类技术已经引起了研究者们的广泛兴趣,并且被广泛地应用于神经网络正则化.模型压缩等任务.虽然 Dropout 最初是为密集的神经网络层量身定制 ...

  2. 干货|Python基础入门 课程笔记(三)

    目录 列表 元组 字典 三元表达式 一.列表 前面学习的字符串可以用来存储一串信息,那么想一想,如果现在有很多人,总不能每个人都起一个变量名把?那岂不得疯~ 咱们可以使用列表. (1)列表得格式和输出 ...

  3. PyTorch Hub发布!一行代码调用最潮模型,图灵奖得主强推

    为了调用各种经典机器学习模型,今后你不必重复造轮子了. 刚刚,Facebook宣布推出PyTorch Hub,一个包含计算机视觉.自然语言处理领域的诸多经典模型的聚合中心,让你调用起来更方便. 有多方 ...

  4. Arcgis License的安装及破解

    1.双击LicenseManager安装目录下的Setup.exe. 2.点击“Next”. 3.选择“I accept the license agreement”,点击“Next”. 4.点击“C ...

  5. Dome_iptest_server

    一个简单的ip测试服务器 打印返回 请求头request import socket def send_data(conn, data=None, status=200): if status != ...

  6. 《java编程思想》一切都是对象

    1. 用引用操纵对象 在Java中一切皆对象,我们平常在对java中的类进行操作时,其实操作的不是对象本身而是对象的引用.我们可以将这想象成用遥控器(引用)操作电视机(对象),只要握住这个遥控器,就能 ...

  7. Metrics:如何让线上应用更加透明?

    1. 上期我们结合<SRE Google 运维解密>,对监控系统进行了一次脉络梳理,知道一旦离开了监控系统,我们就没法辨别一个服务是不是在正常提供服务,就如同线上的服务在随风裸奔. 文章分 ...

  8. 《Three.js 入门指南》3.1.1 - 基本几何形状 -圆形(CircleGeometry)

    3.1 基本几何形状 圆形(CircleGeometry) 说明: 可以创建圆形或者扇形 构造函数: THREE.CircleGeometry(radius, segments, thetaStart ...

  9. Java中的形参和实参的区别以及传值调用和传引用调用

    名词解析: 1.形参:用来接收调用该方法时传递的参数.只有在被调用的时候才分配内存空间,一旦调用结束,就释放内存空间.因此仅仅在方法内有效. 2.实参:传递给被调用方法的值,预先创建并赋予确定值. 3 ...

  10. python--爬虫之JSON于JsonPath

    JSON json的引入 在python中json作为一个内建库不需要额外安装,只需要使用import json执行引入 json模块的功能 在python中json模块提供了四个功能:dumps.d ...