该函数使用拉格朗日插值法生成一条曲线,从一组已知的数据点 (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

代码逐行解释:

  1. function y = lagrange(x0, y0, x): 定义一个名为 lagrange 的函数,输入参数为 x0 (已知数据点 x 的向量), y0 (已知数据点 y 的向量), x (要进行插值的点的向量),输出结果为 y

  2. m = length(x);: 获取已知数据点的 x 的长度,即有多少个已知数据点。

  3. n = length(x0);: 获取已知数据点的 y 的长度,即有多少个已知数据点。

  4. for i = 1:m: 循环遍历每个要进行插值的点 x(i)

  5. z = x(i);: 将当前要插值的点 x(i) 存储在 z 中。

  6. s = 0;: 初始化 s 为 0,s 用于累加每个拉格朗日基函数的值。

  7. for k = 1:n: 循环遍历每个已知数据点 x0(k)

  8. p = 1.0;: 初始化 p 为 1.0,p 代表当前拉格朗日基函数的值。

  9. for j = 1:n: 循环遍历所有已知数据点 x0(j),计算拉格朗日基函数 p

  10. if j ~= k: 判断 j 是否等于 k,如果 j 不等于 k,则计算拉格朗日基函数的值。

  11. p = p * (z - x0(j)) / (x0(k) - x0(j));: 更新拉格朗日基函数的值 p

  12. s = p * y0(k) + s;: 将当前拉格朗日基函数的值 p 乘以对应的 y0(k),并将结果累加到 s 中。

  13. y(i) = s;: 将最终的插值结果 s 存储在 y(i) 中。

  14. clear; clc; clf;: 清除命令行窗口,关闭所有图形窗口。

  15. x0 = [-1:0.02:1];: 定义已知数据点的 x 坐标范围为 -1 到 1,间隔为 0.02。

  16. y0 = 1./(1+25*x0.^2);: 根据已知的 x 坐标计算对应的 y 坐标。

  17. plot(x0, y0, 'b'): 绘制原曲线。

  18. hold on: 保持当前图形窗口,以便在同一窗口绘制其他曲线。

  19. x1 = linspace(-1, 1, 11);: 定义要进行插值的 x 坐标范围为 -1 到 1,共有 11 个点。

  20. y1 = 1./(1+25*x1.^2);: 计算对应于插值点的 y 坐标。

  21. y0 = lagrange(x1, y1, x0);: 使用 lagrange 函数进行插值,生成插值曲线。

  22. plot(x0, y0, '--r'): 绘制插值曲线,使用红色虚线。

  23. x1 = linspace(-1, 1, 21);: 定义要进行插值的 x 坐标范围为 -1 到 1,共有 21 个点。

  24. y1 = 1./(1+25*x1.^2);: 计算对应于插值点的 y 坐标。

  25. y0 = lagrange(x1, y1, x0);: 使用 lagrange 函数进行插值,生成插值曲线。

  26. plot(x0, y0, '--g'): 绘制插值曲线,使用绿色虚线。

代码分析:

代码实现了使用拉格朗日插值法从一组已知数据点生成插值曲线的功能。通过循环遍历每个要插值的点和每个已知数据点,计算对应的拉格朗日基函数并累加结果,最终得到该点的插值结果。该代码示例展示了如何使用拉格朗日插值法生成不同数量插值点的曲线,并将其绘制在同一图形窗口中。

拉格朗日插值法的应用:

拉格朗日插值法广泛应用于科学和工程领域,例如:

  • 数据拟合: 从一组离散数据点生成连续曲线。
  • 函数逼近: 用多项式近似表示一个复杂函数。
  • 数值积分: 用插值多项式近似计算积分。
  • 数值微分: 用插值多项式近似计算导数。
拉格朗日插值法代码解析:生成曲线并返回插值结果

原文地址: https://www.cveoy.top/t/topic/n1IE 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录