--- /dev/null
+function f = powell(x1,x2,x3,x4)
+ ## The Powell function. See Dennis & Schnabel, Appendix B, problem
+ ## #1. (The "regular" Powell function is simply the Extended Powell
+ ## with m=1).
+ ##
+ ## This function has a minimum at x=(0,0,0,0) with f(x) == 0. The
+ ## suggested starting point is x0=(3,-1,0,1).
+ ##
+ f = (x1 + 10*x2)^2 + 5*(x3 - x4)^2;
+ f = f + (x2 - 2*x3)^4 + 10*(x1 - x4)^4;
+end
--- /dev/null
+function f = powell1(x)
+ ##
+ ## A version of the Powell function which takes a column 4-vector as
+ ## an argument instead of four distinct arguments.
+ ##
+ if (length(x) == 4)
+ f = powell(x(1), x(2), x(3), x(4));
+ else
+ f = NA;
+ end
+end
--- /dev/null
+## Test the optimal point.
+
+unit_test_equals("powell1([0;0;0;0]) == 0", ...
+ 0, ...
+ powell1([0;0;0;0]));
+
+## It should fail with the wrong number of coordinates.
+f = powell1([1;2;3]);
+unit_test_equals("powell1 fails with too few coordinates", ...
+ true, ...
+ isna(f));
+
+f = powell1([1;2;3;4;5]);
+unit_test_equals("powell1 fails with too many coordinates", ...
+ true, ...
+ isna(f));
--- /dev/null
+## Test the optimal point.
+
+unit_test_equals("powell(0,0,0,0) == 0", ...
+ 0, ...
+ powell(0,0,0,0));