Золотое сечение

Автор: Пользователь скрыл имя, 24 Января 2011 в 23:36, контрольная работа

Описание работы

Сравнение различных процедур линейного поиска естественно производить в соответствии со следующим коэффициентом сжатия (длина интервала неопределенности после k выполненных наблюдений)/(длина интервала неопределенности до выполнения наблюдений).

Работа содержит 1 файл

Вариант 19.doc

— 296.00 Кб (Скачать)

Задание 1. 

п/п

Целевая функция  f(x) Определить Метод численного решения
19 (x-4)3´ log0.5(x-3)+1 максимум Сечения
 

Метод золотого сечения 

Сравнение различных  процедур линейного поиска естественно  производить в соответствии со следующим  коэффициентом сжатия (длина интервала неопределенности после k выполненных наблюдений)/(длина интервала неопределенности до выполнения наблюдений). 
Очевидно, что более эффективные схемы соответствуют меньшим значениям коэффициента сжатия. В дихотомическом поиске значение коэффициента приблизительно равно (0.5)^(k/2). Метод золотого сечения является более эффективным, для него значение коэффициента сжатия равно (0.618)^(k-1). 
 
Рассмотрим такое симметричное расположение точек x1 и x2 на отрезке [a,b], при котором одна из них становится пробной точкой и на новом отрезке, полученном после исключения части исходного отрезка. Использование таких точек позволяет, кроме первой, ограничиться определением только одного значения f(x), так как другое значение уже найдено на одной из предыдущих итераций. Для определения точек x1 и х2 рассмотрим сначала отрезок [0,1] и для определенности положим, что при уменьшении исключается правая часть этого отрезка. Пусть х2=q, тогда симметрично расположенная точка x1=1-q. Пробная точка х1 отрезка [0,1] перейдет в пробную точку х1'=1-q нового отрезка [1,q]. Чтобы точки x2=q и x2'=1-q делили отрезоки [0,1] и [0,q] в одном и том же отношении, должно выполняться равенство 
1/q = q/(1-q) или q^2 = 1-q 
откуда находим положительное значение q = 0.61803... 
Таким образом для произвольного отрезка [a,b] выражения для пробных точек примут вид: 
x1=a+(1-q)(b-a) x2=a+q*(b-a) 
 

Алгоритм  метода золотого сечения

 
Алгоритм метода золотого сечения  для минимизации строго квазивыпуклой  фунции на интервале [a1,b1].

Начальный этап. Выбрать допустимую конечную длину интервала неопределенности l>0. Пусть [a1,b1] - начальный интервал неопределенности. Положить p1=a1+(1-0.618)(b1-a1) и q1=a1+0.618(b1-a1). Вычислить F(p1) и F(q1), положить k=1 и перейти к основному этапу.

Основной этап.

Шаг 1. Если bk-ak < l, то остановиться; точка минимума принадлежит  интервалу [ak,bk]. В противном если F(pk)>F(qk), то перейти к шагу 2, а  если F(pk)<=F(qk),то к шагу 3. 
Шаг2. Положить a[k+1]=pk, b[k+1]=bk, p[k+1]=qk, q[k+1]=a[k+1]+0.618(b[k+1]-a[k+1]). Вычислить F(q[k+1]) и перейти к шагу 4. 
Шаг3. Положить a[k+1]=ak, b[k+1]=qk,q[k+1]=pk, p[k+1]=a[k+1]+(1-0.618)(b[k+1]-a[k+1]). Вычислить F(p[k+1]) и перейти к шагу 4. Шаг4. Заменить k на k+1 и перейти к шагу 1.
 
 

Ход решения 

В открытом листе  таблицы создадим кнопку для управления вычислением.

Она находится на панели элементов  управления и называется кнопка.

Изменим имя  листа и назовем его «сечение». Перейдем в Визуал Бейсик и откроем процедуру Private Sub CommandButton1_Click(). В этой процедуре напишем программу согласно алгоритма. Программа будет выглядеть следующим образом. 

Function Fny(x)

' Вычисление  заданной функции,

Fny = (x - 4) ^ 3 * (Log(x - 3) / Log(0.5)) + 1

End Function 

Private Sub CommandButton1_Click()

' метод золотого  сечения

a = Val(InputBox("Ввод а", "Нижний предел"))      ввод значений

b = Val(InputBox("Ввод b", "Верхний предел"))

e = Val(InputBox("Ввод e", "точность"))

