Как минимизировать нелинейную функцию с ограничениями в c#?

0

Вопрос

Я хотел бы свести к минимуму следующую функцию

enter image description here

с ограничениями

$$w_i \geq 0, \sqrt{w_1^2 + w_2^2} = 1$$

в C#. Я пытался сделать это с помощью математики.Это метод Ньютона, но я не могу понять, как это сделать. Как я могу программно минимизировать функцию в C# для заданных $F_1, F_2$?

Обновить: После комментария @MinosIllyrien я попробовал следующее, но я не понимаю синтаксис:

_f1 = 0.3; // Global fields.
_f2 = 0.7;

var minimizer = new NewtonMinimizer(1E-4, 100, false);
var objectiveFunction = ObjectiveFunction.ScalarDerivative(FunctionToMinimize, GradientOfFunctionToMinimize);
var firstGuess = CreateVector.DenseOfArray(new[] {0.5});
var minimalWeight1 = minimizer.FindMinimum(objectiveFunction, firstGuess).MinimizingPoint;

private double GradientOfFunctionToMinimize(double w1){
  return _f1 - (w1 * _f2) / Math.Sqrt(1 - Math.Pow(w1, 2));
}

private double FunctionToMinimize(double w1){
  return w1 * _f1 + Math.Sqrt(1 - Math.Pow(w1, 2)) * _f2;
}

Это не работает, потому что метод FindMinimum требует IObjectiveFunction в качестве функции, а не функции IScalarObjectiveFunction...

Обновление 2: Я попробовал решение от Google:

var solver = Solver.CreateSolver("GLOP");
Variable w1 = solver.MakeNumVar(0.0, double.PositiveInfinity, "w1");
Variable w2 = solver.MakeNumVar(0.0, double.PositiveInfinity, "w2");

solver.Add(Math.Sqrt(w1*w1 + w2*w2) == 1);

Это приводит к ошибке, что *-оператор не может использоваться для "Переменной" и "Переменной". У кого-нибудь есть идеи?

1

Лучший ответ

0

w ₁2 + w ₂2 = 1-это в основном единичный круг. Единичный круг также может быть описан следующим параметрическим уравнением:

(потому что т, грех т)

Другими словами, для каждой пары (w₁, w₂) существует угол t, для которого w ₁ = cos t и w ₂ = sin t.

При такой замене функция становится:

y = F₁ cos t + F₂ sin t

w ₁ ≥ 0, w ₂ ≥ 0 ограничивает t одним квадрантом. Это оставляет вас с очень простым ограничением, которое состоит из одной переменной:

0 ≤ t ≤ ½π

Кстати, функцию можно упростить до:

y = R cos(t - α)

где R = √(F ₁2 + F ₂2) и α = atan2(F₂, F₁)

Это простая синусоидальная волна. Без ограничения на t его диапазон был бы [-R, R], что составляло бы минимальное значение-R. Но ограничение ограничивает область и, следовательно, диапазон:

  • Если Ф ₁ < 0 и Ф ₂ < 0, то минимум на ж ₁ = - Ф ₁ / р, ж ₂ = - Ф ₂ / Р, С Г = -Р
  • Для 0 < F ₁ ≤ F ₂ минимум равен w ₁ = 1, w ₂ = 0, при y = F
  • Для 0 < F ₂ ≤ F ₁ минимум равен w ₁ = 0, w ₂ = 1, при y = F

Примечания:

  • если F ₁ = F ₂ > 0, то у вас есть два минимума.
  • если F ₁ = F ₂ = 0, то y везде равняется нулю.

В коде:

_f1 = 0.3;
_f2 = 0.7;

if (_f1 == 0.0 && _f2 == 0.0) {
    Console.WriteLine("Constant y = 0 across the entire domain");
}
else if (_f1 < 0.0 && _f2 < 0.0) {
    var R = Math.sqrt(_f1 * _f1 + _f2 * _f2);
    Console.WriteLine($"Minimum y = {-R} at w1 = {-_f1 / R}, w2 = {-_f2 / R}");
}
else {
    if (_f1 <= _f2) {
        Console.WriteLine($"Minimum y = {_f1} at w1 = 1, w2 = 0");
    }
    if (_f1 >= _f2) {
        Console.WriteLine($"Minimum y = {_f2} at w1 = 0, w2 = 1");
    }
}
2021-11-26 10:11:03

Вам также нужно будет проверить, что и w1, и w2 неотрицательны. Если нет, то решение будет либо (0,1), либо (1,0).
Mark Pattison

@MarkPattison Спасибо, что указали на это; я соответствующим образом отредактировал свой ответ.
Ruud Helderman

На других языках

Эта страница на других языках

Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................