python-曲线拟合-原理-代码_第1页
python-曲线拟合-原理-代码_第2页
python-曲线拟合-原理-代码_第3页
python-曲线拟合-原理-代码_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

概念最小二乘法多项式曲线拟合,根据给定的m个点,并不要求这条曲线精确地经过这些点,而是曲线y=f(x)的近似曲线y=φ(x)。原理[原理局部由个人根据互联网上的资料进行总结,希望对大家能有用]给定数据点pi(xi,yi),其中i=1,2,…,m。求近似曲线y=φ(x)。并且使得近似曲线与y=f(x)的偏差最小。近似曲线在点pi处的偏差δi=φ(xi)-y,i=1,2,...,m。常见的曲线拟合方法:按偏差平方和最小的原那么选取拟合曲线,并且采取二项式方程为拟合曲线的方法,称为最小二乘法。推导过程:1.设拟合多项式为:2.各点到这条曲线的距离之和,即偏差平方和如下:3.为了求得符合条件的a值,对等式右边求ai偏导数,因而我们得到了:.......4.将等式左边进行一下化简,然后应该可以得到下面的等式:.......5.把这些等式表示成矩阵的形式,就可以得到下面的矩阵:6.将这个范德蒙得矩阵化简后可得到:7.也就是说X*A=Y,那么A=(X'*X)-1*X'*Y,便得到了系数矩阵A,同时,我们也就得到了拟合曲线。实现运行前提:Python运行环境与编辑环境;Matplotlib.pyplot图形库,可用于快速绘制2D图表,与matlab中的plot命令类似,而且用法也根本相同。代码:[python]viewplaincopy#

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,)

y

=

[((a*a-1)*(a*a-1)*(a*a-1)+)*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=0xa=[]

ya=[]

for

xx

in

x:

yy=y[i]

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=

for

k

in

range(0,len(xa)):

dx=

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=

for

k

in

range(0,len(xa)):

dy=

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,,)

yya=[]

for

i

in

range(0,len(xxa)):

yy=

for

j

in

range(0,order+1):

dy=

for

k

in

range(0,j):

dy*=xxa[i]

dy*=matAA[j]

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论