写一段最小二乘法的C代码
时间: 2023-10-24 19:05:10 浏览: 29
以下是最小二乘法的C代码:
```
#include <stdio.h>
#include <math.h>
int main()
{
int n = 5; // 样本数据个数
double x[] = {1.0, 2.0, 3.0, 4.0, 5.0}; // 自变量
double y[] = {1.2, 1.8, 3.1, 3.9, 5.1}; // 因变量
double sum_x = 0.0; // 自变量和
double sum_y = 0.0; // 因变量和
double sum_xy = 0.0; // 自变量和因变量的乘积和
double sum_x2 = 0.0; // 自变量的平方和
for (int i = 0; i < n; i++) {
sum_x += x[i];
sum_y += y[i];
sum_xy += x[i] * y[i];
sum_x2 += x[i] * x[i];
}
double b = (n * sum_xy - sum_x * sum_y) / (n * sum_x2 - sum_x * sum_x); // 斜率b
double a = (sum_y - b * sum_x) / n; // 截距a
printf("y = %.2f + %.2f * x\n", a, b);
return 0;
}
```
相关问题
最小二乘法 c语言代码
最小二乘法是一种常用的数学方法,用于拟合数据点到一个函数曲线的最佳拟合线。下面是一个使用C语言实现最小二乘法的简单代码示例:
```c
#include <stdio.h>
// 最小二乘法函数
void leastSquares(int n, double x[], double y[], double *a, double *b) {
double sumX = 0, sumY = 0, sumXY = 0, sumXX = 0;
// 计算各项累加和
for (int i = 0; i < n; i++) {
sumX += x[i];
sumY += y[i];
sumXY += x[i] * y[i];
sumXX += x[i] * x[i];
}
// 计算斜率a和截距b
double denominator = n * sumXX - sumX * sumX;
if (denominator != 0) {
*a = (n * sumXY - sumX * sumY) / denominator;
*b = (sumY - *a * sumX) / n;
}
}
int main() {
// 输入数据点的个数
int n;
printf("请输入数据点的个数:");
scanf("%d", &n);
// 输入数据点的x和y坐标
double x[n], y[n];
printf("请输入数据点的x坐标和y坐标:\n");
for (int i = 0; i < n; i++) {
scanf("%lf %lf", &x[i], &y[i]);
}
// 调用最小二乘法函数计算拟合直线的斜率和截距
double a, b;
leastSquares(n, x, y, &a, &b);
// 输出拟合直线的方程
printf("拟合直线的方程为:y = %.2lfx + %.2lf\n", a, b);
return 0;
}
```
这段代码通过输入数据点的个数和坐标,利用最小二乘法计算出拟合直线的斜率和截距,并输出拟合直线的方程。你可以根据需要进行修改和扩展。
用MATLAB写一段用最小二乘法来拟合直线矩阵中的直线的代码
假设直线的矩阵为 $L$,其中第 $i$ 行表示第 $i$ 条直线的参数 $(a_i,b_i,c_i)$,我们可以使用最小二乘法来对所有直线进行拟合。具体实现如下:
```matlab
% 直线矩阵
L = [1 2 3; 4 5 6; 7 8 9];
% 构造数据点
x = [1 2 3 4 5];
y = [2 3 4 5 6];
% 构造系数矩阵和常数向量
A = [L(:,1) L(:,2)];
b = -L(:,3);
% 使用最小二乘法拟合直线
k = A\b;
a = k(1);
b = k(2);
% 绘制数据点和拟合直线
plot(x, y, 'o');
hold on;
for i = 1:size(L,1)
x1 = 0;
y1 = -L(i,3)/L(i,2);
x2 = 5;
y2 = (-L(i,3)-L(i,1)*x2)/L(i,2);
plot([x1 x2], [y1 y2], '--');
end
plot(x1:x2, a*(x1:x2)+b);
```
其中,我们将直线的一般式 $ax+by+c=0$ 转化为斜截式 $y=-\frac{a}{b}x-\frac{c}{b}$,并使用矩阵求解的方式得到 $\frac{a}{b}$ 和 $\frac{c}{b}$ 的值。最后,我们绘制出数据点、原始直线和拟合直线。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)