Для функции образца:
y = 0.01 * (x - 50)^2 - 5
или properly written like this:
Минимум является mathematically obvious на x = 50
и y = -5
, вы можете verify with google:
Ниже консольное приложение VB.NET, converted from python, находит минимум на x=50.0000703584199, y=-4.9999999999505
, который является правильным для указанного допуска 0.0001
:
Module Module1
Sub Main()
Dim result As Double = GoldenSectionSearch(AddressOf ComputeFunction, 0, 100)
Dim resultString As String = "x=" & result.ToString + ", y=" & ComputeFunction(result).ToString
Console.WriteLine(resultString) 'prints x=50.0000703584199, y=-4.9999999999505
End Sub
Function GoldenSectionSearch(f As Func(Of Double, Double), xStart As Double, xEnd As Double, Optional tol As Double = 0.0001) As Double
Dim gr As Double = (Math.Sqrt(5) - 1)/2
Dim c As Double = xEnd - gr * (xEnd - xStart)
Dim d As Double = xStart + gr * (xEnd - xStart)
While Math.Abs(c - d) > tol
Dim fc As Double = f(c)
Dim fd As Double = f(d)
If fc < fd Then
xEnd = d
d = c
c = xEnd - gr * (xEnd - xStart)
Else
xStart = c
c = d
d = xStart + gr * (xEnd - xStart)
End If
End While
Return (xEnd + xStart)/2
End Function
Function ComputeFunction(x As Double)
Return 0.01 * (x - 50)^2 - 5
End Function
End Module
примечания стороны: ваша первая попытка найти минимум берет на себя все функция дискретна, что очень маловероятно в реальной жизни. То, что вы получите с помощью простого цикла, является очень приблизительной оценкой и долгое время, чтобы найти его, поскольку линейный поиск является наименее эффективным среди других методов.
http://stackoverflow.com/questions/10722467/c-loop-to-find-minima-of-function – Neolisk
Зависит от кривой. 'y = -x^2' является выпуклым, но не имеет минимума. Можете ли вы показать нам «вычислительную функцию» или хотя бы поделиться формулой кривой? – theB
Характер вычисления состоит в том, что его выпуклая кривая, поэтому она будет иметь минимум. –