Part I: An interactive program for Unconstrained Optimization


The second derivative test generalizes naturally to give a test for multivariable optimization. If $Df$ represents the matrix derivative of a function $f(x,y)$, then critical points are where $Df(x,y)=0$ . The second derivative, $D2f(x,y)$, called the Hessian matrix, can be used to test if a critical point is a maximum (both eigenvalues negative), minimum (both eigenvalues positive), or a saddle point (eigenvalues have different signs). The eigenvectors tell the directions in which the second derivative is a maximum or minimum.

In this project you are supposed to
a) Extend this sage notebook so the user can specify any two dimensional objective function
b) Develop the same application in MatLab using a GUI interface
c) Develop the same application in python using a GUI interface

{{{id=3| def illustrate_test(f, fvals=(-5,5), tvals=(-3,3)): """ Return a table of critical points, eigenvalues, and eigenvectors, plus a 3D graph illustrating the curvature at each critical point. INPUTS: f -- a function. Usually this should be a callable function, defined like f(x,y)=x^2+y^2, for example. fvals (default (-5,5)) -- minimum and maximum values for the function plot tvals (default (-3,3)) -- minimum and maximum values for the parameter in the curves at each critical point """ line_thickness=3 surface_color='blue' line_color = ['red','blue'] x,y,t=var('x,y,t') tmin, tmax = tvals fmin, fmax = fvals f_parametric = vector([x,y,f(x,y)]) picture = plot3d(f,(x,fmin,fmax),(y,fmin,fmax), opacity=0.3, surface_color=surface_color) hessian=f(x,y).hessian() solns=solve([eqn(x,y)==0 for eqn in f.gradient()],[x,y], solution_dict=True) table=[['Color','Critical Point', 'Eigenvalue', 'Eigenvector']] pictures=[] i=0 for solution in [s for s in solns if s[x] in RR and s[y] in RR]: soln = dict([(key,RDF(val)) for key,val in solution.items()]) critical_point = f_parametric(soln) hessian_at_point = hessian(soln).change_ring(RDF) evals,evecs=hessian_at_point.eigenmatrix_right() evals = evals.diagonal() picture += point3d(critical_point.list(), color='green', size=10) for eval,evec in zip(evals,evecs.columns()): direction_plot = evec.plot(width=line_thickness,color=line_color[i%2]).plot3d().translate(critical_point) curve_formula = f_parametric(x=soln[x]+t*evec[0],y=soln[y]+t*evec[1]) curve = parametric_plot(curve_formula, (t,tmin,tmax),color=line_color[i%2],thickness=line_thickness) picture+=curve+direction_plot pictures += [curve] table.append(["%(c)s"%{'c':line_color[i%2]},critical_point, eval, (evec)]) i+=1 return table, picture var('x,y') @interact def _(f=selector([-x^2+y^2, x*y*exp((-x^2-y^2)/3), x^3-3*x+y^2-4*y], label="$f(x,y)=$")): f(x,y)=f table, graph=illustrate_test(f) html.table(table,header=True) show(graph) /// }}} {{{id=4| /// }}}