

If the objective function is smooth, then you should consider an 
implementation of a quasi-newton method such as BFGS, using finite
difference approximations.  

If the objective function is not smooth, then you should look at methods
for "nonsmooth optimization".  

You should probably take a look at "Optimization Software Guide"
by More and Wright.  It has listing of dozens of optimization packages
for different types of problems.

_________________________________________________________________________