分段三次Hermite插值Matlab實現

2021-08-10 06:05:31 字數 2638 閱讀 4876

function  [m_matrix]=hermite(x,y,y0,yn,x_value)

%% 輸入值分配,x_input,y_input均為陣列,y_0,y_n為x_0,x_n分別對應的一階導數值

x_input = x;

y_input = y;

y_0 = y0;

y_n = yn;

%% [~,number] = size(x_input); %獲取輸入x_input的大小1×number

delta_h = zeros(1,number-1); %給delta_h分配陣列大小1×(number-1),並全部初始化為0

delta_f = zeros(1,number-1); %給delta_f分配陣列大小1×(number-1),並全部初始化為0

lambda_ = zeros(1,number-2); %給lambda_分配陣列大小1×(number-2),並全部初始化為0

miu = zeros(1,number-2); %給miu_分配陣列大小1×(number-2),並全部初始化為0

e = zeros(1,number-2); %給e分配陣列大小1×(number-2),並全部初始化為0

% 計算delta_h、delta_f的值

for i = 1:(number-1)

delta_h(i) = x_input(i+1) - x_input(i);

delta_f(i) = (y_input(i+1) - y_input(i))/ delta_h(i);

end%%計算lambda,miu,e

for i=1:number-2

lambda_(1,i) = delta_h(1,i+1) / (delta_h(1,i+1) + delta_h(1,i));

miu(1,i) = 1 - lambda_(1,i);

e(1,i) = 3*(lambda_(1,i)*delta_f(1,i) + miu(1,i)*delta_f(1,i+1));

enda = zeros(number-2,number-2); %初始化係數矩陣a,(n-2)*(n-2)

b = zeros(number-2,1); %初始化係數矩陣b,(n-2)*1

%當i=1時

a(1,1) = 2;

a(1,2) = miu(1,1);

b(1,1) = e(1,1) - lambda_(1,1) * y_0;

%當i=2:n-2時

for i = 2:number-3

b(i,1) = e(1,i);

a(i,i-1) = lambda_(1,i);

a(i,i) = 2;

a(i,i+1) = miu(1,i);

end%當i=n-1時

a(number-2,number-3) = lambda_(1,number-2);

a(number-2,number-2) = 2;

b(number-2,1) = e(1,number-2) - miu(1,number-2)*y_n;

%% 計算a的逆,a*b

m_matrix = a\b;

m = zeros(1,number);

m(1,1) = y_0;

m(1,number) = y_n;

for i = 2:number-1

m(1,i) = m_matrix(i-1,1);

endfor i =1:number-1

% 獲取相鄰兩點間的插值函式

x_ = linspace(x_input(1,i),x_input(1,i+1));

s1 = y_input(1,i).*((x_-x_input(1,i+1)).^2).*(delta_h(1,i) + 2.*(x_ - x_input(1,i)))./(delta_h(1,i).^3);

s2 = y_input(1,i+1).*((x_-x_input(1,i)).^2).*(delta_h(1,i) + 2.*(x_input(1,i+1) - x_))./(delta_h(1,i).^3);

s3 = m(1,i).*((x_ - x_input(1,i+1)).^2).*(x_ - x_input(1,i))./(delta_h(1,i).^2);

s4 = m(1,i+1).*((x_ - x_input(1,i)).^2).*(x_ - x_input(1,i+1))./(delta_h(1,i).^2);

s = s1 + s2 + s3 +s4;

% 判斷輸入的x屬於哪個插值區間,滿足則計算對應的f(x)的值

if x_value>x_input(1,i)&&x_value

驗證資料:

已知資料x0

1234

5678

910y2.51

3.30

4.04

4.70

5.22

5.54

5.78

5.40

5.57

5.70

5.80

邊界條件為y'0 = 0.8,y'n = 0.2.

測試結果:

hermite插值 分段插值 Hermite插值

1.分段二次多項式插值 試用分段 4段 二次多項式插值來近似 0,1 區間上的 runge 函式 1 取區間的 8 等分點,計算插值節點處的函式值 2 每次取 3 個相鄰的等分點為一組,呼叫 polyinterp 函式,計算繪圖求值點 3 繪圖.2.hermite插值 編寫程式,繪製繪製多項式 p ...

分段二次插值例題 分段三次插值

摘 要用函式來表示變數間的數量關係廣泛應用於各學科領域,但是在實際 問題中,往往是通過實驗 觀測以及計算等方法,得到的是函式在一些點 上的函式值。如何通過這些離散資料找到函式的乙個滿足精度要求且便於 使用的近似表示式,是經常遇到的問題。對於這類問題我們解決的方法為插值法,而最常用也最簡單的插值方 法...

拉格朗日插值 分段線性插值 三次樣條插值

本篇主要介紹在三種插值方法 拉格朗日插值 分段線性插值 三次樣條插值,以及這三種方法在matlab中如何實現。令上式稱為 matlab沒有現成的lagrange函式,需要手動寫,如下 x0,y0為原始座標點,維度必須相同。x為待插值的點。y是返回值,是最終插值結果。function y lagran...