i = 7 

While Abs(b - a) > e              цикл вычисляет до тех пор пока разница между пределами

x1 = (b + a) / 2 - e / 2             не станет меньше заданной точности

x2 = (b + a) / 2 + e / 2 

F1 = Fny(x1)

F2 = Fny(x2) 

If F1 < F2 Then                      проверка  для нахождения максима функции

xmax = x1

Fmax = F1

a = x2

Else

xmax = x2

Fmax = F2

b = x1

End If

i = i + 1                                   вывод полученных начений

Worksheets("сечение").Cells(i, 1).Value = a

Worksheets("сечение").Cells(i, 2).Value = x1

Worksheets("сечение").Cells(i, 3).Value = x2

Worksheets("сечение").Cells(i, 4).Value = b

Worksheets("сечение").Cells(i, 5).Value = F1

Worksheets("сечение").Cells(i, 6).Value = F2

Worksheets("сечение").Cells(i, 7).Value = Abs(b - a)

Wend

Worksheets("сечение").Cells(i, 1).Value = a

Worksheets("сечение").Cells(i, 2).Value = x1

Worksheets("сечение").Cells(i, 3).Value = x2

Worksheets("сечение").Cells(i, 4).Value = b

Worksheets("сечение").Cells(i, 5).Value = F1

Worksheets("сечение").Cells(i, 6).Value = F2

Worksheets("сечение").Cells(i, 7).Value = Abs(b - a)

i = i + 1

Worksheets("сечение").Cells(i, 3).Value = xmax

Worksheets("сечение").Cells(i, 6).Value = Fmax

Worksheets("сечение").Cells(i, 5).Value = "Fmax"

End Sub 

Перейдем на лист «сечения» и введем необходимые  оформления, в строке 7 введем наименование полученных значений.

После нажатия кнопки «Вычислить» на экране появятся окна для ввода первоначальных значений.

 

 

 

После ввода  пределов и точности получим колонки  вычисленных значений. По результатам значений функции построим график. Выделим колонку значений и выберем команды Вставка-диаграмма-график-готово. Получим график функции.

Блок-схема алгоритма решения. 

 
 
 
 
 

Распечатку  рабочих листов с  решением задачи. 
 
 

 
 
 
 

Задание 2. 

п/п

Условие задания
19 Дана действительная матрица размера m´n. Определить числа b1, ...,  bm,  равные соответственно разностям наибольших и наименьших значений элементов строк.
 

Ход решения 

В откроем новый  лист таблицы и создадим кнопку для  управления вычислением также как и в первом задании. Изменим имя листа и назовем его «матрица». Перейдем в Визуал Бейсик и откроем процедуру Private Sub CommandButton2_Click(). В этой процедуре напишем программу согласно алгоритма. Программа будет выглядеть следующим образом.

Private Sub CommandButton2_Click()

'

' Матрица

'

Dim x(1 To 10, 1 To 10) As Single   объявление массивов 
 

m = Worksheets("матрица").Cells(2, 2).Value  чтение размера массива

n = Worksheets("матрица").Cells(2, 4).Value 

For i = 1 To m

For j = 1 To n       цикл чтения значений массива

x(i, j) = Worksheets("матрица").Cells(i + 2, j).Value

Next j

Next i 

For i = 1 To m   цикл поиска максимума и минимума в строках

Min = x(i, 1)

Max = x(i, 1)

For j = 1 To n

If x(i, j) > Max Then Max = x(i, j)

If x(i, j) < Min Then Min = x(i, j)

Next j

Worksheets("матрица").Cells(i + 2, n + 2).Value = Max – Min     вывод результата

Next i

End Sub 

Перейдем на лист «массив» и введем необходимые  оформления. Ячейку В2 и D2 отведем для значения размера массива. В третьей строке и ниже введем значения массива по указанному размеру.

 
 

После нажатия  на кнопку «Вычислить» получим следующие результаты. 

 
 
 

Блок-схема алгоритма решения. 

 

Выводы:

     На  основе проделанной работы я научился нахождению значения функции при помощи метода золотого сечения с использованием ЭВМ. Метод показал свою эффективность и достаточную точность, а встроенный язык программирования Визуал Бейсик показал свои возможности и гибкость при работе с различными функциями. Встроенный язык программирования, также с успехом работает с большими массива чисел и позволяет проводить различные операции с массивами. 
 

Информация о работе Золотое сечение