- •Министерство образования и науки
- •Введение
- •Понятие о Золотом сечении
- •2.1. Золотое сечение – гармоническая пропорция
- •2.2. Второе золотое сечение
- •Золотой треугольник
- •История золотого сечения
- •Ряд Фибоначчи
- •Обобщенное золотое сечение
- •Принципы формообразования в природе
- •Золотое сечение и симметрия
- •2. Методы одномерной оптимизации
- •Метод золотого сечения.
- •3. Практическая реализация метода золотого сечения
- •3.1. Характеристика объекта автоматизации
- •Разработка программы
- •Описание метода золотого сечения
- •Результаты
- •3.3 Обоснование выбора языка программирования
- •Заключение
- •Список использованных источников:
- •Приложение № 2.
- •Листинг программы.
- •Результат работы программы.
Заключение
Наилучшими критериями сравнения методов поиска являются их эффективность и универсальность. Под эффективностью алгоритма обычно понимают число вычислений функции, необходимое для достижения требуемого сужения интервала неопределенности. Лучшим в этом отношении является метод Фибоначчи, а худшим – метод общего поиска. Однако при применении метода Фибоначчи требуется заранее задать число вычислений значений функции. Как правило, оказывается, что методы Фибоначчи и золотого сечения, обладающие высокой эффективностью, наиболее подходят для решения одномерных унимодальных задач оптимизации. Вообще говоря, с точки зрения эффективности метод золотого сечения занимает промежуточное положение между методами дихотомии и чисел Фибоначчи.
Универсальность алгоритма означает, что его можно легко применить для решения самых разнообразных задач. В этом метод Фибоначчи, видимо, уступает другим, так как требует отдельного вычисления положения точек, в которых будут определяться значения целевой функции на каждом новом шаге. Этим приходится расплачиваться за повышение эффективности метода.
С точки зрения универсальности малоэффективный метод общего поиска имеет по крайней мере одно преимущество – его можно с успехом применять и для неунимодальных функций, если они достаточно гладкие. Нередко заранее не известно, является ли рассматриваемая целевая функция унимодальной. В таких случаях следует воспользоваться несколькими разными алгоритмами и посмотреть, дают ли они все один и тот же оптимум. Отсюда следует важный вывод, который следует иметь в виду, решая задачи оптимизации: не существует универсального алгоритма, который позволял бы решать любые задачи. Решая сложные задачи оптимизации, следует пользоваться разными методами, так как это позволяет увеличить долю удачных решений.
В процессе работы над методом золотого сечения нами была разработана программа на Delphi 7.0. работающая на основе этого метода.
При разработке программы были учтены все требования к программе и выполнены в полной мере.
При разработке данной программы были закреплены знания по программированию в среде Delphi 7.0, также получены новые знания в процессе работы над данной программой.
Список использованных источников:
Ковалев Ф.В. Золотое сечение в живописи. К.: Выща школа, 1989.
Кеплер И. О шестиугольных снежинках. – М., 1982.
Дюрер А. Дневники, письма, трактаты – Л., М., 1957.
Цеков-Карандаш Ц. О втором золотом сечении. – София, 1983.
Стахов А. Коды золотой пропорции.
Виктор Лаврус Золотое сечение. - Киев, 2000 года
Приложение №1.
Листинг программы
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
GroupBox1: TGroupBox;
RadioButton1: TRadioButton;
RadioButton2: TRadioButton;
RadioButton3: TRadioButton;
Button1: TButton;
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
function f1(x: real): real;
begin
Result:=x*x*x*x-14*x*x*x+60*x*x-70*x;
end;
function f2(x: real): real;
begin
Result:=-exp(-x)*ln(x);
end;
function f3(x: real): real;
begin
Result:=2*x*x-exp(x);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
RadioButton1.Checked:=true;
Memo1.Clear;
end;
procedure TForm1.Button1Click(Sender: TObject);
const
sech=0.3819660113;
e=0.00001;
var
a,b,int,x1,x2,y1,y2:real;
kol:integer;
begin
Memo1.Clear;
with Form1 do
begin
if RadioButton1.Checked then
begin
kol:=0;
a:=0;
b:=2;
int:=2;
Memo1.Lines.Add('x'+#9+'a'+#9+'b'+#9+'f(x)');
Memo1.Lines.Add('');
Memo1.Lines.Add('2'+#9+'0'+#9+'2'+#9+FloatToStrF(f1(b),ffGeneral,4,6));
x1:=a+sech*(b-a);
x2:=a+(1-sech)*(b-a);
y1:=f1(x1);
y2:=f1(x2);
while int>e*x1 do
begin
kol:=kol+1;
if y2>y1 then
begin
int:=x2-a;
b:=x2;
x2:=x1;
y2:=y1;
x1:=a+sech*int;
y1:=f1(x1);
end
else
begin
int:=b-x1;
a:=x1;
x1:=x2;
y1:=y2;
x2:=a+(1-sech)*int;
y2:=f1(x2);
end;
Memo1.Lines.Add(FloatToStrF(x1,ffGeneral,4,6)+#9+FloatToStrF(a,ffGeneral,4,6)+#9+FloatToStrF(b,ffGeneral,4,6)+#9+FloatToStrF(f1(x1),ffGeneral,4,6));
end;
Memo1.Lines.Add('');
Memo1.Lines.Add('Количество итераций: '+IntToStr(kol));
end;
if RadioButton2.Checked then
begin
kol:=0;
a:=0;
b:=2;
int:=2;
Memo1.Lines.Add('x'+#9+'a'+#9+'b'+#9+'f(x)');
Memo1.Lines.Add('');
Memo1.Lines.Add('2'+#9+'0'+#9+'2'+#9+FloatToStrF(f2(b),ffGeneral,4,6));
x1:=a+sech*(b-a);
x2:=a+(1-sech)*(b-a);
y1:=f2(x1);
y2:=f2(x2);
while int>e*x1 do
begin
kol:=kol+1;
if y2>y1 then
begin
int:=x2-a;
b:=x2;
x2:=x1;
y2:=y1;
x1:=a+sech*int;
y1:=f2(x1);
end
else
begin
int:=b-x1;
a:=x1;
x1:=x2;
y1:=y2;
x2:=a+(1-sech)*int;
y2:=f2(x2);
end;
Memo1.Lines.Add(FloatToStrF(x1,ffGeneral,4,6)+#9+FloatToStrF(a,ffGeneral,4,6)+#9+FloatToStrF(b,ffGeneral,4,6)+#9+FloatToStrF(f2(x1),ffGeneral,4,6));
end;
Memo1.Lines.Add('');
Memo1.Lines.Add('Количество итераций: '+IntToStr(kol));
end;
if RadioButton3.Checked then
begin
kol:=0;
a:=0;
b:=2;
int:=2;
Memo1.Lines.Add('x'+#9+'a'+#9+'b'+#9+'f(x)');
Memo1.Lines.Add('');
Memo1.Lines.Add('2'+#9+'0'+#9+'2'+#9+FloatToStrF(f3(b),ffGeneral,4,6));
x1:=a+sech*(b-a);
x2:=a+(1-sech)*(b-a);
y1:=f3(x1);
y2:=f3(x2);
while int>e*x1 do
begin
kol:=kol+1;
if y2>y1 then
begin
int:=x2-a;
b:=x2;
x2:=x1;
y2:=y1;
x1:=a+sech*int;
y1:=f3(x1);
end
else
begin
int:=b-x1;
a:=x1;
x1:=x2;
y1:=y2;
x2:=a+(1-sech)*int;
y2:=f3(x2);
end;
Memo1.Lines.Add(FloatToStrF(x1,ffGeneral,4,6)+#9+FloatToStrF(a,ffGeneral,4,6)+#9+FloatToStrF(b,ffGeneral,4,6)+#9+FloatToStrF(f3(x1),ffGeneral,4,6));
end;
Memo1.Lines.Add('');
Memo1.Lines.Add('Количество итераций: '+IntToStr(kol));
end;
end;
end;
end.