Ok the first error I could see, is that I declared inequality constraints in the code. But I changed it to equality constraint, and the result is the same.
From: [email protected] To: [email protected] Date: Mon, 9 Apr 2012 03:02:21 +0200 Subject: [NLopt-discuss] Nonlinear derivative-free constrained minimization using COBYLA Hello everybody. I'm using NLopt as an C++ alternative to the "fmincon" function of Matlab or the "sqp" function of Octave. I have a nonlinear equality constraint and a nonlinear function that I want to minimize without using its the derivatives. It seems the best algorithm to use, with NLopt, is the COBYLA one. I was able to run the tutorial example without any problem, but when I try my own function it's not working. For example (a problem I created just to test): min f(x1,x2) = 100*(x1² - 1) + x2² - 39*x1; subject to x1² + x2² = 22; I tried a C++ and a C version of the code, the first one returns me a roundoff_limited error, and the second one an "inf". Here is the C version (all in a single cpp file): #include <iostream> #include <math.h> #include <nlopt.h> double myfunc(unsigned n, const double *x, double *grad, void *my_func_data); double myconstraint(unsigned n, const double *x, double *grad, void *data); double myfunc(unsigned n, const double *x, double *grad, void *my_func_data) { return 100.0 * (x[0]*x[0] - 1.0) + x[1]*x[1] - 39.0 * x[0]; } double myconstraint(unsigned n, const double *x, double *grad, void *data) { return (x[0]*x[0] + x[1]*x[1] - 22.0); } int main() { nlopt_opt opt; opt = nlopt_create(NLOPT_LN_COBYLA, 2); /* algorithm and dimensionality */ nlopt_set_min_objective(opt, myfunc, NULL); nlopt_add_inequality_constraint(opt, myconstraint, NULL, 1e-8); nlopt_add_inequality_constraint(opt, myconstraint, NULL, 1e-8); nlopt_set_xtol_rel (opt, 1.0e-5); double x[2] = { -1.0, 1.0 }; /* some initial guess */ double minf; /* the minimum objective value, upon return */ nlopt_optimize(opt, x, &minf); std::cout << "found minimum at f(" << x[0] << ", " << x[1] << ") = " << minf << "\n" << std::endl; return 0; } Since Octave was able to give me suiting results, I don't think the problem comes from my function, so maybe I forgot something in the design of the solver. Can somebody please tell me where I'm wrong? Thank you. Mangaf _______________________________________________ NLopt-discuss mailing list [email protected] http://ab-initio.mit.edu/cgi-bin/mailman/listinfo/nlopt-discuss
_______________________________________________ NLopt-discuss mailing list [email protected] http://ab-initio.mit.edu/cgi-bin/mailman/listinfo/nlopt-discuss
