论坛元老
 
- 积分
- 10653
- 金钱
- 10653
- 注册时间
- 2017-4-14
- 在线时间
- 2780 小时
|
发表于 2020-6-10 09:26:09
|
显示全部楼层
本帖最后由 nashui_sx 于 2020-6-10 09:27 编辑
- /*
- 本实验根据数组x[], y[]列出的一组数据,用最小二乘法求它的拟合曲线。
- P(x) = 0.000034x^3-0.005216x^2+0.263399x^1+0.017839x
- matlab:
- clc
- clear all
- close all
- format long
- x=[0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55];
- y=[0, 1.27, 2.16, 2.86, 3.44, 3.87, 4.15, 4.37, 4.51, 4.58, 4.02, 4.64];
- p=polyfit(x,y,3)
- x1=min(x):0.1:max(x);
- y1=polyval(p,x1);
- plot(x,y,'*r',x1,y1,'-b')
- %0.000034364154364 -0.005215562215562 0.263398527398528 0.017838827838825
- */
- #include <stdio.h>
- #include <math.h>
- #define max_num 12//数据个数
- #define rank_nun 3//几次拟合
- void lsqe(double *x,double *y,int num,double *b)
- {
- double atemp[2 * (rank_nun + 1)] = {0}, a[rank_nun + 1][rank_nun + 1];
- int i, j, k,n;
- for(i = 0; i < num; i++)
- {
- atemp[1] += x[i];
- atemp[2] += pow(x[i], 2);
- atemp[3] += pow(x[i], 3);
- atemp[4] += pow(x[i], 4);
- atemp[5] += pow(x[i], 5);
- atemp[6] += pow(x[i], 6);
- b[0] += y[i];
- b[1] += x[i] * y[i];
- b[2] += pow(x[i], 2) * y[i];
- b[3] += pow(x[i], 3) * y[i];
-
- if(rank_nun==1)
- {
- b[2]=0;
- b[3]=0;
- }
- if(rank_nun==2)
- {
- b[3]=0;
- }
- }
- atemp[0] = num;
- for(i = 0; i < rank_nun + 1; i++)//构建线性方程组系数矩阵,b[]不变
- {
- k = i;
- for(j = 0; j < rank_nun + 1; j++) a[i][j] = atemp[k++];
- }
- //以下为高斯列主元消去法解线性方程组
- for(k = 0; k < rank_nun + 1 - 1; k++)//n - 1列
- {
- int column = k;
- double mainelement = a[k][k];
- for(i = k; i < rank_nun + 1; i++)//找主元素
- {
- if(fabs(a[i][k]) > mainelement)
- {
- mainelement = fabs(a[i][k]);
- column = i;
- }
- }
- for(j = k; j < rank_nun + 1; j++)//交换两行
- {
- double atemp = a[k][j];
- a[k][j] = a[column][j];
- a[column][j] = atemp;
- }
- double btemp = b[k];
- b[k] = b[column];
- b[column] = btemp;
- for(i = k + 1; i < rank_nun + 1; i++) //消元过程
- {
- double Mik = a[i][k] / a[k][k];
- for(j = k; j < rank_nun + 1; j++) a[i][j] -= Mik * a[k][j];
- b[i] -= Mik * b[k];
- }
- }
- b[rank_nun + 1 - 1] /= a[rank_nun + 1 - 1][rank_nun + 1 - 1]; //回代过程
- for(i = rank_nun + 1 - 2; i >= 0; i--)
- {
- double sum = 0;
- for(j = i + 1; j < rank_nun + 1; j++) sum += a[i][j] * b[j];
- b[i] = (b[i] - sum) / a[i][i];
- }
- }
- int main(){
- double x[max_num] = {0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55};
- double y[max_num] = {0, 1.27, 2.16, 2.86, 3.44, 3.87, 4.15, 4.37, 4.51, 4.58, 4.02, 4.64};
-
- double b[rank_nun + 1] = {0};
-
- //高斯列主元消去法结束
- lsqe(x,y,max_num,b);
- printf("P(x) = %fx^3%+fx^2%+fx^1%+fx\n\n", b[3], b[2], b[1], b[0]);
- return 0;
- }
复制代码 |
|