如有实验数据如下
求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语言编程求解函数系数;最小二乘法原理 原理不再赘述,主要是解法采用偏微分求出来的。