close

Вход

Забыли?

вход по аккаунту

?

2 лаба

код для вставкиСкачать
Министерство образования и науки
Российской Федерации
Государственное образовательное учреждение
Высшего профессионального образования "Ивановский
Государственный энергетический университет
Имени В. И. Ленина"
Кафедра программного обеспечения компьютерных систем
Отчет по лабораторной работе №2
по дисциплине "Методы оптимизации"
на тему: "Метод Фибоначчи"
Выполнил: студент ИВТФ
гр. 3-42*
Ф.И.О. Володин Р.П.
Проверил: Ктн. Ст. пр.
Ф.И.О.Музюкин М. А. Иваново 2013
Постановка задачи
Используя метод Фибоначчи, найти минимум унимодальной функции от одной переменной f(x) на заданном интервале(a,b) с некоторой погрешностью e. Описание метода
Алгоритм состоит из 7основных шагов, но в зависимости от условий на определенном этапе вычисления они могут повторяться.
Шаг1. Задаем интервал неопределенности, который является начальным L0=[a0,b0]; также необходимо задать допустимую длину конечного интервала l > 0, и константу различимости e >0.
Шаг2. Находим N-это количество вычислений функции, является наименьшим целым числом , для которого должно выполняться условие Fn>=|L0|/l, где F0, F1, ...,Fn.
Шаг3. Предполагаем, что k=0.
Шаг4. Вычисляем значения y0 и z0:
y0=a0 + Fn-2/Fn ( b0- a0);
z0=a0 + Fn-1/Fn ( b0 - a 0);
Шаг5.Находим значения функций f(yk) и f(zk), на данном шаге k=0;
Шаг6. Сравниваем значения функций f(yk) и f(zk);
a. Если f(yk)<= f(zk), делаем предположение, что
ak+1=ak; bk+1=zk; zk+1=yk;
yk+1= ak+1 + FN-k-3/FN-k-1(bk+1 - ak+1);
Необходимо перейти к шагу 7;
b. Если f(yk)>= f(zk), делаем предположения, что
ak+1= yk; bk+1= bk; yk+1= zk;
zk+1= ak+1 + FN-k-2/FN-k-1(bk+1 - ak+1);
Шаг7. Делаем необходимую проверку окончания, если необходимое условие соблюдается, то делаем заключительное вычисление, чтобы получить решение:
a. Если k!=N - 3, то наращиваем значение k=k+1;
b. Если k=N - 3, то соблюдается некоторая закономерность:
yN-2= zN-2= (aN-2 + bN-2 )/2;
Блок схема
Тест программы
float a = -30;
float b = 30;
float epselon = 0.001F;
float l = 0.01F;
int iterac = 0, k = 0;
float yk, zk;
List<int> fibList;
private void nextButton_Click(object sender, EventArgs e)
{
if (n == 0)
{
//Находим список чисел Фибоначчи
fibList = new List<int>();
fibList.AddRange(new int[]{1, 1});
while (fibList[fibList.Count - 1] < (b - a) / l)
fibList.Add(fibList[fibList.Count - 1] + fibList[fibList.Count - 2]);
//Вычисляем k = 0;
int last = fibList.Count - 1;
yk = a + ((float)fibList[last - 2] / (float)fibList[last]) * (b - a);
zk = a + ((float)fibList[last - 1] / (float)fibList[last]) * (b - a);
}
Iteration();
n++;
Change();
}
private void Iteration()
{
int last = fibList.Count - 1;
if (Funk(yk) <= Funk(zk))
{
b = zk;
zk = yk;
yk = a + ((float)fibList[last - k - 3] / (float)fibList[last - k - 1]) * (b - a);
}
else
{
a = yk;
yk = zk;
zk = a + ((float)fibList[last - k - 2] / (float)fibList[last - k - 1]) * (b - a);
}
if (k == last - 3)
Result();
else k++;
}
Контрольный пример
Функция: y = 5x2-30x+20.
Начальные значения: a = -30, b = 30, ξ = 0.001, l = 0.0015
Количество итераций: 17
Результат: 14,9963
Документ
Категория
Рефераты
Просмотров
16
Размер файла
131 Кб
Теги
лаба
1/--страниц
Пожаловаться на содержимое документа