Files
cmdla/Lessons/10-12/oneDTestFunctions.m
2024-07-30 14:43:25 +02:00

129 lines
4.2 KiB
Matlab

function TF = oneDTestFunctions()
%function TF = oneDTestFunctions()
%
% Produces a cell array of function handlers, useful to test unconstrained
% one-dimensional optimization algorithms.
%
% Each function in the array has the following interface:
%
% [ v , varargout ] = f( x )
%
% Input:
%
% - x is either a scalar real denoting the input of f(), or [] (empty).
%
% Output:
%
% - v (real, scalar): if x == [] this is the best known lower bound on
% the global optimum of f() on the standard interval in which f() is
% supposed to be minimised (see next). If x ~= [] then v = f(x).
%
% - g (real, either scalar or a [ 1 x 2 ] matrix denoting an interval) is
% the first optional argument. This also depends on x. if x == [] then
% g is a [ 1 x 2 ] matrix denoting the standard interval in which f()
% is supposed to be minimised (into which v is the minimum). If x ~= []
% then g is a scalar containing the dervative g = f'(x) (or a
% subgradient of f() in x if f() is not differentiable at x).
%
% - H (real, scalar) is the second optional argument. This must only be
% specified if x ~= [], and it is the second derivative h = f''(x).
% If no such information is available, the function throws error.
%
% The current list of functions is the following:
%
% 1 Taylored nasty 10-th degree polynomial with a local minimum in 0
% (with value 0), a local minimum around -1, a saddle point around
% +1, a local maximum around +2 and another local minimum around +3.
% Thought to be plotted in [ -1.2 , 3.1 ], and minimised in
% [ -0.5 , 3 ] (the global minimim there being 0). Note that, by
% taking [ -1 , 3 ] instead, blind dycothomic search would hit jackpot
% in two iterations by sheer luck.
%
%{
=======================================
Author: Antonio Frangioni
Date: 08-11-18
Version 1.01
Copyright Antonio Frangioni
=======================================
%}
TF = cell( 1 , 1 );
%TF{ 1 } = @(x) genericquad( [ 6 -2 ; -2 6 ] , [ 10 ; 5 ] , x );
TF{ 1 } = @custom;
% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
% function [ v , varargout ] = genericquad( Q , q , x )
% % generic quadratic function f(x) = x' * Q * x / 2 + q' * x
%
% if isempty( x ) % informative call
% if min( eig( Q ) ) > 1e-14
% xStar = Q \ -q;
% v = 0.5 * xStar' * Q * xStar + q' * xStar;
% else
% v = - Inf;
% end
% if nargout > 1
% varargout{ 1 } = [ 0 ; 0 ];
% end
% else
% if ~ isequal( size( x ) , [ 2 1 ] )
% error( 'genericquad: x is of wrong size' );
% end
% v = 0.5 * x' * Q * x + q' * x; % f(x)
% if nargout > 1
% varargout{ 1 } = Q * x + q; % \nabla f(x)
% if nargout > 2
% varargout{ 2 } = Q; % \nabla^2 f(x)
% end
% end
% end
% end % genericquad
% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
function [ v , varargout ] = custom( x )
% custom 10-th degree polynomial
% syms x
% f = @(x) 91 * x^2 / 30 - 19 * x^3 / 6 - 54 * x^4 / 25 ...
% + 93 * x^5 / 23 - 23 * x^6 / 36 - 121 * x^7 / 93 ...
% + 72 * x^8 / 91 - 13 * x^9 / 74 + 9 * x^10 / 640
%
% diff( f , x )
% 9*x^9)/64 - (117*x^8)/74 + (576*x^7)/91 - (847*x^6)/93
% - (23*x^5)/6 + (465*x^4)/23 - (216*x^3)/25 - (19*x^2)/2 + (91*x)/15
%
% diff( f , x , 2 )
% (81*x^8)/64 - (468*x^7)/37 + (576*x^6)/13 - (1694*x^5)/31
% - (115*x^4)/6 + (1860*x^3)/23 - (648*x^2)/25 - 19*x + 91/15
if isempty( x ) % informative call
v = 0;
if nargout > 1
varargout{ 1 } = [ -0.5 3 ];
end
else
v = 91 * x^2 / 30 - 19 * x^3 / 6 - 54 * x^4 / 25 ...
+ 93 * x^5 / 23 - 23 * x^6 / 36 - 121 * x^7 / 93 ...
+ 72 * x^8 / 91 - 13 * x^9 / 74 + 9 * x^10 / 640;
if nargout > 1
g = 91 * x / 15 - 19 * x^2 / 2 - 216 * x^3 / 25 + 465 * x^4 / 23 ...
- 23 * x^5 / 6 - 847 * x^6 / 93 + 576 * x^7 / 91 ...
- 117 * x^8 / 74 + 9 * x^9 / 64;
varargout{ 1 } = g; % f'(x)
if nargout > 2
h = 91 / 15 - 19 * x - 648 * x^2 / 25 + 1860 * x^3 / 23 ...
- 115 * x^4 / 6 - 1694 * x^5 / 31 + 576 * x^6 / 13 ...
- 468 * x^7 / 37 + 81 * x^8 / 64;
varargout{ 2 } = h; % f''(x)
end
end
end
end % custom
% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
end