最小二乘法实验c语言实现,最小二乘法拟合C语言实现

拟合直线

#include

#include

#include

#include

float average(int n,float *x)

{int i; float av; av=0; for(i=0;i

av=av/n; return(av); } //平方和 float spfh(int n,float *x)

{int i; float a; 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

} //两数先相乘,再相加

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",a,b,c,d);

return(e); } float he(int n,float *y)

{int i; float a;

a=0; for(i=0;i

return(a); }

float xsb(int n,float *x,float *y,float a)

{ float b,c,d;

b=he(n,y); c=he(n,x); d=(b-a*c)/n; return(d);

} void main()

{ int n,i; float *x,*y,a,b;

printf("请输入将要输入的有效数值组数n的值");

scanf("%d",&n);

printf("n=%d\n",n);

x=(float*)calloc(n,sizeof(float));

if(x==NULL) {printf("内存分配失败"); exit(1); }

y=(float*)calloc(n,sizeof(float));

if(y==NULL) {printf("内存分配失败"); exit(1);

} printf("请输入x的值");

for(i=0;i

printf("请输入y的值,请注意与x的值一一对应");

for(i=0;i

//x[0]=0.1;x[1]=0.3;x[2]=0.4;x[3]=0.55;x[4]=0.7;x[5]=0.8;x[6]=0.95;

//y[0]=15;y[1]=18;y[2]=19;y[3]=21;y[4]=22.6;y[5]=23.8;y[6]=26; for(i=0;i

{ printf("x[%d]=%5.4f ",i,*(x+i));

printf("y[%d]=%5.4f\n",i,*(y+i));

} a=xsa(n,x,y); b=xsb(n,x,y,a);

printf("经最小二乘法拟合得到的一元线性方程为:\n");

printf("f(x)=%5.4fx+%5.4f\n",a,b);

}

最小二乘法是一种数学优化技术,常用于拟合数据点,使得实际值与预测值之间的误差平方和达到最小。在C语言中,你可以通过迭代或者使用一些线性代数库(如BLAS或LAPACK)来实现。这里是一个简单的线性方程组解的例子,假设我们有线性模型 y = A * x + b,其中A是矩阵,x是未知向量,y是已知向量,我们想要找到最小误差的x。 ```c #include <stdio.h> #include <stdlib.h> // 矩阵乘法函数 void matrix_multiply(int a_rows, int a_cols, double* a, int b_cols, double* b, double* result) { for (int i = 0; i < a_rows; ++i) { for (int j = 0; j < b_cols; ++j) { result[i * b_cols + j] = 0.0; for (int k = 0; k < a_cols; ++k) result[i * b_cols + j] += a[i * a_cols + k] * b[k * b_cols + j]; } } } // 最小二乘法 double* least_squares(double** a, int m, double* b, int n) { // 初始化A'A double det = 0.0; double** AtA = malloc(sizeof(double*) * n); for (int i = 0; i < n; ++i) { AtA[i] = malloc(sizeof(double) * n); det += pow(a[i], 2); // 假设第一个行是单位向量 } // 计算系数 for (int i = 1; i < m; ++i) { for (int j = 0; j < n; ++j) { double sum = 0.0; for (int k = 0; k < n; ++k) sum += a[i][k] * AtA[j][k]; AtA[j][n - 1] += a[i][n - 1] * sum; for (int k = 0; k < n; ++k) AtA[j][k] -= a[i][n - 1] * a[i][k]; } det += pow(a[i][n - 1], 2); } // 计算系数除以det double* x = malloc(sizeof(double) * n); for (int i = 0; i < n; ++i) { double invDet = 1 / det; x[i] = (AtA[i][n - 1] * invDet); for (int j = 0; j < n; ++j) x[i] -= a[i][j] * x[j] * invDet; } return x; } int main() { // 假设输入数据和矩阵尺寸 int m = 4, n = 3; double a[][] = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9}, {1, 0, 1} }; double b[] = {1, 2, 3, 4}; // 解决最小二乘问题并打印结果 double* x = least_squares((double**)a, m, b, n); printf("最小二乘解: "); for (int i = 0; i < n; ++i) printf("%f ", x[i]); free(x); return 0; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值