拉格朗日(Lagrange)插值
方法概要
待求问题
1.拉格朗日插值多项式的次数n越大越好吗?
2.插值区间越小越好吗?
3.内插比外推更可靠吗?
程序流程
程序代码
/*Matlab函数
function Result = Lagrange(n, x_in, a, b, f)
h = (b-a)/n;
M = zeros(n+1, 2);
i = 0;
while i <= n
xi = a+i*h;
yi = subs(f, symvar(f), xi);
M(i+1, 1) = xi;
M(i+1, 2) = yi;
i = i+1;
end
y = 0.0;
k = 1;
while k <= n+1
l = 1.0;
for j = 1:k-1
l = l*(x_in - M(j, 1))/(M(k, 1) - M(j, 1));
end
for j = k+1:n+1
l = l*(x_in - M(j, 1))/(M(k, 1) - M(j, 1));
end
y = y + l*M(k, 2);
k = k+1;
end
Result = [x_in, y];
end*/
/*C语言程序
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define N1 3 // n amount
#define N2 4 // x amount
#define N3 20 // n max
int Ns[N1] = {5, 10, 20};
double x[N2] = {-0.95, -0.05, 0.05, 0.95};
double l = -1.0;
double r = 1.0;
double X(int k, int n) {
double h = (r - l) / n;
return l + k * h;
}
double Y(double x) { return 1 / (1 + x * x); }
int main() {
for (int i = 0; i < N2; i++) printf("\tx=%.2lf", x[i]);
printf("\n");
for (int i = 0; i < N1; i++) {
double a[N3 + 1], b[N3 + 1];
int n = Ns[i];
for (int k = 0; k <= n; k++) {
a[k] = X(k, n); // x
b[k] = Y(a[k]); // y
}
printf("n=%d", n);
for (int p = 0; p < N2; p++) {
double y = 0.0;
for (int k = 0; k <= n; k++) {
double l = 1.0;
for (int j = 0; j <= n; j++) {
if (j != k) l *= (x[p] - a[j]) / (a[k] - a[j]);
}
y += l * b[k];
}
printf("\t%.6lf", y);
}
printf("\n");
}
printf("Actual");
for (int p = 0; p < N2; p++) printf("\t%.6lf", Y(x[p]));
return 0;
}*/
运行结果
牛顿(Newton)迭代法,原文链接:
https://blog.csdn.net/KissMoon_/article/details/116277622
高斯(Gauss)列主元消去法,原文链接:
https://blog.csdn.net/KissMoon_/article/details/116278197
四阶龙格-库塔(Runge-Kutta)方法,原文链接:
https://blog.csdn.net/KissMoon_/article/details/116278567
Newton/Gauss/Lagrange/Runge-Kutta实验内容+方法指导+Matlab脚本+Matlab函数+Matlab运行报告+C程序+实验报告,一键下载:
https://download.csdn.net/download/KissMoon_/18244419