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);
endfigure(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));
endy_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;
endsum = sum + quo_diff_arr(index)*mul;
index = index + step;
step = step - 1;
end% 返回結果
牛頓插值法
有了拉格朗日插值法,牛頓插值怎麼會缺席呢,這裡介紹牛頓插值,牛頓插值自然是為了解決拉格朗日的在程式設計上的缺陷而出現的 至少邏輯是這樣的 拉格朗日插值法在程式設計上的缺陷是什麼呢?從拉格朗日插值的形式就可以得知,每增加乙個插值節點就要重新計算插值基函式,這是乙個致命的缺點。牛頓插值克服了這個問題,我...
數值分析之牛頓插值(MATLAB)
x1 input 輸入節點座標x y input 輸入節點座標函式值f x x2 input 輸入所要計算的節點x2 syms x n length x1 差商的求法 for i 2 n f1 i,1 y i y i 1 x1 i x1 i 1 endfor i 2 n for j i 1 n f1...
數值分析 插值
存在以及唯一性定理 如果存在有 1n 個不重複的點 x 0,y 0 x 1,y 1 x n,y n 那麼一定存在且只有一組係數 a 1,a 2.a n 使得 p x a 0 a 1x a 2x 2 a nx n 成立。存在性證明 首先引入 lagrange polynomials 即拉格朗日多項式 ...