#include <stdio.h>
#include <stdlib.h>
int length = 0;
void newton(double* x, double* y, double* f, int n) {
int i = 0, j, k = 0;
for (i = 0; i < n; i++)
for (j = 0; j < n - i; j++) {
if (i == 0)
f[k++] = (y[j + 1] - y[j]) / (x[j + 1] - x[j]);
else {
f[k] = (f[k + i - n] - f[k + i - n - 1]) / (x[j + i + 1] - x[j]);
k++;
}
}
}
void print(double* x, double* y, double* f, int n) {
int i, j, k = 0;
printf("差商表:\n");
printf("\n");
for (i = 0; i < n; i++)
printf("-------------------");
printf("\n");
for (i = 0; i < n; i++) {
printf("%-10f\t%-10f\t", x[i], y[i]);
k = i - 1;
for (j = 0; j < i; j++) {
printf("%-10f\t", f[k]);
k += n - 2 - j;
}
if (j == i)
printf("\n");
}
for (i = 0; i < n; i++)
printf("-------------------");
printf("\n");
for (i = 0; i < n; i++) {
if (i == 0)
printf("%f", y[i]);
else {
k = i - 1;
for (j = 0; j < i - 1; j++) {
//printf("%-10f\t", f[k]);
k += n - 2 - j;
}
if (f[k] >= 0)
printf("+");
printf("%f*", f[k]);
for (j = 0; j < i - 1; j++)
printf("(x-%f)*", x[j]);
printf("(x-%f)", x[i - 1]);
}
}
printf("\n");
}
void getvalue(double* x, double* y, double* f, int n)
{
double a, * b;
int i, k = 0;
b = (double*)malloc(2 * sizeof(double) * n);
printf("输入x坐标:\n");
scanf("%lf", &a);
printf("%lf对应的函数值为:", a);
b[0] = 1.0;
for (i = 0; i < n - 1; i++)
b[i + 1] = b[i] * (a - x[i]);
for (i = 0; i < n; i++) {
if (i == 0)
a = y[0];
else {
a += b[i] * f[k];
k += n - i;
}
}
printf("%f\n", a);
}
void addnode(double* x, double* y, double* f, int n) {
printf("输入插入节点的x和f(x)值:\n");
scanf("%lf%lf", &x[length], &y[length]);
newton(x, y, f, length);
length++;
print(x, y, f, length);
}
int main(void)
{
int n;
double* x, * y, * f;
printf("请输入插值点的个数n: ");
scanf("%d", &n);
length = n;
x = (double*)malloc(2 * sizeof(double) * n);
y = (double*)malloc(2 * sizeof(double) * n);
f = (double*)malloc(sizeof(double) * (n - 1));
int i = 0;
while (i < n) {
printf("请输入第%d个点的x值: ", i + 1);
scanf("%lf", &x[i]);
printf("请输入第%d个点的f(x)值: ", i + 1);
scanf("%lf", &y[i]);
i++;
}
newton(x, y, f, n - 1);
print(x, y, f, n);
printf("输入1表示求函数值,输入2表示增加节点:\n");
do {
int choice;
scanf("%d", &choice);
if (choice == 1)
getvalue(x, y, f, length);
else
addnode(x, y, f, length);
} while (1);
return 0;
}
牛顿法解决插值问题
最新推荐文章于 2024-05-20 20:08:58 发布