Как установить grad[ ] в nlopt?
Я хотел бы спросить о NLopt следующим образом. (Веб-сайт NLopt ссылается на Учебник - Документация NLopt[^])
Вопрос 1: Если число ограничений больше числа переменных, то как мы можем установить “grad[ ]” в “myconstraint”? Существует ли какой-либо (автоматический) метод решения задачи без введения множителя Лагранжа?
Используя мультиплексор Лагранжа, я знаю, что мы можем решить эту проблему. Однако при использовании Лагранжева мультиплексора нам приходится получать ”my_constraint_data’ вручную, что затрудняет решение крупномасштабной задачи.
Пример : минимизация f= - ((x1)^3)-(2*(x2)^2)+(10*(x1))-6-(2*(x2)^3) при условии 10-((x1)(x2))>=0, ((x1)(x2)^2)-5>=0 и (x2)-(x1)*(x2)^3 >= 0
Основываясь на приведенной выше задаче, мы имеем три ограничения неравенства, как показано ниже.
Ограничение 1: c1 = 10-(x1)*(x2) >= 0
Ограничение 2: c2 = ((x1)(x2)^2)-5>=0
Ограничение 3: c3 = (x2)-(x1)(x2)^3 >= 0
В учебнике NLopt мы знаем, что grad[0] = d(c1)/d(x1) и grad1 = d(c2)/d(x2) как градиент ограничений. Затем мы устанавливаем grad[ ] следующим образом.
double myconstraint(unsigned n, const double *x, double *grad, void *data) { my_constraint_data *d = (my_constraint_data *)data; if (grad) { grad[0] = -x[1]; //grad[0] = d(c1)/dx[1] grad[1] = 2*x[0]+x[1]; //grad[1] = d(c2)/dx[2] grad[2] = ???; //grad[2] = d(c3)/dx[3] but we only have 2 variable (x1)&(x2) } return (10-x[0]*x[1], x[0]*x[1]*x[1]-5, x[1]-x[0]*x[1]*x[1]*x[1]; }Проблема в том, что мы не знаем, как установить “град[ ]” (особенно для c3), если число ограничений больше числа переменных.
Что я уже пробовал:
Конечно, мы можем решить эту проблему неавтоматическим методом, как показано ниже, используя Лагранжев мультиплексор (l1, l2, l3), где grad[0] = -l1*(d(c1)/d(x1))- l2*(d(c2)/d(x1))-l3*(d(c)/d(x1)) и grad[1] = -l1*(d(c1)/d(x2))- l2*(d(c2)/d(X2))-L3*(D(C)/D(X3)).
double myconstraint(unsigned n, const double *x, double *grad, void *data) { my_constraint_data *d = (my_constraint_data *)data; //set l1, l2, and l3 as parameter of lagrangian multiplier double l1=d->l1,l2=d->l2,l3=d->l3; ++count; if (grad) { grad[0] = l1*x[1]-l2*x[1]*x[1]-l3*x[1]*x[1]*x[1]; grad[1] = l1*x[0]-2*l2*x[0]*x[1]-l3+3*l3*x[0]*x[1]*x[1]; } return (10-x[0]*x[1], x[0]*x[1]*x[1]-5, x[1]-x[0]*x[1]*x[1]*x[1]); }Между тем, применить неавтоматический метод к крупномасштабной задаче непросто, поскольку он будет неэффективен и сложен в программировании.
Вопрос 2: Существует ли какой-либо метод решения нелинейных одновременных уравнений с использованием NLopt? (При применении Лагранжева мультиплексора в случае, когда число ограничений больше числа переменных, следует решать нелинейные одновременные уравнения).
Ваш ответ будет очень полезен для нас. Спасибо.