MATLAB无约束一维极值之二次插值法

一、算法原理

设曲线F(x),寻找到其极值区间[x1,x2],使其满足f(x1)>f((x1+x2)/2) , f((x1+x2)/2)<f(x2),利用这三个点的值拟合一条抛物线方程

f(x)=ax^2+bx+c,a b c 为系数。

ax1^2+bx1+c=f(x1)
ax2^2+bx2+c=f(x2)

ax3^2+bx3+c=f(x3)

写成矩阵形式

x1^2 x1  1         a         f(x1)

x2^2 x2  1    *    b    =   f(x2)

x3^2 x3  1         c          f(x3)

化简为vander(x1 x2 x3) *[a b c]'=[f(x1)  f(x2)  f(x3)]'

利用matlab求出该表达式之后,求得f(x)的极小值点xp。

判断f(xp)与f((x1+x2)/2)的值

若f(xp)>f((x1+x2)/2)  1、xp<(x1+x2)/2<x2,则新的区间为[xp,x2];

扫描二维码关注公众号,回复: 10716538 查看本文章

                                  2、(x1+x2)/2<xp<x2,则新的区间[x1,xp]

若f(xp)<f((x1+x2)/2)  1、x1<xp<(x1+x2)/2,则新的区间为[x1,(x1+x2)/2];

                                  2、(x1+x2)/2<xp<x2,则新的区间[(x1+x2)/2,x2];

原则就是保证函数值呈现高帝高的分布,不断迭代即可。

二、matlab程序

clc
clear
f=@(x) x.^3-6*x+9;
ezplot(f,[-100 100])
[x,fx]=Min_erci(f,[0 5],100)  % a 函数值  b横坐标
function [x,result]=Min_erci(f,x0,k) %x0为初始区间端点,k为迭代次数

x1=x0(1);
x3=x0(2);
x2=(x1+x3)/2;

n=1;
while n < k
    % 确定抛物线的系数
    f1=f(x1);
    f2=f(x2);
    f3=f(x3);
    A=[x1^2    x1   1;
       x2^2    x2   1;
       x3^2    x3   1;];
   b=[f1;f2;f3];
   XS=A\b;  %求出抛物线系数a b c 存放在xs中
   xp=-XS(2)/(2*XS(1)); %二次多项式的极值点在x=-b/2a
   fp=f(xp); %求出该点函数值
   if abs(xp-x2) < 1e-8  %该点满足极值点条件
       x=xp;        %输出极值点
       result=f(x); %输出函数值
       return;
   end
   if fp > f2       %判断新的迭代区间
       if xp < x2
           x1=xp;
       else
           x3=xp;
       end
   else
       if xp < x2
           x3=x2;
           x2=xp;
       else
           x1=x2;
           x2=xp;
       end
   end
    n=n+1;   %迭代次数+1
end

if n == k        %如果超出迭代次数
    x=[];        %输出空    
    result=[];
    disp('超过迭代次数');
end
end
发布了10 篇原创文章 · 获赞 8 · 访问量 75

猜你喜欢

转载自blog.csdn.net/STM89C56/article/details/105464896