最小二乘法 C++
- 格式:docx
- 大小:58.43 KB
- 文档页数:5
实验二 最小二乘法
【实验内容】
1. 掌握最小二乘法的基本思路和解题步骤。
2. 并能够利用最小二乘法求m 次最小二乘逼近多项式。
3. 在课后习题中选择一个利用最小二乘法求一次逼近多项式的题编程计算。
交回实验报告与计算结果
【实验方法或步骤】
1. 理解题意,分析清楚题目用到哪些知识:最小二乘法法,即对所给数据用最小二乘法进行曲线拟和,再对所求的拟合函数进行积分计算。
2. 最小二乘法的基本思路
已知数据对()(),1,2,,j j x y j n = ,求多项式
0()()m
i
i i p x a x m n ==<∑
使得2
2
01010(,,,)n
n
m j n i j i i i i j a a a R a x y ϕ===⎛⎫==- ⎪⎝⎭
∑∑∑ 为最小,这就是最小二
乘问题。
3. 最小二乘法算法描述:
以线性函数()p x a bx =+为例,拟合给定数据(),,1,2,,i i x y i m = 。
步骤1:输入m 值,及(),,1,2,,i i x y i m = ; 步骤2:建立正规方程组
02111
21
m i i i m i i i i
i
m
m
m m m i i i i i a y x
x a x y x x
x
a x y x x x -+⎡⎤⎡⎤⎡⎤⎢
⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥=⎢⎥⎢⎥
⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎣⎦⎣⎦
⎣
⎦
∑∑∑∑∑∑∑∑∑∑∑∑
步骤3:解法方程组,求出系数i a ;
步骤4:输出()
=+。
p x a bx
[实验程序] (自编程序 .cpp文件)
#include<stdio.h>
#include<malloc.h>
double f(double a, int b)
{
inti;
double k = 1;
for (i=0; i<b; i++)
k *= a;
return k;
}
int main(void)
{
inti, j, n, m;
double a[2][2], d[2]={0}, e[2], t;
printf("请输入Xi和Yi的个数:\n");
scanf("%d", &n);
double *b = (double *) malloc(sizeof(double)*n);
double *c = (double *) malloc(sizeof(double)*n); printf("请输入Xi:\n");
for (i=0; i<n; i++)
scanf("%lf", &b[i]);
printf("请输入Yi:\n");
for (j=0; j<n; j++)
scanf("%lf", &c[j]);
for (i=0; i<2; i++)
{
for (j=0; j<2; j++)
{
a[i][j] = 0;
for (m=0; m<n; m++)
a[i][j] += f(b[m],i*2+j);
}
}
a[1][1] = a[1][0];
a[1][0] = a[0][1];
for (i=0; i<n; i++)
{
d[0] += c[i];
d[1] += b[i]*c[i];
}
for(i=0; i<2; ++i)
{
t = a[0][i]; a[0][i] = a[1][i]; a[1][i] = t;
}
t = d[0]; d[0] = d[1]; d[1] = t;
a[1][1] -= a[0][1]*a[1][0]/a[0][0];
d[1] -= d[0]*a[1][0]/a[0][0];
a[1][0] = 0;
if(a[1][1] == 0 && d[1] !=0)
printf("无解。
");
else
{
e[1] = d[1]/a[1][1];
e[0] = (d[0] - e[1]*a[0][1])/a[0][0];
printf("方程的系数为:\n");
for (j=0; j<2; j++)
printf("A%d = %10.6lf\n",j+1, e[j]);
printf("方程为:\n");
printf("P(x) = %10.6lf + %10.6lfx\n", e[0], e[1]);
}
free(b);
free(c);
return 0;
}
【实验结果】。