首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

最小二乘法多项式曲线拟合原理与实现(2)

最小二乘法多项式曲线拟合原理与实现(2)

实现


运行前提:
  • Python运行环境与编辑环境;
  • Matplotlib.pyplot图形库,可用于快速绘制2D图表,与matlab中的plot命令类似,而且用法也基本相同。


代码:[python] view plain copy



  • # coding=utf-8

  • '''''
  • 作者:Jairus Chan
  • 程序:多项式曲线拟合算法
  • '''
  • import matplotlib.pyplot as plt  
  • import math  
  • import numpy  
  • import random  

  • fig = plt.figure()  
  • ax = fig.add_subplot(111)  

  • #阶数为9阶
  • order=9

  • #生成曲线上的各个点
  • x = numpy.arange(-1,1,0.02)  
  • y = [((a*a-1)*(a*a-1)*(a*a-1)+0.5)*numpy.sin(a*2) for a in x]  
  • #ax.plot(x,y,color='r',linestyle='-',marker='')
  • #,label="(a*a-1)*(a*a-1)*(a*a-1)+0.5"

  • #生成的曲线上的各个点偏移一下,并放入到xa,ya中去
  • i=0
  • xa=[]  
  • ya=[]  
  • for xx in x:  
  •     yy=y  
  •     d=float(random.randint(60,140))/100
  •     #ax.plot([xx*d],[yy*d],color='m',linestyle='',marker='.')
  •     i+=1
  •     xa.append(xx*d)  
  •     ya.append(yy*d)  

  • '''''for i in range(0,5):
  •     xx=float(random.randint(-100,100))/100
  •     yy=float(random.randint(-60,60))/100
  •     xa.append(xx)
  •     ya.append(yy)'''

  • ax.plot(xa,ya,color='m',linestyle='',marker='.')  


  • #进行曲线拟合
  • matA=[]  
  • for i in range(0,order+1):  
  •     matA1=[]  
  •     for j in range(0,order+1):  
  •         tx=0.0
  •         for k in range(0,len(xa)):  
  •             dx=1.0
  •             for l in range(0,j+i):  
  •                 dx=dx*xa[k]  
  •             tx+=dx  
  •         matA1.append(tx)  
  •     matA.append(matA1)  

  • #print(len(xa))
  • #print(matA[0][0])
  • matA=numpy.array(matA)  

  • matB=[]  
  • for i in range(0,order+1):  
  •     ty=0.0
  •     for k in range(0,len(xa)):  
  •         dy=1.0
  •         for l in range(0,i):  
  •             dy=dy*xa[k]  
  •         ty+=ya[k]*dy  
  •     matB.append(ty)  

  • matB=numpy.array(matB)  

  • matAA=numpy.linalg.solve(matA,matB)  

  • #画出拟合后的曲线
  • #print(matAA)
  • xxa= numpy.arange(-1,1.06,0.01)  
  • yya=[]  
  • for i in range(0,len(xxa)):  
  •     yy=0.0
  •     for j in range(0,order+1):  
  •         dy=1.0
  •         for k in range(0,j):  
  •             dy*=xxa  
  •         dy*=matAA[j]  
  •         yy+=dy  
  •     yya.append(yy)  
  • ax.plot(xxa,yya,color='g',linestyle='-',marker='')  

  • ax.legend()  
  • plt.show()  

运行效果:





本博客中所有的博文都为笔者(Jairus Chan)原创。

如需转载,请标明出处:http://blog.csdn.net/JairusChan

继承事业,薪火相传
返回列表