Jak zminimalizować nieliniowej funkcji z ograniczeniami w c#?

0

Pytanie

Chciałbym zminimalizować następującą funkcję

enter image description here

z ograniczeniami

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

w C#. Próbowałem zrobić to za pomocą matematyki.Jest to metoda Newtona, ale nie mogę zrozumieć, jak to zrobić. Jak mogę programowo zminimalizować funkcję w C# dla określonych $F_1, F_2$?

Odśwież: Po komentarzu @MinosIllyrien próbowałem następujący, ale nie rozumiem składni:

_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;
}

To nie działa, bo metoda FindMinimum wymaga IObjectiveFunction jako funkcji, a nie funkcji IScalarObjectiveFunction...

Aktualizacja 2: Próbowałem rozwiązanie od 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);

To prowadzi do błędu, że *-operator nie może służyć do "Zmiennej" i "Zmienna". Ma ktoś jakieś pomysły?

1

Najlepsza odpowiedź

0

w ₁2 + w ₂2 = 1-to jest w zasadzie pojedynczy krąg. Pojedynczy krąg może być również opisany w następujący параметрическим równaniem:

(bo t, sin t)

Innymi słowy, dla każdej pary (w₁, w₂) istnieje kąt t, dla którego w ₁ = cos t i w ₂ = sin t.

Przy takiej wymianie funkcja staje się:

y = F ₁ cos t + F ₂ sin t

w ₁ ≥ 0, w ₂ ≥ 0 ogranicza t jednym квадрантом. To zostawia was z bardzo prostym ograniczeniem, która składa się z jednej zmiennej:

0 ≤ t ≤ ½π

Przy okazji, funkcję można uprościć do:

y = R cos(t - α)

gdzie R = √(F ₁2 + F ₂2) i α = atan2(F₂, F₁)

Jest to prosta sinusoidy. Bez ograniczenia na t jego zakres był [-R, R], co stanowiło by minimalna wartość-R. Ale ograniczenie ogranicza obszar i, w konsekwencji, zakres:

  • Jeśli F ₁ < 0 i F ₂ < 0, to co najmniej na dworzec ₁ = - F ₁ / p, g ₂ = - F ₂ / R, Z R = -P
  • Dla 0 < F ₁ ≤ F ₂ najmniej równy w ₁ = 1, w ₂ = 0, gdy y = F
  • Dla 0 < F ₂ ≤ F ₁ najmniej równy w ₁ = 0, w ₂ = 1, y = F

Uwagi:

  • jeśli F ₁ = F ₂ > 0, to masz dwa minimum.
  • jeśli F ₁ = F ₂ = 0, to y jest wszędzie równa zero.

W kodzie:

_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

Także trzeba będzie sprawdzić, co i w1 i w2 неотрицательны. Jeśli nie, to rozwiązanie będzie albo (0,1), albo (1,0).
Mark Pattison

@MarkPattison Dziękuję, że podałeś na to; jestem odpowiednio edytowany przez swoją odpowiedź.
Ruud Helderman

W innych językach

Ta strona jest w innych językach

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