ยังไงเพื่อย่อที่มองไม่เชิงเส้นฟังก์ชันกับโครงสรางอยู่ใน c#?

0

คำถาม

ฉันต้องการจะย่องตามฟังก์ชัน

enter image description here

กับโครงสราง

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

ใน C#. ฉันพยายามจะทำยังไงกับมัน Math.Net's นิวตันวิธีการแต่ผมยังคิดไม่ออกว่าต้องทำยังไง จะให้ฉันเพิ่มฟังก์ชัน programmatically ใน 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

w₁2+ w₂2=1 นจบลงโดยที่ หน่วยงานวงกลม. หน่วยวงกลมยังสามารถถูกเรียกโดยต่อไปนี้ parametric สมการ:

(เพราะ ที,บาป t)

หรือจะพูดอีกอย่างสำหรับทุกคู่(w₁, w₂), มันมีมุมมอง ที เพื่อที่ w₁=เพราะ ที และ w₂=บาป t.

กับการแทน,ฟังก์ชันจะกลายเป็น:

พวก = F₁เพราะ ที + F₂บาป t

w₁≥0, w₂≥0 restricts ที เพื่อนนัดเดียวเลยเดี๋ยวนี้! นี่เหลือนายกับเรียบง่าย constraint นั่นต้องใช้ของนัดเดียวตัวแปร:

0≤ ที ≤½π

โดยวิธีการที่ฟังก์ชันสามารถเป็น ประยุกต์@item text character set ไปยัง:

พวก = สเปนเซอร์รี้ดครับ R cos(t -α)

ที่ สเปนเซอร์รี้ดครับ R =√(F₁2+ F₂2)และ α= atan2(F₂, F₁)

นี่เป็นเรียบง่ายคลื่นไซน์กคลื่นซัดเลยแฮะ โดยไม่มี constraint บ ทีมันจะเป็นช่วง[-สเปนเซอร์รี้ดครับ R, สเปนเซอร์รี้ดครับ R]ทำให้คนน้อยที่สุด-สเปนเซอร์รี้ดครับ R. แต่ constraint ขีดจำกัดคอโดเมนด้านบนและมันในช่วง:

  • ถ้า F₁<0 และ F₂<0 แล้วที่น้อยที่สุดคือที่ w₁=-F₁/ อาร์, w₂=-F₂/ อาร์กับ พวก =-สเปนเซอร์รี้ดครับ R
  • สำหรับ 0< F₁≤ F₂งน้อยอยู่ที่ w₁=1, w₂=0 กับ พวก = F
  • สำหรับ 0< F₂≤ F₁งน้อยอยู่ที่ w₁=0, w₂=1 กับ พวก = F

บันทึกย่อ:

  • ถ้า F₁= F₂>0 แล้วคุณมีสอง minima.
  • ถ้า F₁= F₂=0,งั้น พวก ก็แค่แบศูนย์อยู่ทุกที่เลย

รหัส:

_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ý
..................................................................................................................

ดังอยู่ในนี้หมวดหมู่

ดังคำถามอยู่ในนี้หมวดหมู่