[数值分析]插值 - 牛顿插值法

clc;clear all;close all;

n = 1:1:10000;
sig = sin(n/100);

k = 0;
for i = 1:4:10000
    k = k + 1;
    x_arr = n(i:i+3);
    y_arr = sig(i:i+3);
    arr_new_y(k) = NewtonInterpolation(x_arr,y_arr,4,mean(x_arr));
    arr_new_x(k) = mean(x_arr);
end

figure(1);
plot(n,sig);hold on;
scatter(arr_new_x,arr_new_y);grid on;

function [y_return] = NewtonInterpolation(x_arr,y_arr,n,x_in)

    % 提早返回
    if(n <= 1) 
        y_return = 0;
        return;
    end

    % 商差缓存申请与计算
    buffer_len   = (n * (n+1)) / 2;
    quo_diff_arr = zeros(buffer_len,1);
    for i = 1:1:n
        quo_diff_arr(i) = y_arr(i); % 三角第一列为原始y值用于迭代
    end
    
    % 开始计算插值
    % x y
    % * *
    % * **
    % * ***
    % * ****
    
    y_arr_index     = 0; % 三角前一排y值
    y_new_arr_index = n; % 三角后一排y值 提前赋值
    
    for diff_len = 1:1:n-1 % 差商距离 如果n为4 则距离由1-3
        for index = 1:1:n-diff_len % x值按差商距离扫描一次商差计算
            y_arr_index     = y_arr_index + 1;
            y_new_arr_index = y_new_arr_index + 1;

            % 计算差商
            quo_diff_arr(y_new_arr_index) = ...
                (quo_diff_arr(y_arr_index+1) - quo_diff_arr(y_arr_index))/...
                (x_arr(index+diff_len) - x_arr(index));
            
        end
        y_arr_index = y_arr_index + 1;
    end
  
    % 代入多项式 f(x) = f(x0) + f(x1)(x-x0) + f(x2)(x-x1)(x-x0) + ...+ f(xn)(x-xn-1)~(x-x0);
    sum     = 0;
    step    = n;
    index   = 1;
    for i = 1:1:n
        j   = i - 1;
        mul = 1;
        while(j > 0)
            mul = mul*(x_in - x_arr(j));
            j = j - 1;
        end
        sum = sum + quo_diff_arr(index)*mul;
        
        index   = index + step;
        step    = step - 1;    
    end
    
    % 返回结果
    y_return = sum;
    return;
end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值