(1)用C++编制一个用Lagrang e插值多项式计算经过三个数据点(1,2)、(-1,1)、(2,3)的抛物线的程序(2)用C++编制一个用多项式拟合最小二乘法拟合三个数据点(1,2)、(-1,1)、(2,3)的抛物线
时间: 2023-10-09 13:17:39 浏览: 42
(1) Lagrange插值多项式计算抛物线:
```c
#include<stdio.h>
float lagrange(int n, float x[], float y[], float xp);
int main()
{
float x[3] = {1, -1, 2};
float y[3] = {2, 1, 3};
float xp = 0; // 要计算的x值
float yp; // 对应的y值
printf("请输入要计算的x值:");
scanf("%f", &xp);
yp = lagrange(3, x, y, xp);
printf("对应的y值为:%f", yp);
return 0;
}
float lagrange(int n, float x[], float y[], float xp)
{
float yp = 0;
for(int i = 0; i < n; i++)
{
float L = 1;
for(int j = 0; j < n; j++)
{
if(j != i)
L = L * (xp - x[j]) / (x[i] - x[j]);
}
yp += L * y[i];
}
return yp;
}
```
(2) 多项式拟合最小二乘法拟合抛物线:
```c
#include<stdio.h>
#include<math.h>
#define N 3 // 数据点数量
#define M 3 // 拟合多项式项数
void least_squares(int n, float x[], float y[], float a[], int m);
float poly(int m, float a[], float x);
int main()
{
float x[N] = {1, -1, 2};
float y[N] = {2, 1, 3};
float a[M]; // 多项式系数
least_squares(N, x, y, a, M);
printf("拟合多项式为:y = %fx^2 + %fx + %f", a[2], a[1], a[0]);
return 0;
}
void least_squares(int n, float x[], float y[], float a[], int m)
{
float B[M][M] = {0}; // 系数矩阵
float Y[M] = {0}; // 常数矩阵
for(int i = 0; i < n; i++)
{
float xi = x[i];
float yi = y[i];
float xj = 1;
for(int j = 0; j < m; j++)
{
Y[j] += yi * xj;
xj *= xi;
float xi_pow = xi;
for(int k = j; k < m; k++)
{
B[j][k] += xi_pow;
xi_pow *= xi;
}
}
}
for(int j = 1; j < m; j++)
{
for(int i = 0; i < j; i++)
{
float factor = B[j][i] / B[i][i];
for(int k = i; k < m; k++)
{
B[j][k] -= factor * B[i][k];
}
Y[j] -= factor * Y[i];
}
}
for(int j = m - 1; j >= 0; j--)
{
float s = 0;
for(int k = j + 1; k < m; k++)
{
s += B[j][k] * a[k];
}
a[j] = (Y[j] - s) / B[j][j];
}
}
float poly(int m, float a[], float x)
{
float y = 0;
for(int i = 0; i < m; i++)
{
y += a[i] * pow(x, i);
}
return y;
}
```