Algoritmos de Optimización No Lineal
Algoritmos de Optimización No Lineal
Algoritmos de Optimización No Lineal
OPTIMIZACIÓN NO LINEAL
19 DE AGOSTO DE 2022
INFORME SOBRE LOS ALGORITMOS DE OPTIMIZACIÓN NO LINEAL
REDACTADO POR
Octave
Calculadora Científica
Libro de Optimización no Lineal
OBJETIVOS GENERALES
ALGORITMOS DE PROGRAMACIÓN
En cálculo numérico, el método de la regula falsi (regla del falso) o falsa posición es
un método iterativo de resolución numérica de ecuaciones no lineales. El método
combina el método de bisección y el método de la secante.
Se puede demostrar que bajo ciertas condiciones el método de la falsa posición tiene
orden de convergencia lineal, por lo que suele converger más lentamente a la
solución de la ecuación que el método de la secante, aunque a diferencia de en el
método de la secante el método de la falsa posición siempre converge a una solución
de la ecuación.
cuerdas_11.m
Algoritmo:
end;
4
En matemáticas, los máximos y mínimos de una función, conocidos colectivamente
como extremos de una función, son los valores más grandes (máximos) o más
pequeños (mínimos), que toma una función en un punto situado ya sea dentro de
una región en particular de la curva (extremo local o relativo) o en el dominio de la
función en su totalidad (extremo global o absoluto).123 De manera más general, los
máximos y mínimos de un conjunto (como se define en teoría de conjuntos) son
los elementos mayor y menor en el conjunto, cuando existen. El localizar valores
extremos es el objetivo básico de la optimización matemática.
minimo_11.m
Algoritmo:
ff=@(x,y) 3*x.^2-4*x.*y+x-3*y+4*y.^2+3;
% algritmo
clc;
x0=[3, 8];
for j=1:5
d=0;
xx=x0-[d,0];
k1=ff(xx(1),xx(2))
for i=1:5
d=d-.05;
xx=x0-[d,0]
k2=ff(xx(1),xx(2))
if k1<k2 break; end;
k1=k2;
x0=xx;
end;
5
xx
disp('===========================');
%%%%%%%%%%%%% (0,1)
d=0;
xx=x0-[0,d];
k1=ff(xx(1),xx(2))
for i=1:5
d=d+.05;
xx=x0-[0,d]
k2=ff(xx(1),xx(2))
if k1<k2 break; end;
k1=k2;
x0=xx;
end;
xx
disp('RRRRRRRRRRRRRRRRRRRRRRRRRRR');
end;
minimo_22.m
Algoritmo:
ff=@(x,y) 3*x.^2-4*x.*y+x-3*y+4*y.^2+3;
end;
yy
k1
j
minimo_aa11.m
Algoritmo:
ff=@(x,y) 3*x.^2-4*x.*y+x-3*y+4*y.^2+3;
end;
yy
k1
j
INTERPOLACIONES CÚBICAS
En este caso, cada polinomio 𝑃(𝑥) a través del que construimos los Splines en [𝑚, 𝑛]
tiene grado 3. Esto quiere decir, que va a tener la forma 𝑃(𝑥) = 𝑎𝑥 3 + 𝑏𝑥 2 + 𝑐𝑥 + 𝑑
En este caso vamos a tener cuatro incógnitas por cada intervalo (𝑎, 𝑏, 𝑐, 𝑑), y una
nueva condición para cada punto común a dos intervalos, respecto a la derivada
segunda:
Que las partes de la función a trozos 𝑃(𝑥) pasen por ese punto. Es decir, que las
dos 𝑃𝑛 (𝑥) que rodean al 𝑓(𝑥) que queremos aproximar, sean igual a 𝑓(𝑥) en cada
uno de estos puntos.
Que la derivada en un punto siempre coincida para ambos "lados" de la función
definida a trozos que pasa por tal punto común.
Que la derivada segunda en un punto siempre coincida para ambos "lados" de la
función definida a trozos que pasa por tal punto común.
Como puede deducirse al compararlo con el caso de splines cuadráticos, ahora no
nos va a faltar una sino dos ecuaciones (condiciones) para el número de incógnitas
que tenemos.
La forma de solucionar esto, determina el carácter de los splines cúbicos. Así,
podemos usar:
Splines cúbicos naturales: La forma más típica. La derivada segunda de 𝑃 se hace
0 para el primer y último punto sobre el que está definido el conjunto de Splines,
esto son, los puntos 𝑚 y 𝑛 en el intervalo [𝑚, 𝑛].
Dar los valores de la derivada segunda de 𝑚 y 𝑛 de forma "manual", en el
conjunto de splines definidos en el intervalo [𝑚, 𝑛].
Hacer iguales los valores de la derivada segunda de 𝑚 y 𝑛 en el conjunto de
splines definidos en el intervalo [𝑚, 𝑛].
8
Splines cúbicos sujetos: La derivada primera de 𝑃 debe tener el mismo valor que
la derivada primera de la función para el primer y último punto sobre el que está
definido el conjunto de Splines, esto son, los puntos 𝑚 y 𝑛 en el intervalo [𝑚, 𝑛].
cubicas_11_a1.m
Algoritmo:
% cubicasa
x=-3; d=1;
al=0;
k1=f(x+al*d), k2= df(x+al*d);
al1=1;
for i=1:10
al=al+1;
k3=df(x+al*d);
if k2*k3<0 break; end;
end;
a=x+(al-1)*d; b=x+al*d;
z=(3*(f(a)-f(b)))/(b-a)+(df(a)+df(b))
w=sqrt(z.*z - df(a)*df(b))
ac=b-(df(b)-z-w)/(df(b-df(a)+2*w))*(b-a)
MÉTODO DE LA GRADIENTE
9
Para la optimización de modelos de Programación No Lineal sin restricciones se
dispone de una categoría de métodos denominados «Algoritmos Generales de
Descenso» entre los cuales se destaca el Método del Gradiente o Método del
Descenso más Pronunciado (conocido adicionalmente como Método de
Cauchy) que reducen el cálculo de un mínimo local a una secuencia de problemas de
búsqueda lineal (o búsqueda unidimensional).
Consideremos el siguiente problema de Programación No Lineal no restringido:
gradiente_11.m
Algoritmo:
% gradiente
% f(x,y) = 2x^2-3xy+7y^2-3x+4y+4
ff=@(x,y) 2*x.^2-3*x.*y+7*y.^2-3*x+4*y+4;
ffx=@(x,y) 4*x-3*y-3;
ffy=@(x,y) -3*x+14*y+4;
x0=1; y0=2; er11=.001;
for i=1:20
alfa=0; k1=ff(x0,y0);
for j=1:10
alfa=alfa+.1;
11
xtx=x0-alfa*ffx(x0,y0);
xty=y0-alfa*ffy(x0,y0);
k2=ff(xtx,xty);
if k1>k2 break; end;
k1=k2;
end; % fin j
k3=norm([x0 y0]-[xtx xty]);
printf('%d x=%f y=%f Er=%f k=%f\n', i, x0, y0, k3, ff(xtx, xty));
if k3<er11 break; end;
x0=xtx; y0=xty;
end;
printf('%d x=%f y=%f Er=%f\n', i+1, xtx, xty, k3);
MÉTODO DE LA GRADIENTE
12
aurea_11_a1.m
Algoritmo:
f = @(x) 2*x*x-3*x-4;
a = -3; b = 4; error = 0.001; Tau = (sqrt(5)-1)/2;
if a > b x1 = a; a = b; b = x1 end;
x2 = a + (b-a) * Tau;
x1 = a + (b-a) * (1 - Tau);
a1 = a; b1 = b; i1=1;
fx1 = f(x1); fx2 = f(x2);
do
if fx1 < fx2
b1 = x2; x2=x1; fx2=fx1;
x1 = a1 + (b1-a1) * (1-Tau); fx1 = f(x1);
else %{if fx1 > fx2 then}
a1 = x1; x1=x2; fx1=fx2;
x2 = a1 + (b1-a1) * (Tau);
fx2 = f(x2);
end;
13
i1 = i1 + 1;
until abs(a1-b1) < error;
%Str(a1:1:10,sx1);Str(b1:1:10,sx2);
e1=abs(a1-b1);
fprintf(' El intervalo Final es [ %f ; %f ] Er=%f\n', a1, b1, e1);
%str( error * (b-a):1:8 , sx1); str( b1-a1:1:8 , sx2);
%end;
Aurea01_20220512_a11.m
Algoritmo:
end;
%end.
MÉTODO DE FIBONACCI
Fibonacci_11_a1.m
Algoritmo:
15
%function f( x : double ) : _r;
%begin f := x*x-3*x end;
clear all;
f =@(x) x*x-3*x;
n=0; error1=0.0001;
%Procedure Fibonacci( var n : _i); var xx : _r;
%begin Fibonaccin(1) := 1; Fibonaccin(2) := 1; n := 2;
% repeat n := n + 1;
% Fibonaccin(n) := Fibonaccin(n-1)+Fibonaccin(n-2);
% until Fibonaccin(n) > 1/error;
%end;
Fibonaccin=[];
Fibonaccin(1) = 1; Fibonaccin(2) = 1; n = 2;
do n = n + 1;
Fibonaccin(n) = Fibonaccin(n-1)+Fibonaccin(n-2);
until Fibonaccin(n) > 1/error1;
nn=n;
a = -4;
b = 5;
%error1 := 0.01;
%Fibonacci( nn );
%Memo1.Clear;
if a > b x1 = a; a = b; b = x1; end;
hh = (b-a) * Fibonaccin(nn-2) / Fibonaccin(nn);
x1=a+hh; x2=b-hh; fx1 = f(hh+a); fx2 = f(-hh+b); i1=nn;nn=nn;
do %nn=nn-1;
%sx3:=''; str(a:1:5,sx1);sx3:=sx3+' a= '+sx1;str(b:1:5,sx1);sx3:=sx3+' b=
'+sx1;
% str(x1:1:5,sx1);sx3:=sx3+' x1= '+sx1;str(x2:1:5,sx1);sx3:=sx3+' x2=
'+sx1;
% str(fx1:1:5,sx1);sx3:=sx3+' fx1= '+sx1;str(fx2:1:5,sx1);sx3:=sx3+'
fx2= '+sx1;
% sx3:=sx3+' '+sx2;
% Memo1.Lines.Add(sx3);
if fx1 < fx2
if x1 < x2 %then
b = x2; %end;
else a = x2; end;
hh = (b-a) * Fibonaccin(nn-2) / Fibonaccin(nn);
x2 = b-hh; fx2 = f(x2); %sx2:=' <<';
else
%begin
if x1 < x2 a = x1;
else b = x1; end;
x1 =x2;fx1=fx2;
hh = (b-a) * Fibonaccin(nn-2) / Fibonaccin(nn);
x2 = b - hh; fx2 = f(x2); % sx2:=' >>';
end; %end;
nn=nn-1;
printf(' El intervalo Final es [ %f ; %f ] \n',a ,b );
until 3 > nn;
% sx3:='';str(a:1:6,sx1);sx3:=sx3+' ( '+sx1+' , ';
16
% str(b:1:6,sx1);sx3 := sx3 + sx1 + ' )';
% Memo1.Lines.Add(' El intervalo Final es '+sx3+ ' n= '+IntToStr(i1));
printf(' El intervalo Final es [ %f ; %f ] n=%d \n',a ,b , i1);
% str( error * (b-a):1:8 , sx1); str( b-a:1:8 , sx2);
% Memo1.Lines.Add(' Con Error Pedido de Err = ' + sx1 +
% ' y Error de intervalo = '+ sx2);
%end;
%end.
MÉTODO DE MONTECARLO
17
En la primera etapa de estas investigaciones, John von Neumann y Stanislaw
Ulam refinaron esta ruleta y los métodos "de división" de tareas. Sin embargo, el
desarrollo sistemático de estas ideas tuvo que esperar al trabajo de Harris y Herman
Kahn en 1948. Aproximadamente en el mismo año, Enrico Fermi, Nicholas
Metropolis y Ulam obtuvieron estimadores para los valores característicos de
la ecuación de Schrödinger para la captura de neutrones a nivel nuclear usando este
método.
El método de Montecarlo proporciona soluciones aproximadas a una gran variedad
de problemas matemáticos posibilitando la realización de experimentos con
muestreos de números pseudoaleatorios en una computadora. El método es aplicable
a cualquier tipo de problema, ya sea estocástico o determinista. A diferencia de
los métodos numéricos que se basan en evaluaciones en N puntos en un espacio M-
dimensional para producir una solución aproximada, el método de Montecarlo tiene
1
un error absoluto de la estimación que decrece como en virtud del teorema del
√𝑁
límite central.
monte_carlo11.m
Algoritmo:
function y=monte_carlo11
xk=2;
for j=1:100
h=4.5 - xk*xk;
if h<0 i=-1; else i=1; end;
18
h=abs(h);
kk=0; % contador
if h<1 h=h/2;
else do kk=kk+1; until kk*kk>h;
h=kk-1; end;
aleat=rand^2;
vx=xk+i*h*aleat;
%fprintf('carlo=%f er=%f\n', vx, abs(4.5-vx*vx));
if vx<0 vx=abs(vx); end;
if abs(vx-xk) <.0000001 break; end;
xk=vx;
end;
fprintf('%d carlo=%f er=%f\n',j, vx, abs(4.5-vx*vx));
(1)
para varios valores del parámetros hasta obtener una solución que
satisfaga .
Primero definamos la función:
entonces podemos decir que podemos encontrar un valor tal que que
está entre e .
19
La manera de estimar a partir de y es usando el método de regula falsi:
disparo_no_lineal_secante11_20220530.m
Algoritmo:
% DISPARO NO LINEAL
function y1 = disparo_no_lineal_secante11_20220530
a=0; b=2; ya=0; wa=1; n=10; p=1; p1=0; yb=1; % varia
function y2=f1(t, y, w)
y2=w;
20
end;
function y2=f2(t, y, w)
y2=t+y*y/10;
end;
%runge
function yt1 = rungekuttageneral(a, b, ya, wa, n)
h = (b-a)/n;
t=a; k=0; %y(1)=y0;
for i=1:n
ky1 = h*f1(t,ya,wa);
kw1 = h*f2(t,ya,wa);
ky2 = h*f1(t+h/2,ya+ky1/2, wa+kw1/2);
kw2 = h*f2(t+h/2,ya+ky1/2, wa+kw1/2);
ky3 = h*f1(t+h/2,ya+ky2/2, wa+kw2/2);
kw3 = h*f2(t+h/2,ya+ky2/2, wa+kw2/2);
ky4 = h*f1(t+h,ya + ky3, wa+kw3);
kw4 = h*f2(t+h,ya + ky3, wa+kw3);
Una diferencia finita es una expresión matemática de la forma f(x + b) − f(x +a). Si
una diferencia finita se divide por b − a se obtiene una expresión similar
al cociente diferencial, que difiere en que se emplean cantidades finitas en lugar
de infinitesimales. La aproximación de las derivadas por diferencias finitas
desempeña un papel central en los métodos de diferencias finitas del análisis
numérico para la resolución de ecuaciones diferenciales.
21
diferencias_finitas_11_20220602.m
Algoritmo:
c=A\B
Difere_finita1.m
Algoritmo:
function t1=pp(x)
%t1=0;
t1=-2/x;
end;
function t2=qq(x)
%t2=1/2;
t2=2/x^2;
end;
function t3=rr(x)
%t3=-exp(-0.2*x)/2;
t3=sin( log(x) ) / x^2;
end;
Difere_finita33.m
Algoritmo:
23
s=AA\RR'; s';
format;
x=a:h:b; s1=[ya s' yb];
plot(x, s1, 'linewidth',3); grid;
Difere_finita22.m
Algoritmo:
end;
function t3=rr(x)
t3=0;
%t3=-exp(-0.2*x)/2;
%t3=sin( log(x) ) / x^2;
end;
base_111.m
Algoritmo:
clc
%A=[1 0 0 0;1 1+2/3 1/3*3+2*1/3 1/3+3*1/9; 1 1+2/3 2*2/3+2*2/3 2*2*2/3+3*4/9; 1
2 3 4]
A=[1 0 0 0
1 1+1/3 1/9+2/3 1/27+3/9
1 1+2/3 4/9+4/3 8/27+12/9
1 2 3 4 ]
base_222.m
25
Algoritmo:
format rat;
c=A\b
format;
x=0:.01:1;
ys=c(1)+c(2)*x+c(3)*x.^2+c(4)*x.^3;
yt=sinh(2*x)/4*sinh(2) - x/4;
yp=5*sinh(2*x)/8 - x/4;
plot(x, ys, x, yt, x, yp);
grid;
base_primer11.m
Algoritmo:
function yta=base_primer11
a=0; b=1; n=3; h=(b-a)/n;
x1=a:h:b;
A=[]; b=[];
%contruccion de la matriz A
for i=1:n+1
A(1,i)=x_x(x1(1),i-1);
b(i)=rr(x1(i));
end;
for i=2:n+1
for j=1:n+1
A(i,j)=dx_x(x1(i),j-1)+x_x(x1(i),j-1);
end;
end;
A
b
26
ys=c(1)+c(2)*x+c(3)*x.^2+c(4)*x.^3;
yt=exp(-x)+x-1;
%x_x(2,3)
function v=dx_x(t,m)
if m<=0 v=0;
elseif m==1 v=1;
else v=m*t.^(m-1),
end;
function v=rr(t)
v=t;
base_primer12.m
Algoritmo:
%PROGRAMA PARA
%edo
function yta=base_primer12
a=0; b=1; n=6; h=(b-a)/n;
x1=a:h:b;
A=[]; b=[];
%contruccion de la matriz A
for i=1:n+1
A(1,i)=x_x(x1(1),i-1);
b(i)=rr(x1(i));
end;
for i=2:n+1
for j=1:n+1
A(i,j)=dx_x(x1(i),j-1)+x_x(x1(i),j-1);
end;
end;
A
b
27
c=A\b'
format;
x=0:.1:1; ys=[];
%ys=c(1)+c(2)*x+c(3)*x.^2+c(4)*x.^3;
for i=1:length(c)
k=0;
for j=1:length(c)
k=k+c(j)*x(i).^(j-1);
endfor
ys(i)=k;
end;
yt=exp(-x)+x-1; yt=[];
plot(x, ys, x, yt);
grid;
%x_x(2,3)
function v=dx_x(t,m)
if m<=0 v=0;
elseif m==1 v=1;
else v=m*t.^(m-1),
end;
function v=rr(t)
v=t;
base_primer22.m
Algoritmo:
%PROGRAMA PARA
%edo
function yta=base_primer22
a=0; b=1; n=6; h=(b-a)/n;
x1=a:h:b;
A=[]; b=[];
%contruccion de la matriz A
for i=1:n+1
A(1,i)=x_x(x1(1),i-1);
A(n+1,i)=dx_x(x1(1),i-1);
b(i)=rr(x1(i));
28
end;
for i=2:n+1
for j=1:n+1
k=ddx_x(x1(i),j-1);
A(i,j)=k+0*dx_x(x1(i),j-1)-4*x_x(x1(i),j-1);
end;
end;
A
b
%ys=c(1)+c(2)*x+c(3)*x.^2+c(4)*x.^3;
for i=1:length(c)
k=0;
for j=1:length(c)
k=k+c(j)*x.^(j-1);
endfor
ys(i)=k;
end;
yt=exp(-x)+x-1;
plot(x, ys, x, yt);
grid;
%x_x(2,3)
function v=dx_x(t,m)
if m<=0 v=0;
elseif m==1 v=1;
else v=m*t.^(m-1),
end;
function v=ddx_x(t,m)
if m<=1 v=0;
elseif m==2 v=2;
else v=m**(m-1)*t.^(m-2);
end;
function v=rr(t)
v=t;
29
OTROS PROGRAMAS
comandos.m
Algoritmo:
format rat
A=[62/9 -25/9; -25/9 62/9]
b=[-1/9 -1/18]'
A\b %-0.023
disp('======================')
(sinh(2/3)/(4*sinh(2)))-(1/3)/4 %-0.033
programa20220623.m
Algoritmo:
Iq1=@(z)(z-x(1)).^2.*q(z);
Iq1=quad(Ip1,x(1),x(2))/h^2;
for i=1:n-1
IpN=@(z) p(z); h=x(i+2)-x(i+1); IpN=quad(IpN,x(i+1),x(i+2))/h^2;
IqN=@(z) (z-x(i+2)).^2.*q(z); IqN=quad(IqN,x(i+1),x(i+2))/h^2;
Ia=@(z) (x(i+2)-z).^2.*q(z); Ia=quad(Ia,x(i+1),x(i+2))/h^2;
Ib=@(z) (x(i+2)-z).*(z-x(i+1)); Ib=quad(Ib,x(i+1),x(i+2))/h^2; h1=h;
Ic=@(z) (z-x(i)).*r(z); h=x(i+1)-x(i); Ic=quad(Ic,x(i),x(i+1))/h;
Id=@(z) (x(i+2)-z).*r(z); Id=quad(Id,x(i+1),x(i+2))/h1;
A(n,n)=Ip1+IpN+Iq1+Ia;
b(n)=Ic+Id;
30
A
b
%c = A\b'
BIBLIOGRAFÍA ADICIONAL
31