求最小二乘曲线的拟合的C语言程序

Python016

求最小二乘曲线的拟合的C语言程序,第1张

曲线拟合的最小二乘法

如有实验数据如下

求x=55处的近似值 并画出图形

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

#include "stdio.h"

#include "graphics.h"

double s(double x[],double y[],double x1)

{

double a,b,tmp1=0,tmp2=0,tmp3=0,tmp4=0,result

int i=0

for(i<10i++)

{

tmp1+=x[i]*x[i]

tmp2+=y[i]

tmp3+=x[i]

tmp4+=x[i]*y[i]

}

b=(tmp1*tmp2-tmp3*tmp4)/(10*tmp1-tmp3*tmp3)

a=(10*tmp4-tmp2*tmp3)/(10*tmp1-tmp3*tmp3)

result=a*x1+b

return result

}

void hzbz(int x,int y)

{

int i,j

line(0,y,1024,y)

moveto(x-200,y)

j=x-200

for(i=0i<100i++)

{

if(i%5!=0)

lineto(j,y-5)

else

lineto(j,y-8)

j=j+10

moveto(j,y)

}

line(x,768,x,0)

moveto(x,y+200)

j=y+640

for(i=0i<300i++)

{

if(i%5!=0)

lineto(x+5,j)

else

lineto(x+8,j)

j=j-10

moveto(x,j)

}

line(x,0,x-8,6)

line(x,0,x+8,6)

line(640,y,634,y-8)

line(640,y,634,y+8)

}

void main()

{

double x[]={0,10,20,30,40,50,60,70,80,90}

double y[]={68,67.1,66.4,65.6,64.6,61.8,61.0,60.8,60.4,60}

int graphdriver=DETECT,graphmode

int i

printf("x=55\ny=%lf\n",s(x,y,55))

getch()

initgraph(&graphdriver,&graphmode, "")

setbkcolor(BLUE)

hzbz(200,200)

moveto(200,200)

for(i=0i<200i++)

lineto(i+200,-s(x,y,i)+200)

getch()

closegraph()

}

对于曲线拟合函数ψ(x),不要求其严格的通过所有数据点,也就是说拟合函数ψ(x)在xi处的偏差(亦称残差)不都严格的等于零,即为矛盾方程组:为了是近似曲线能尽量反映所给数据点的变化趋势,要求偏差按照某种度量标准最小。这后面的分析用到了范数的概念。这种方法就叫做曲线拟合的最小二乘法。

我们新建并打开一个excel表格,在excel中输入或打开要进行最小二乘法拟合的数据。此时按住“shift”键,同时用鼠标左键单击以选择数据。单击菜单栏上的“插入”-“图表”-“散点图”图标。

此时,我们选择第一个“仅带数据标记的散点图”图标,随后我们可以在窗口中间弹出散点图窗口。鼠标左键单击上边的散点,单击鼠标右键,弹出列表式对话框,再单击“添加趋势线(R)”。右侧就会弹出“设置趋势线格式”对话框。

利用最小二乘法将上面数据所标示的曲线拟合为二次曲线,使用c语言编程求解函数系数;最小二乘法原理 原理不再赘述,主要是解法采用偏微分求出来的。