实验三 .最小二乘法C语言的实现
1.实验目的:
进一步熟悉曲线拟合的最小二乘法。
掌握编程语言字符处理程序的设计和调试技术。
2.实验要求:
输入:已知点的数目以及各点坐标 。
输出:根据最小二乘法原理以及各点坐标求出拟合曲线 。
3.程序流程:
(1)输入已知点的个数;
(2)分别输入已知点的X坐标;
(3)分别输入已知点的Y坐标;
(4)通过调用函数,求出拟合曲线。
最小二乘法原理如下:
根据一组给定的实验数据,求出自变量x与因变量y的函数关系,只要求在给定点上的误差的平方和最小.当时,即 (4.4.1)这里是线性无关的函数族,假定在上给出一组数据,以及对应的一组权,这里为权系数,要求使最小,其中 (4.4.2)
(4.4.2)中实际上是关于的多元函数,求I的最小值就是求多元函数I的极值,由极值必要条件,可得 (4.4.3)根据内积定义引入相应带权内积记号 (4.4.4)则(4.4.3)可改写为
这是关于参数的线性方程组,用矩阵表示为 (4.4.5)(4.4.5)称为法方程.当线性无关,且在点集上至多只有n个不同零点,则称在X上满足Haar条件,此时(4.4.5)的解存在唯一。记(4.4.5)的解为 从而得到最小二乘拟合曲线 (4.4.6)可以证明对,有 故(4.4.6)得到的即为所求的最小二乘解.它的平方误差为 (4.4.7)均方误差为 在最小二乘逼近中,若取,则,表示为 (4.4.8)此时关于系数的法方程(4.4.5)是病态方程,通常当n≥3时都不直接取作为基。?
程序流程图:
开始
开始
↓
输入已知点个数n
输入已知点个数n
输入已知点的X坐标 ↓
输入已知点的X坐标
输入已知点的Y坐标↓
输入已知点的Y坐标
输出结果↓
输出结果
程序:
#include
#include
#include
#include
float average(int n,float *x)
{int i;
float av;
av=0;
for(i=0;i
av+=*(x+i);
av=av/n;
return(av);
}
//平方和
float spfh(int n,float *x)
{int i;
float a,b;
a=0;
for(i=0;i
a+=(*(x+i))*(*(x+i));
return(a);
}
//和平方
float shpf(int n,float *x)
{int i;
float a,b;
a=0;
for(i=0;i
a=a+*(x+i);
b=a*a/n;
return(b);
}
//两数先相乘,再相加
float dcj(int n,float *x,float *y)
{int i;
float a;
a=0;
for(i=0;i
a+=(*(x+i))*(*(y+i));
return(a);
}
//两数先相加,再相乘
float djc(int n,float *x,float *y)
{int i;
float a=0,b=0;
for(i=0;i
{a=a+*(x+i);
b=b+*(y+i);
}
a=a*b/n;
return(a);
}
//系数a
float xsa(int n,float *x,float *y)
{float a,b,c,d,e;
a=spfh(n,x);
b=shpf(n,x);
c=dcj(n,x,y);
d=djc(n,x,y);
e=(c-d)/(a-b);
//printf("%f %f %f %f