49 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Matlab
		
	
	
	
	
	
			
		
		
	
	
			49 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Matlab
		
	
	
	
	
	
| function [a, b, k, n] = fmin_bisection(fun, alpha, beta, epsilon, lambda)
 | |
| % Bisection method for finding the local minimum of a function.
 | |
| %
 | |
| % fun:      The objective function
 | |
| % alpha:    (number) The starting point of the interval in which we seek
 | |
| %           for minimum
 | |
| % beta:     (number) The ending point of the interval in which we seek
 | |
| %           for minimum
 | |
| % epsilon:  (number) The epsilon value (distance from midpoint)
 | |
| % lambda:   (number) The lambda value (accuracy)
 | |
| %
 | |
| % return:
 | |
| %  a:       (vector) Starting points of the interval for each iteration
 | |
| %  b:       (vector) Ending points of the interval for each iteration
 | |
| %  k:       (number) The number of iterations
 | |
| %  n:       (number) The calls of objective function fun_expr
 | |
| %
 | |
| 
 | |
| 
 | |
| 
 | |
| % Error checking
 | |
| if alpha > beta || 2*epsilon >= lambda || lambda <= 0
 | |
|     error ('Input criteria not met')
 | |
| end
 | |
| 
 | |
| % Init
 | |
| a = alpha;
 | |
| b = beta;
 | |
| n = 0;
 | |
| 
 | |
| k=1;
 | |
| while b(k) - a(k) > lambda
 | |
|     % bisect [a,b]
 | |
|     mid = (a(k) + b(k)) / 2;
 | |
|     x_1 = mid - epsilon;
 | |
|     x_2 = mid + epsilon;
 | |
|     
 | |
|     % set new search interval
 | |
|     k = k + 1;
 | |
|     if fun(x_1) < fun(x_2)
 | |
|         a(k) = a(k-1);
 | |
|         b(k) = x_2;
 | |
|     else
 | |
|         a(k) = x_1;
 | |
|         b(k) = b(k-1);
 | |
|     end
 | |
| end
 | |
| 
 | |
| end |