C # ' daki kısıtlamalarla doğrusal olmayan bir işlev nasıl en aza indirilir?

0

Soru

Aşağıdaki işlevi en aza indirmek istiyorum

enter image description here

kısıtlamalarla

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

C#. Bunu yapmaya çalıştım Math.Net Newton Yöntemi, ama nasıl yapacağımı çözemiyorum. Verilen $F_1, F_2$için işlevi programlı olarak C# ' da nasıl en aza indirebilirim?

Güncelleme: @Minosillyrien'in yorumundan sonra aşağıdakileri denedim, ancak sözdizimini anlamıyorum:

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

Bu işe yaramaz, çünkü FindMinimum yöntemi İScalarObjectiveFunction değil, işlev olarak IObjectiveFunction gerektirir...

Güncelleme 2: Google'dan bir çözüm denedim:

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);

Bu, *- işlecinin "Değişken" ve "Değişken"için kullanılamayacağı hatasını atar. Birisi bir fikriniz var mı?

1

En iyi cevabı

0

w ₁2 + w22 = 1 temel olarak birim çemberdir. Birim çember aşağıdaki parametrik denklemle de tanımlanabilir:

(çünkü t, günah t)

Başka bir deyişle, her çift için (w₁, w pair), w ∞ = cos t ve w ∞ = sin t olan bir t açısı vardır.

Bu ikame ile, işlev olur:

y = F √ çünkü t + F √ günah t

w ≤ 0, w ≤ 0 t'yi tek bir çeyrekle sınırlar. Bu, sizi tek bir değişkenden oluşan çok basit bir kısıtlama ile bırakır:

0 ≤ t ≤ ½π

Bu arada, işlev şu şekilde basitleştirilebilir:

y = R cos (t-α)

burada R = √(F √ 2 + F √ 2) ve α = atan2 (F√, F√)

Bu basit bir sinüs dalgasıdır. T kısıtlaması olmadan, aralığı [- R, R] olur ve minimum-R olur. Ancak kısıtlama, etki alanını ve dolayısıyla aralığı sınırlar:

  • Eğer F ₁ < 0 ve Fürün < 0, o zaman en azından at w ₁ = - F ₁ / R, würün = -Fürün / Rile y = -R
  • 0 < FF ≤ için en az w ≤ = 1, w ≤ = 0, y = F ≤ ile
  • 0 < FF ≤ için en az w ≤ = 0, w ≤ = 1, y = F ≤ ile

Notlar:

  • eğer F ₁ = F ₂ > 0 ise, o zaman iki minimumunuz vardır.
  • eğer F ₁ = F ₂ = 0 ise, o zaman y her yerde sadece düz sıfırdır.

Kodda:

_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

Ayrıca hem w1'in hem de w2'nin negatif olmadığını kontrol etmeniz gerekir. Değilse, çözüm (0,1) veya (1,0) olacaktır.
Mark Pattison

@MarkPattison Bunu işaret ettiğiniz için teşekkür ederim; Cevabımı buna göre düzenledim.
Ruud Helderman

Diğer dillerde

Bu sayfa diğer dillerde

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