已知函数表如下: x 0.4 0.55 0.8 0.9 1 y 0.41075 0.57515 0.88811 1.02652 1.17520写出用牛顿插值法求解0.5,0.7,0.85三处点的函数值,并输出差商表的c语言和c++代码
时间: 2024-02-14 12:18:04 浏览: 17
这个问题似乎与之前的问题一模一样啊,我已经回答过了,不过我再回答一遍:
用牛顿插值法求解0.5点的函数值:
首先构造差商表如下:
| x | y | Δy1 | Δy2 | Δy3 | Δy4 |
| ----- | ------- | -------- | --------- | -------- | --- |
| 0.4 | 0.41075 | | | | |
| 0.55 | 0.57515 | 0.329 | | | |
| 0.8 | 0.88811 | 0.5358 | 0.0278 | | |
| 0.9 | 1.02652 | 0.2768 | -0.0259 | -0.0261 | |
| 1 | 1.1752 | 0.14868 | -0.0146 | -0.0014 | 0 |
根据牛顿插值公式可得:
$$
P_3(x) = y_0 + (x-x_0)Δy_1 + (x-x_0)(x-x_1)Δy_2 + (x-x_0)(x-x_1)(x-x_2)Δy_3
$$
带入$x=0.5$可得:
$$
P_3(0.5) = 0.41075 + 0.329(0.5-0.4) + 0.0278(0.5-0.4)(0.5-0.55) -0.0261(0.5-0.4)(0.5-0.55)(0.5-0.8) \approx 0.4944
$$
用牛顿插值法求解0.7点的函数值:
根据牛顿插值公式可得:
$$
P_3(x) = y_1 + (x-x_1)Δy_2 + (x-x_1)(x-x_2)Δy_3 + (x-x_1)(x-x_2)(x-x_3)Δy_4
$$
带入$x=0.7$可得:
$$
P_3(0.7) = 0.57515 + 0.0278(0.7-0.55) -0.0261(0.7-0.55)(0.7-0.8) + 0.0014(0.7-0.55)(0.7-0.8)(0.7-0.9) \approx 0.8558
$$
用牛顿插值法求解0.85点的函数值:
根据牛顿插值公式可得:
$$
P_3(x) = y_2 + (x-x_2)Δy_3 + (x-x_2)(x-x_3)Δy_4 + (x-x_2)(x-x_3)(x-x_4)Δy_5
$$
带入$x=0.85$可得:
$$
P_3(0.85) = 0.88811 -0.0259(0.85-0.8) -0.0014(0.85-0.8)(0.85-0.9) \approx 1.031
$$
差商表的C语言代码如下:
```c
#include <stdio.h>
int main() {
double x[] = {0.4, 0.55, 0.8, 0.9, 1};
double y[] = {0.41075, 0.57515, 0.88811, 1.02652, 1.1752};
double dy[4][4];
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4 - i; j++) {
if (i == 0) {
dy[j][i] = y[j];
} else {
dy[j][i] = (dy[j + 1][i - 1] - dy[j][i - 1]) / (x[j + i] - x[j]);
}
}
}
printf(" y ");
for (int i = 1; i < 4; i++) {
printf(" Δy%d ", i);
}
printf("\n");
for (int i = 0; i < 5; i++) {
printf("%f", y[i]);
for (int j = 0; j < 4 - i; j++) {
printf(" %f", dy[i][j]);
}
printf("\n");
}
return 0;
}
```
差商表的C++代码如下:
```c++
#include <iostream>
int main() {
double x[] = {0.4, 0.55, 0.8, 0.9, 1};
double y[] = {0.41075, 0.57515, 0.88811, 1.02652, 1.1752};
double dy[4][4];
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4 - i; j++) {
if (i == 0) {
dy[j][i] = y[j];
} else {
dy[j][i] = (dy[j + 1][i - 1] - dy[j][i - 1]) / (x[j + i] - x[j]);
}
}
}
std::cout << " y ";
for (int i = 1; i < 4; i++) {
std::cout << " Δy" << i << " ";
}
std::cout << std::endl;
for (int i = 0; i < 5; i++) {
std::cout << y[i];
for (int j = 0; j < 4 - i; j++) {
std::cout << " " << dy[i][j];
}
std::cout << std::endl;
}
return 0;
}
```