Автор: Пользователь скрыл имя, 24 Января 2011 в 23:36, контрольная работа
Сравнение различных процедур линейного поиска естественно производить в соответствии со следующим коэффициентом сжатия (длина интервала неопределенности после k выполненных наблюдений)/(длина интервала неопределенности до выполнения наблюдений).
Задание
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[
Шаг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]
Ход
решения
В открытом листе таблицы создадим кнопку для управления вычислением.
Она находится на панели элементов управления и называется кнопка.
Изменим имя
листа и назовем его «сечение».
Перейдем в Визуал Бейсик и откроем процедуру
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 отведем для значения размера массива. В третьей строке и ниже введем значения массива по указанному размеру.
После нажатия
на кнопку «Вычислить» получим следующие
результаты.
Блок-схема
алгоритма решения.
На
основе проделанной работы я научился
нахождению значения функции при помощи
метода золотого сечения с использованием
ЭВМ. Метод показал свою эффективность
и достаточную точность, а встроенный
язык программирования Визуал Бейсик
показал свои возможности и гибкость при
работе с различными функциями. Встроенный
язык программирования, также с успехом
работает с большими массива чисел и позволяет
проводить различные операции с массивами.