计算方法实验答案(哈工大)
根据提供的文件信息,我们可以归纳出以下相关知识点: ### 一、拉格朗日插值法 **定义**:拉格朗日插值是一种多项式插值的方法,它可以通过已知的一些离散数据点来构建一个多项式函数,使得这个多项式在这些数据点上的取值与实际的数据值相等。 **公式**: 对于一组已知的数据点 \((x_0, y_0), (x_1, y_1), \ldots, (x_n, y_n)\),拉格朗日插值多项式 \(L(x)\) 可以表示为: \[ L(x) = \sum_{i=0}^{n} y_i l_i(x) \] 其中,\(l_i(x)\) 是第 \(i\) 个基函数,定义为: \[ l_i(x) = \prod_{j=0, j\neq i}^{n} \frac{x - x_j}{x_i - x_j} \] **代码实现**: ```c #include<stdio.h> #include<conio.h> #include<alloc.h> float lagrange(float *x, float *y, float xx, int n) { int i, j; float *a, yy = 0.0; a = (float*) malloc(n * sizeof(float)); for (i = 0; i <= n - 1; i++) { a[i] = y[i]; for (j = 0; j <= n - 1; j++) if (j != i) a[i] *= (xx - x[j]) / (x[i] - x[j]); yy += a[i]; } free(a); return yy; } int main() { int i, n; float x[20], y[20], xx, yy; printf("Input n:"); scanf("%d", &n); if (n >= 20) { printf("Error! The value of n must in (0,20)."); getch(); return 1; } if (n <= 0) { printf("Error! The value of n must in (0,20)."); getch(); return 1; } for (i = 0; i <= n - 1; i++) { printf("x[%d]:", i); scanf("%f", &x[i]); } printf("\n"); for (i = 0; i <= n - 1; i++) { printf("y[%d]:", i); scanf("%f", &y[i]); } printf("\n"); printf("Input xx:"); scanf("%f", &xx); yy = lagrange(x, y, xx, n); printf("x=%f, y=%f\n", xx, yy); getch(); } ``` ### 二、牛顿插值法 **定义**:牛顿插值法也是一种多项式插值的方法,它通过构建一个分段线性的插值多项式来逼近给定的数据点。 **公式**: 牛顿插值多项式可以表示为: \[ P_n(x) = [y_0] + [y_0, y_1](x - x_0) + \cdots + [y_0, y_1, \ldots, y_n](x - x_0)(x - x_1)\cdots(x - x_{n-1}) \] 其中,\([y_0, y_1, \ldots, y_k]\) 表示 \(k\) 阶差商。 **代码实现**: ```c #include<stdio.h> #include<conio.h> #include<alloc.h> void difference(float *x, float *y, int n) { float *f; int k, i; f = (float*) malloc(n * sizeof(float)); for (k = 1; k <= n; k++) { f[0] = y[k]; for (i = 0; i < k; i++) f[i + 1] = (f[i] - y[i]) / (x[k] - x[i]); y[k] = f[k]; } return; } int main() { int i, n; float x[20], y[20], xx, yy; printf("Input n:"); scanf("%d", &n); if (n >= 20) { printf("Error! The value of n must in (0,20)."); getch(); return 1; } if (n <= 0) { printf("Error! The value of n must in (0,20)."); getch(); return 1; } for (i = 0; i <= n - 1; i++) { printf("x[%d]:", i); scanf("%f", &x[i]); } printf("\n"); for (i = 0; i <= n - 1; i++) { printf("y[%d]:", i); scanf("%f", &y[i]); } printf("\n"); difference(x, (float*) y, n); printf("Input xx:"); scanf("%f", &xx); yy = y[20]; for (i = n - 1; i >= 0; i--) yy = yy * (xx - x[i]) + y[i]; printf("Newton Inter(%f)=%f", xx, yy); getch(); } ``` ### 三、高斯列主元消元法 **定义**:高斯列主元消元法是一种用于求解线性方程组的方法,它的基本思想是在每次消元前选择绝对值最大的元素作为主元,从而减少误差的影响。 **步骤**: 1. **寻找主元**:在每一行操作之前,从当前行及下方的所有行中找到绝对值最大的元素作为主元。 2. **行交换**:如果主元不在当前行,则通过行交换将主元移到当前位置。 3. **消元**:利用主元进行消元操作,使下方所有元素变为0。 4. **回代**:从最后一行开始,逐行回代求解未知数。 **代码实现**(未完成,根据给出的代码片段推测): ```c #include<stdio.h> #include<math.h> #define N 20 int main() { int n, i, j, k; int mi, tmp, mx; float a[N][N], b[N], x[N]; printf("\nInput n:"); scanf("%d", &n); if (n > N) { printf("The input n should in (0,N)!\n"); getch(); return 1; } if (n <= 0) { printf("The input n should in (0,N)!\n"); getch(); return 1; } printf("Now input a(i,j), i,j=0%d:\n", n - 1); for (i = 0; i < n; i++) { for (j = 0; j < n; j++) scanf("%f", &a[i][j]); } printf("Now input b(i), i,j=0%d:\n", n - 1); for (i = 0; i < n; i++) scanf("%f", &b[i]); // 接下来应该是高斯列主元消元法的具体实现代码 } ``` 以上是基于给定文件中的标题、描述以及部分代码实现,对拉格朗日插值法、牛顿插值法和高斯列主元消元法的相关知识点进行了详细的说明。
#include <stdio.h>
#include <conio.h>
#include <alloc.h>
float lagrange(float *x,float *y,float xx,int n) /*拉格朗日插值算法*/
{ int i,j;
float *a,yy=0.0; /*a作为临时变量,记录拉格朗日插值多项式*/
a=(float *)malloc(n*sizeof(float));
for(i=0;i<=n-1;i++)
{ a[i]=y[i];
for(j=0;j<=n-1;j++)
if(j!=i) a[i]*=(xx-x[j])/(x[i]-x[j]);
yy+=a[i];
}
free(a);
return yy;
}
main()
{ int i,n;
float x[20],y[20],xx,yy;
printf("Input n:");
scanf("%d",&n);
if(n>=20) {printf("Error!The value of n must in (0,20)."); getch();return 1;}
if(n<=0) {printf("Error! The value of n must in (0,20)."); getch(); return 1;}
for(i=0;i<=n-1;i++)
{ printf("x[%d]:",i);
scanf("%f",&x[i]);
}
printf("\n");
for(i=0;i<=n-1;i++)
printf("\n");
printf("Input xx:");
scanf("%f",&xx);
yy=lagrange(x,y,xx,n);
printf("x=%f,y=%f\n",xx,yy);
getch();
}
2.牛顿插值多项式,用于离散数据的拟合
#include <stdio.h>
#include <conio.h>
#include <alloc.h>
void difference(float *x,float *y,int n)
{ float *f;
int k,i;
f=(float *)malloc(n*sizeof(float));
for(k=1;k<=n;k++)
{ f[0]=y[k];
for(i=0;i<k;i++)
f[i+1]=(f[i]-y[i])/(x[k]-x[i]);
y[k]=f[k];
}
return;
}
main()
{ int i,n;
剩余11页未读,继续阅读
- 粉丝: 0
- 资源: 1
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
- 1
- 2
前往页