拉格朗日插值法代码解析:生成曲线并返回插值结果
该函数使用拉格朗日插值法生成一条曲线,从一组已知的数据点 (x0, y0) 中插值出经过这些点的曲线,并返回在给定的一组点 x 处的插值结果 y。
function y = lagrange(x0, y0, x)
m = length(x);
n = length(x0);
for i = 1:m
z = x(i);
s = 0;
for k = 1:n
p = 1.0;
for j = 1:n
if j ~= k
p = p * (z - x0(j)) / (x0(k) - x0(j));
end
end
s = p * y0(k) + s;
end
y(i) = s;
end
end
代码逐行解释:
-
function y = lagrange(x0, y0, x): 定义一个名为lagrange的函数,输入参数为x0(已知数据点 x 的向量),y0(已知数据点 y 的向量),x(要进行插值的点的向量),输出结果为y。 -
m = length(x);: 获取已知数据点的 x 的长度,即有多少个已知数据点。 -
n = length(x0);: 获取已知数据点的 y 的长度,即有多少个已知数据点。 -
for i = 1:m: 循环遍历每个要进行插值的点x(i)。 -
z = x(i);: 将当前要插值的点x(i)存储在z中。 -
s = 0;: 初始化s为 0,s用于累加每个拉格朗日基函数的值。 -
for k = 1:n: 循环遍历每个已知数据点x0(k)。 -
p = 1.0;: 初始化p为 1.0,p代表当前拉格朗日基函数的值。 -
for j = 1:n: 循环遍历所有已知数据点x0(j),计算拉格朗日基函数p。 -
if j ~= k: 判断j是否等于k,如果j不等于k,则计算拉格朗日基函数的值。 -
p = p * (z - x0(j)) / (x0(k) - x0(j));: 更新拉格朗日基函数的值p。 -
s = p * y0(k) + s;: 将当前拉格朗日基函数的值p乘以对应的y0(k),并将结果累加到s中。 -
y(i) = s;: 将最终的插值结果s存储在y(i)中。 -
clear; clc; clf;: 清除命令行窗口,关闭所有图形窗口。 -
x0 = [-1:0.02:1];: 定义已知数据点的 x 坐标范围为 -1 到 1,间隔为 0.02。 -
y0 = 1./(1+25*x0.^2);: 根据已知的 x 坐标计算对应的 y 坐标。 -
plot(x0, y0, 'b'): 绘制原曲线。 -
hold on: 保持当前图形窗口,以便在同一窗口绘制其他曲线。 -
x1 = linspace(-1, 1, 11);: 定义要进行插值的 x 坐标范围为 -1 到 1,共有 11 个点。 -
y1 = 1./(1+25*x1.^2);: 计算对应于插值点的 y 坐标。 -
y0 = lagrange(x1, y1, x0);: 使用lagrange函数进行插值,生成插值曲线。 -
plot(x0, y0, '--r'): 绘制插值曲线,使用红色虚线。 -
x1 = linspace(-1, 1, 21);: 定义要进行插值的 x 坐标范围为 -1 到 1,共有 21 个点。 -
y1 = 1./(1+25*x1.^2);: 计算对应于插值点的 y 坐标。 -
y0 = lagrange(x1, y1, x0);: 使用lagrange函数进行插值,生成插值曲线。 -
plot(x0, y0, '--g'): 绘制插值曲线,使用绿色虚线。
代码分析:
代码实现了使用拉格朗日插值法从一组已知数据点生成插值曲线的功能。通过循环遍历每个要插值的点和每个已知数据点,计算对应的拉格朗日基函数并累加结果,最终得到该点的插值结果。该代码示例展示了如何使用拉格朗日插值法生成不同数量插值点的曲线,并将其绘制在同一图形窗口中。
拉格朗日插值法的应用:
拉格朗日插值法广泛应用于科学和工程领域,例如:
- 数据拟合: 从一组离散数据点生成连续曲线。
- 函数逼近: 用多项式近似表示一个复杂函数。
- 数值积分: 用插值多项式近似计算积分。
- 数值微分: 用插值多项式近似计算导数。
原文地址: https://www.cveoy.top/t/topic/n1IE 著作权归作者所有。请勿转载和采集!