कैसे कम करने के लिए एक गैर रेखीय समारोह की कमी के साथ सी#में?

0

सवाल

मैं होगा की तरह कम करने के लिए निम्न कार्य

enter image description here

की कमी के साथ

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

में C#. मैं इसे करने की कोशिश की के साथ Math.Net'एस न्यूटन की विधि, लेकिन मैं नहीं कर सकते हैं बाहर आंकड़ा कैसे यह करने के लिए । मैं कैसे कर सकते हैं कम से कम समारोह प्रोग्राम के रूप में 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: मैं करने की कोशिश की एक समाधान से गूगल:

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

डब्ल्यू₁2 + w₂2 = 1 है, मूल रूप से यूनिट के चक्र पर. यूनिट सर्कल भी किया जा सकता द्वारा वर्णित निम्नलिखित पैरामीट्रिक समीकरण:

(cos t, पाप टी)

दूसरे शब्दों में, के लिए हर जोड़ी (डब्ल्यू ₁ , डब्ल्यू ₂ ), वहाँ है एक कोण टी के लिए जो डब्ल्यू ₁ = cos t और w ₂ = पाप टी.

उस के साथ प्रतिस्थापन, समारोह हो जाता है:

y = F ₁ cos t + F ₂ पाप टी

डब्ल्यू ₁ ≥ 0, डब्ल्यू ₂ ≥ 0 प्रतिबंधित टी करने के लिए एक एकल वृत्त का चतुर्थ भाग. यह पत्ते आप के साथ एक बहुत ही सरल बाधा के होते हैं कि एक एकल चर:

0 ≤ टी ≤ ½π

वैसे, कार्य कर सकते हो सरलीकृत करने के लिए:

y = R cos(टी - α)

जहां आर = √(एफ₁2 + F₂2) और α = atan2(एफ ₂ , एफ ₁ )

यह एक सरल साइन लहर. बिना बाधा टी, अपनी सीमा के लिए किया जाएगा [-आर, आर], न्यूनतम -आर. लेकिन बाधा सीमा डोमेन और इस तरह की रेंज:

  • यदि F ₁ < 0 और एफ ₂ < 0 है, तो कम है पर डब्ल्यू ₁ = - F ₁ / R, w ₂ = - F ₂ / आर, के साथ y = -R
  • के लिए 0 < F ₁ ≤ F ₂ , एक न्यूनतम पर है डब्ल्यू ₁ = 1, डब्ल्यू ₂ = 0, के साथ y = F
  • के लिए 0 < F ₂ ≤ F ₁ , एक न्यूनतम पर है डब्ल्यू ₁ = 0, डब्ल्यू ₂ = 1, y = F

नोट्स:

  • यदि F ₁ = F ₂ > 0, तो आप दो minima.
  • यदि 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ý
..................................................................................................................

इस श्रेणी में लोकप्रिय

लोकप्रिय सवाल इस श्रेणी में