用C语言实现的曲线拟合的最小二乘法.docx
- 文档编号:11805645
- 上传时间:2023-04-02
- 格式:DOCX
- 页数:11
- 大小:136.06KB
用C语言实现的曲线拟合的最小二乘法.docx
《用C语言实现的曲线拟合的最小二乘法.docx》由会员分享,可在线阅读,更多相关《用C语言实现的曲线拟合的最小二乘法.docx(11页珍藏版)》请在冰豆网上搜索。
用C语言实现的曲线拟合的最小二乘法
实验名称:
曲线拟合的最小二乘法
实验目的
了解曲线拟合的最小二乘法
实验类型
设计型
实验环境
WindowsXPTC
实验内容
相关知识:
已知C[a,b]中函数f(x)的一组实验数据(xi,yi)(i=0,1,…,m),其中yi=f(xi)。
设
是C[a,b]上线性无关函数族。
在
中找函数f(x)曲线拟合的最小二乘解
,其法方程(组)为:
其中,
k=0,1,…,n
特别是,求函数f(x)曲线拟合的线性最小二乘解
的计算公式为:
数据结构:
两个一维数组或一个二维数组
算法设计:
(略)
实验用例:
已知函数y=f(x)的一张表:
x
0
10
20
30
40
50
60
70
80
90
y
68
67。
1
66.4
65。
6
64。
6
61。
8
61。
0
60。
8
60.4
60
试验要求:
利用曲线拟合的线性最小二乘法求被逼近函数f(x)在点x=55处的近似值,并画出实验数据和直线。
编写代码:
#include〈stdio.h>
#include
#include doubleqiuhe1(doublea[10][2],intp) { inti; doubley; y=0; for(i=0;i〈10;i++) y=y+a[i][p]; returny; } doubleqiuhe2(doublea[10][2],intp) { inti; doubley=0; for(i=0;i<10;i++) y=y+a[i][0]*a[i][p]; returny; } doublenihe(doublea[10][2],doublex) { doublea1,b,y; a1=(10*qiuhe2(a,1)-qiuhe1(a,0)*qiuhe1(a,1))/(10*qiuhe2(a,0)-qiuhe1(a,0)*qiuhe1(a,0)); b=(qiuhe2(a,0)*qiuhe1(a,1)—qiuhe1(a,0)*qiuhe2(a,1))/(10*qiuhe2(a,0)—qiuhe1(a,0)*qiuhe1(a,0)); y=a1*x+b; returny; } intmain() { doublea[10][2]={0,68,10,67.1,20,66.4,30,65.6,40,64.6,50,61.8, 60,61.0,70,60.8,80,60.4,90,60}; doublex,x1,q=1; charc[12]; inti; longn; intarw[6]={515,235,520,240,515,245}; intarw1[6]={315,45,320,40,325,45}; intgdriver=IBM8514; intgmode=IBM8514HI; initgraph(&gdriver,&gmode,”c: \\TC20\\BGI"); cleardevice(); printf(”inputx: \n"); scanf("%lf",&x); printf("%f\n",nihe(a,x)); n=nihe(a,x)*1000000+1; c[0]='y’;c[1]=’='; c[4]='。 '; for(i=10;i〉1;i—-) { if(i! =4) { c[i]=n%10+48; n=n/10; } } c[11]='\0'; x1=x; setbkcolor(7); setcolor(14); setlinestyle(0,0,3); drawpoly(3,arw); drawpoly(3,arw1); line(120,240,520,240); line(320,40,320,440); x=0; setcolor (2); setlinestyle(0,0,1); line((0+320),(int)(240—nihe(a,0)*q),(90+320),(int)(240-nihe(a,90)*q)); setcolor(3); outtextxy(320,30,”Y"); outtextxy(310,245,”O"); outtextxy(525,240,"X”); outtextxy((x1+330),((240-nihe(a,x1))—10),c); settextstyle(4,0,4); outtextxy(450,400,”Nihe...”); for(i=0;i〈=9;i++) putpixel((a[i][0]+320),(240-a[i][1]*q),11); setcolor(4); setlinestyle(1,0,1); line((x1+320),((240-nihe(a,x1)*q)-80),(x1+320),((240—nihe(a,x1)*q)+120)); getch(); closegraph(); } 实验结果(测试用例、实验结果) 实验总结与心得 通过本次实验,对曲线拟合的最小二乘法有了更深刻的了解! 概念 最小二乘法多项式曲线拟合,根据给定的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.使偏差平方和最小 按偏差平方和最小的原则选取拟合曲线,并且采取二项式方程为拟合曲线的方法,称为最小二乘法. 推导过程: 1. 设拟合多项式为: 2。 各点到这条曲线的距离之和,即偏差平方和如下: 3. 为了求得符合条件的a值,对等式右边求ai偏导数,因而我们得到了: 。 ...... 4. 将等式左边进行一下化简,然后应该可以得到下面的等式: .。 。 ..。 . 5。 把这些等式表示成矩阵的形式,就可以得到下面的矩阵: 6。 将这个范德蒙得矩阵化简后可得到: 7。 也就是说X*A=Y,那么A=(X’*X)—1*X’*Y,便得到了系数矩阵A,同时,我们也就得到了拟合曲线。 实现 运行前提: 1.Python运行环境与编辑环境; 2.Matplotlib.pyplot图形库,可用于快速绘制2D图表,与matlab中的plot命令类似,而且用法也基本相同。 代码: [python] viewplain copy 1.# coding=utf—8 2. 3.’’''' 4.作者: Jairus Chan 5.程序: 多项式曲线拟合算法 6.’'’ 7.import matplotlib。 pyplot as plt 8.import math 9.import numpy 10.import random 11. 12.fig = plt。 figure() 13.ax = fig。 add_subplot(111) 14. 15.#阶数为9阶 16.order=9 17. 18.#生成曲线上的各个点 19.x = numpy。 arange(—1,1,0.02) 20.y = [((a*a-1)*(a*a-1)*(a*a-1)+0.5)*numpy。 sin(a*2) for a in x] 21.#ax.plot(x,y,color=’r',linestyle=’—’,marker=’') 22.#,label="(a*a-1)*(a*a—1)*(a*a-1)+0.5" 23. 24.#生成的曲线上的各个点偏移一下,并放入到xa,ya中去 25.i=0 26.xa=[] 27.ya=[] 28.for xx in x: 29. yy=y[i] 30. d=float(random。 randint(60,140))/100 31. #ax。 plot([xx*d],[yy*d],color='m',linestyle='',marker='。 ’) 32. i+=1 33. xa。 append(xx*d) 34. ya。 append(yy*d) 35. 36.’'’''for i in range(0,5): 37. xx=float(random。 randint(—100,100))/100 38. yy=float(random.randint(-60,60))/100 39. xa.append(xx) 40. ya.append(yy)'’’ 41. 42.ax。 plot(xa,ya,color='m’,linestyle='',marker=’.') 43. 44. 45.#进行曲线拟合 46.matA=[] 47.for i in range(0,order+1): 48. matA1=[] 49. for j in range(0,order+1): 50. tx=0。 0 51. for k in range(0,len(xa)): 52. dx=1。 0 53. for l in range(0,j+i): 54. dx=dx*xa[k] 55. tx+=dx 56. matA1.append(tx) 57. matA.append(matA1) 58. 59.#print(len(xa)) 60.#print(matA[0][0]) 61.matA=numpy.array(matA) 62. 63.matB=[] 64.for i in range(0,order+1): 65. ty=0。 0 66. for k in range(0,len(xa)): 67. dy=1。 0 68. for l in range(0,i): 69. dy=dy*xa[k] 70. ty+=ya[k]*dy 71. matB。 append(ty) 72. 73.matB=numpy。 array(matB) 74. 75.matAA=numpy.linalg。 solve(matA,matB) 76. 77.#画出拟合后的曲线 78.#print(matAA) 79.xxa= numpy。 arange(—1,1.06,0。 01) 80.yya=[] 81.for i in range(0,len(xxa)): 82. yy=0.0 83. for j in range(0,order+1): 84. dy=1。 0 85. for k in range(0,j): 86. dy*=xxa[i] 87. dy*=matAA[j] 88. yy+=dy 89. yya.append(yy) 90.ax.plot(xxa,yya,color='g',linestyle='—',marker='') 91. 92.ax.legend() 93.plt.show()
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 实现 曲线拟合 最小二乘法
![提示](https://static.bdocx.com/images/bang_tan.gif)