數值分析 插值 牛頓插值法

2021-09-11 20:38:20 字數 1825 閱讀 1804

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 即拉格朗日多項式 ...