插值法——線性分段插值


  1.插值函數

%%分段線性插值
function PLI = Piecewise_linear_interpolation(X,f,precision)
[m,n] = size(X);a = min(X);b = max(X);
X = sort(X);
F = subs(f,X);
for k = 1:n-1
    B = Basic_fun(X,k);
    I = B(1)*F(k)+B(2)*F(k+1);
    PLI{1,k} = [X(k),X(k+1)];
    PLI{2,k} = I;
    t{k} = X(k):(X(k+1)-X(k))/precision:X(k+1);
    T{k} = subs(I,t{k});
    Y_real{k} = subs(f,t{k});
end
for k = 1:n-1
    t_((precision+1)*(k-1)+1:(precision+1)*k) = t{k};
    T_((precision+1)*(k-1)+1:(precision+1)*k) = T{k};
    Y_real_((precision+1)*(k-1)+1:(precision+1)*k)= Y_real{k};
end
    h = figure;
    set(h,'color','w');
    plot(X,F,'r*',t_,T_,'g',t_,Y_real_,'b');
    xlabel('x shaft');ylabel('y shaft');
    legend('F:節點對應函數值','T:分段線性插值函數圖像','Y_real:真實函數圖像');
    title('分段線性插值');
    grid on
end

  2.基函數

%%基函數,max(X)>k>0
function BF = Basic_fun(X,k)
X = sort(X);
syms x;
BF(1) = (x-X(k+1))/(X(k)-X(k+1));
BF(2) = (x-X(k))/(X(k+1)-X(k));
end

  3.擬合值函數

%%線性插值擬合值
function LIV = Linear_interpolation_value(X,f,precision,x_value)
[m,n] = size(X);a = min(X);b = max(X);
X = sort(X);
Answer = Piecewise_linear_interpolation(X,f,precision);
for i = 1:n-1
    if x_value >= X(i) && x_value <= X(i+1)
            s = i;        
    end
end
LIV{1,1} = '線性插值擬合值';
LIV{2,1} = vpa(subs(Answer{2,s},x_value),6);
LIV{1,2} = '真實值';
LIV{2,2} = vpa(subs(f,x_value),6);
LIV{1,3} = '誤差';
LIV{2,3} = abs(LIV{2,1}-LIV{2,2});
end

  4.例子

clear all
clc
X = -5:1:5;
syms x;
f = - 0.08858*x^8 + 3.694*x^7 - 64.7*x^6 + 617.8*x^5 - 3490.0*x^4 + 11820.0*x^3 - 23150.0*x^2 + 23580.0*x - 9319.0;
precision = 200;

%%分段線性插值
disp('分段線性插值');
Piecewise_linear_interpolation(X,f,precision)

  結果

分段線性插值
S =
  2×10 cell 數組
  列 1 至 4
    {1×2 double}    {1×2 double}    {1×2 double}    {1×2 double}
    {1×1 sym   }    {1×1 sym   }    {1×1 sym   }    {1×1 sym   }
  列 5 至 8
    {1×2 double}    {1×2 double}    {1×2 double}    {1×2 double}
    {1×1 sym   }    {1×1 sym   }    {1×1 sym   }    {1×1 sym   }
  列 9 至 10
    {1×2 double}    {1×2 double}
    {1×1 sym   }    {1×1 sym   }
>> S{2,:}
ans =
(227077586881*x)/50000 + 37695704689/2500
ans =
(3983468847*x)/2000 + 60987657739/12500
ans =
(7723057429*x)/10000 + 30518164433/25000
ans =
(2518396259*x)/10000 + 4494858583/25000
ans =
(3136314129*x)/50000 - 9319
ans =
(465835271*x)/50000 - 9319
ans =
(422501*x)/10000 - 1113617/25000
ans =
4111433/25000 - (622509*x)/10000
ans =
- (271*x)/80 - 151661/12500
ans =
2072089/2500 - (10681481*x)/50000

  圖像如下


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM