一维数组非线性移动最小二乘函数 c语言实现 根据一个x求出对应y
时间: 2024-01-22 07:21:24 浏览: 26
要实现一维数组的非线性移动最小二乘函数,需要先定义一个非线性函数(比如多项式函数),然后使用最小二乘法来拟合该函数。最小二乘法的目标是找到一个函数,使得该函数与给定数据点的误差平方和最小。
以下是一个C语言实现的示例代码:
```c
#include <stdio.h>
#include <math.h>
#define N 10 // 数据点个数
#define M 3 // 拟合函数的次数
void polyfit(double x[], double y[], int n, int m, double a[])
{
int i, j, k;
double *p, *q, *r, *s, *t, *u, *v, *w;
double sum, temp;
// 分配内存空间
p = (double*)malloc((m * 2 + 1) * sizeof(double));
q = (double*)malloc((m + 1) * sizeof(double));
r = (double*)malloc((m + 1) * sizeof(double));
s = (double*)malloc((m + 1) * sizeof(double));
t = (double*)malloc((m + 1) * sizeof(double));
u = (double*)malloc((m + 1) * sizeof(double));
v = (double*)malloc((m + 1) * sizeof(double));
w = (double*)malloc((m + 1) * sizeof(double));
// 初始化矩阵
for (i = 0; i <= 2 * m; i++)
{
sum = 0.0;
for (j = 0; j < n; j++)
{
sum += pow(x[j], i);
}
p[i] = sum;
}
// 求解矩阵
for (i = 0; i <= m; i++)
{
sum = 0.0;
for (j = 0; j < n; j++)
{
sum += pow(x[j], i) * y[j];
}
q[i] = sum;
}
for (i = 0; i <= m; i++)
{
for (j = 0; j <= m; j++)
{
r[i * (m + 1) + j] = p[i + j];
}
}
for (i = 0; i <= m; i++)
{
s[i] = q[i];
}
for (i = 0; i <= m; i++)
{
for (j = i; j <= m; j++)
{
temp = r[j * (m + 1) + i] / r[i * (m + 1) + i];
for (k = i; k <= m; k++)
{
r[j * (m + 1) + k] -= temp * r[i * (m + 1) + k];
}
s[j] -= temp * s[i];
}
}
for (i = m; i >= 0; i--)
{
temp = 0.0;
for (j = i + 1; j <= m; j++)
{
temp += r[i * (m + 1) + j] * t[j];
}
t[i] = (s[i] - temp) / r[i * (m + 1) + i];
}
// 将系数存储到数组a中
for (i = 0; i <= m; i++)
{
a[i] = t[i];
}
// 释放内存空间
free(p);
free(q);
free(r);
free(s);
free(t);
free(u);
free(v);
free(w);
}
int main()
{
double x[N] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; // x坐标
double y[N] = {1.2, 1.8, 3.6, 6.5, 10.8, 16.7, 24.2, 33.5, 44.6, 57.5}; // y坐标
double a[M + 1]; // 拟合函数的系数
double xx, yy;
int i;
polyfit(x, y, N, M, a); // 拟合函数
printf("拟合函数为:");
for (i = 0; i <= M; i++)
{
printf("%.4lf*x^%d", a[i], i);
if (i < M)
{
printf(" + ");
}
}
printf("\n");
xx = 7.5; // 要求解的x坐标
yy = 0.0;
for (i = 0; i <= M; i++)
{
yy += a[i] * pow(xx, i);
}
printf("在x=%.2lf处,对应的y值为:%.2lf\n", xx, yy);
return 0;
}
```
在上面的示例代码中,我们使用了一个3次多项式函数来拟合给定的数据点,然后使用该函数来求解在x=7.5处的y值。你可以根据自己的需求修改代码中的数据点个数、拟合函数的次数以及要求解的x值。