【MATLAB與機械設計】一維優化之二次插值法(拋物線法)


二次插值法又稱拋物線法,它是利用函數在極值點附近具有二次函數的性質建立起來的一種多項式逼近方法。利用目標函數在若干點的信息(函數值、導數值等),構造一個與目標函數值相接近的插值多項式,用該多項式的最優解作為函數的近似最優解,隨着搜索區間的逐次縮短,多項式的最優點與原函數最優點的距離逐漸減小,直至滿足精度要求。

1.二次插值的程序框圖:
在這里插入圖片描述
2. MATLAB可執行程序

function [x,f_x]=Quadratic_interpolation(f,x1,x2,x3,exp)
%% 函數說明
%{
   本函數應用於二次插值
   其中f表示輸入函數
   x1,x2,x3表示要進行插值的三個點
   exp精度
   x:為輸出的極小值點
   f_x:為輸出的極小值
   
   調用方法:
   clc;
   clear;
   f=@(x)(x+1/x);
   [x,f]=n_d(f,0,10,30,0.01);
   x
   f
%}
%% 函數主題
f1=f(x1);
f2=f(x2);
f3=f(x3);
%{
sov_f=[f1,f2,f3]';
sov_x=[1,x1,x1^2
    1,x2,x2^2
    1,x3,x3^2];
sov_a=sov_x\sov_f;
a=sov_a;
a0=a(1);
a1=a(2);
a2=a(3);
%x_m=-a1/(2*a2);
%}
while 1
A=2*(f1*(x2-x3)+f2*(x2-x1)+f3*(x1-x2));
B=(f1*(x2^2-x3^2)+f2*(x2^2-x1^2)+f3*(x1^2-x2^2));
if A==0
    disp('run is lost!!')
else
    x_m=B/A;
    if abs(x2-x_m)<exp
        if f(x_m)<=f2
            x=x_m;
            f_x=f(x_m);
            break
        else
            x=x2;
            f_x=f2;
            break
        end
    else
        if (x_m-x1)*(x_m-x2)<0
            if f(x_m)<=f2
                x3=x2;
                x2=x_m;
                f3=f2;
                f2=f(x_m);
            else
                x1=x_m;
                f1=f(x_m);
            end
        else
             if f(x_m)<=f2
                x1=x2;
                x2=x_m;
                f1=f2;
                f2=f(x_m);
            else
                x3=x_m;
                f3=f(x_m);
            end
        end
    end
end
end
end


免責聲明!

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



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