bezumes
22-04-2007, 18:01
Здравствуйте. Посмотрите пожалуйста правильно ли я решил задачу нахождения минимума функции методом покоординатного (градиентного спуска).
Почему-то у меня при градиентном спуске при любых значениях одна итерация итерируется.
Количество итераций при покоординатном спуске то же подозрительно мало.
Исходные данные:
Функция- a*x*x+b*y*y-c*x*y-d*y
где a,b,c,d коофициенты х,у координаты начальной точки (все вводятся с клавиатуры)также есть е(погрешность>=10^-5
Rem покоординатный спуск
Private Sub Command1_Click()
Dim a As Double
Dim b As Double
Dim c As Double
Dim d As Double
Dim x As Double
Dim y As Double
Dim e As Double
a = Text1.Text
b = Text2.Text
c = Text3.Text
d = Text4.Text
x = Text5.Text
y = Text6.Text
e = 0.000001
Dim f(2) As Double
Dim schet As Integer
schet = 0
f(0) = 1
f(1) = 0
Dim x1 As Double
Dim x2 As Double
x1 = 1
x2 = 0
While x1 - x2 > e
Rem Получаю значение функции начальное
Call fun(a, b, c, d, x, y, f(0))
x1 = x
schet = schet + 1
Rem нахожу новую точку минимума по х и по у
Call funx(a, b, c, d, x, y)
Call funy(a, b, c, d, x, y)
x2 = x
Rem значение функции с новой точкой
Call fun(a, b, c, d, x, y, f(1))
Wend
Text7.Text = f(1)
Text8.Text = schet
End Sub
Private Sub fun(a, b, c, d, x, y, f)
f = a * x * x + b * y * y - c * x * y - d * y
End Sub
Private Sub funx(a, b, c, d, x, y)
Rem y=const
Rem производная f = 2 * a * x - cy
Rem f''=2a
Dim extremum As Double
Dim toch_min As Double
extremum = (c * y) / (2 * a)
If (2 * a > 0) Then
toch_min = extremum
Rem Call fun(a, b, c, d, toch_min, y, f)
x = toch_min
End If
End Sub
Private Sub funy(a, b, c, d, x, y)
Rem x=const
Rem производная f = 1 + 2 * b * y - c * x - d
Rem f''=2*b
Dim extremum As Double
Dim toch_min As Double
extremum = (d + c * x - 1) / (2 * b)
Rem Call fun(a, b, c, d, x, toch_min, f)
If (2 * b > 0) Then
toch_min = extremum
y = toch_min
End If
End Sub
Rem градиентный спуск
Private Sub Command2_Click()
Dim a As Double
Dim b As Double
Dim c As Double
Dim d As Double
Dim x As Double
Dim y As Double
Dim e As Double
a = Text1.Text
b = Text2.Text
c = Text3.Text
d = Text4.Text
x = Text5.Text
y = Text6.Text
e = 0.000001
Dim f(3) As Double
Dim schet As Integer
f(0) = 1
f(1) = 0
f(2) = 0
f(3) = 0
Rem уменьшение функции >погрешности
While f(0) - f(1) > e
schet = schet + 1
Rem x1 = x
Rem y1 = y
Rem Получаю значение функции начальное
Call fun(a, b, c, d, x, y, f(0))
Rem нахожу новую точку минимума по х и по у
Call prox(a, b, c, d, x, y, f(2))
Call proy(a, b, c, d, x, y, f(3))
Rem значение функции с новой точкой
x = x - f(2)
y = y - f(3)
Call fun(a, b, c, d, x, y, f(1))
Wend
Text7.Text = f(1)
Text8.Text = schet
End Sub
Private Sub prox(a, b, c, d, x, y, f)
f = 2 * a * x - cy
End Sub
Private Sub proy(a, b, c, d, x, y, f)
f = 1 + 2 * b * y - c * x - d
End Sub
З.Ы. Еще надобно нарисовать график это функции, но как я рисуется такой график я не понимаю.
Почему-то у меня при градиентном спуске при любых значениях одна итерация итерируется.
Количество итераций при покоординатном спуске то же подозрительно мало.
Исходные данные:
Функция- a*x*x+b*y*y-c*x*y-d*y
где a,b,c,d коофициенты х,у координаты начальной точки (все вводятся с клавиатуры)также есть е(погрешность>=10^-5
Rem покоординатный спуск
Private Sub Command1_Click()
Dim a As Double
Dim b As Double
Dim c As Double
Dim d As Double
Dim x As Double
Dim y As Double
Dim e As Double
a = Text1.Text
b = Text2.Text
c = Text3.Text
d = Text4.Text
x = Text5.Text
y = Text6.Text
e = 0.000001
Dim f(2) As Double
Dim schet As Integer
schet = 0
f(0) = 1
f(1) = 0
Dim x1 As Double
Dim x2 As Double
x1 = 1
x2 = 0
While x1 - x2 > e
Rem Получаю значение функции начальное
Call fun(a, b, c, d, x, y, f(0))
x1 = x
schet = schet + 1
Rem нахожу новую точку минимума по х и по у
Call funx(a, b, c, d, x, y)
Call funy(a, b, c, d, x, y)
x2 = x
Rem значение функции с новой точкой
Call fun(a, b, c, d, x, y, f(1))
Wend
Text7.Text = f(1)
Text8.Text = schet
End Sub
Private Sub fun(a, b, c, d, x, y, f)
f = a * x * x + b * y * y - c * x * y - d * y
End Sub
Private Sub funx(a, b, c, d, x, y)
Rem y=const
Rem производная f = 2 * a * x - cy
Rem f''=2a
Dim extremum As Double
Dim toch_min As Double
extremum = (c * y) / (2 * a)
If (2 * a > 0) Then
toch_min = extremum
Rem Call fun(a, b, c, d, toch_min, y, f)
x = toch_min
End If
End Sub
Private Sub funy(a, b, c, d, x, y)
Rem x=const
Rem производная f = 1 + 2 * b * y - c * x - d
Rem f''=2*b
Dim extremum As Double
Dim toch_min As Double
extremum = (d + c * x - 1) / (2 * b)
Rem Call fun(a, b, c, d, x, toch_min, f)
If (2 * b > 0) Then
toch_min = extremum
y = toch_min
End If
End Sub
Rem градиентный спуск
Private Sub Command2_Click()
Dim a As Double
Dim b As Double
Dim c As Double
Dim d As Double
Dim x As Double
Dim y As Double
Dim e As Double
a = Text1.Text
b = Text2.Text
c = Text3.Text
d = Text4.Text
x = Text5.Text
y = Text6.Text
e = 0.000001
Dim f(3) As Double
Dim schet As Integer
f(0) = 1
f(1) = 0
f(2) = 0
f(3) = 0
Rem уменьшение функции >погрешности
While f(0) - f(1) > e
schet = schet + 1
Rem x1 = x
Rem y1 = y
Rem Получаю значение функции начальное
Call fun(a, b, c, d, x, y, f(0))
Rem нахожу новую точку минимума по х и по у
Call prox(a, b, c, d, x, y, f(2))
Call proy(a, b, c, d, x, y, f(3))
Rem значение функции с новой точкой
x = x - f(2)
y = y - f(3)
Call fun(a, b, c, d, x, y, f(1))
Wend
Text7.Text = f(1)
Text8.Text = schet
End Sub
Private Sub prox(a, b, c, d, x, y, f)
f = 2 * a * x - cy
End Sub
Private Sub proy(a, b, c, d, x, y, f)
f = 1 + 2 * b * y - c * x - d
End Sub
З.Ы. Еще надобно нарисовать график это функции, но как я рисуется такой график я не понимаю.