Member 13922009 Ответов: 1

Как установить 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? (При применении Лагранжева мультиплексора в случае, когда число ограничений больше числа переменных, следует решать нелинейные одновременные уравнения).

Ваш ответ будет очень полезен для нас. Спасибо.

1 Ответов

Рейтинг:
4

Richard MacCutchan

Скорее всего, вы получите более быстрый ответ по адресу NLopt-страница обсуждения информации[^].