El método de interpolación cuadrática del valor extremo unidimensional sin restricciones de MATLAB

1. Principio de algoritmo

Establezca la curva F (x) y encuentre su intervalo de valor extremo [x1, x2], de modo que satisfaga f (x1)> f ((x1 + x2) / 2), f ((x1 + x2) / 2) <f (x2), use los valores de estos tres puntos para ajustar una ecuación parabólica

f (x) = ax ^ 2 + bx + c, abc es el coeficiente.

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

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

Escrito en forma de matriz

x1 ^ 2 x1 1 a f (x1)

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

x3 ^ 2 x3 1 c f (x3)

Simplificado a vander (x1 x2 x3) * [abc] '= [f (x1) f (x2) f (x3)]'

Después de usar Matlab para encontrar la expresión, encuentre el punto mínimo xp de f (x).

Determine el valor de f (xp) yf ((x1 + x2) / 2)

Si f (xp)> f ((x1 + x2) / 2) 1, xp <(x1 + x2) / 2 <x2, el nuevo intervalo es [xp, x2];

                                  2. (x1 + x2) / 2 <xp <x2, luego el nuevo intervalo [x1, xp]

Si f (xp) <f ((x1 + x2) / 2) 1, x1 <xp <(x1 + x2) / 2, entonces el nuevo intervalo es [x1, (x1 + x2) / 2];

                                  2. (x1 + x2) / 2 <xp <x2, entonces el nuevo intervalo [(x1 + x2) / 2, x2];

El principio es garantizar que el valor de la función se distribuya en un alto grado e iterar continuamente.

 

 

Segundo, el programa 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

 

Publicado 10 artículos originales · elogiado 8 · visitas 75

Supongo que te gusta

Origin blog.csdn.net/STM89C56/article/details/105464896
Recomendado
Clasificación