Исследование функции с использованием метода золотого сечения с помощью Delphi

Автор работы: Пользователь скрыл имя, 25 Ноября 2012 в 14:39, лабораторная работа

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

Программа предназначена для решения задачи одномерной оптимизации (нахождение минимума и максимума функций) методом золотого сечения, нахождения корней методом половинного деления и построения графика исследованной функции.
Метод золотого сечения — метод поиска значений действительно-значной функции на заданном отрезке. В основе метода лежит принцип деления в пропорциях золотого сечения. Наиболее широко известен как метод поиска экстремума в решении задач оптимизации.

Содержание работы

Описание программы …………………………………………стр.3
Функциональное назначение………………………………….стр.3-4
Алгоритм программы…………………………………………стр.5-8
Листинг программы…………………………………………...стр.9-12
Вызов и загрузка………………………………………………стр.12
Входные данные……………………………………………….стр.12
Выходные данные……………………………………………..стр.13-15

Файлы: 1 файл

Биятто, ЭПб-121 Лабораторная работа №2.docx

— 305.13 Кб (Скачать файл)

Министерство образования и науки  Российской Федерации

Федеральное государственное бюджетное  образовательное учреждение

высшего профессионального образования

«Кузбасский государственный технический  университет им.Т.Ф.Горбачева»

Кафедра прикладных информационных технологий

Дисциплина:

Информатика

Специальность:

140404 Электроснабжение 

 

 

Лабораторная работа №

 

2

Исследование функции с использованием метода золотого сечения с помощью Delphi

 

 

 

 

 

Выполнил студ. группы

ЭПб-121 Института энергетики

Биятто Елена

Принял:

профессор кафедры прикладных информационных технологий

Ещин Евгений Константинович

 

Кемерово 2012


 

СОДЕРЖАНИЕ

Описание программы …………………………………………стр.3

Функциональное назначение………………………………….стр.3-4

Алгоритм программы…………………………………………стр.5-8

Листинг программы…………………………………………...стр.9-12

Вызов и загрузка………………………………………………стр.12

Входные данные……………………………………………….стр.12

Выходные данные……………………………………………..стр.13-15

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ОПИСАНИЕ ПРОГРАММЫ

Обозначение и наименование программы: Programm2

Программное обеспечение, необходимое  для функционирования программы: ОС Widows 7, Delphi7, Embarcadero Delphi;

Язык программирования:  в среде программирования Delphi для записи программ используется язык программирования Delphi. Программа на Delphi представляет собой последовательность инструкций, называемыми операторами.

 

ФУНКЦИОНАЛЬНОЕ  НАЗНАЧЕНИЕ

Программа предназначена  для решения задачи одномерной оптимизации (нахождение минимума и максимума функций) методом золотого сечения, нахождения корней методом половинного деления и построения графика исследованной функции.

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

    1. На первой стадии заданный отрезок делится двумя симметричными относительно его центра точками и рассчитываются значения в этих точках.
    2. После чего тот из концов отрезка, к которому среди двух вновь поставленных точек ближе оказалась та, значение в которой максимально (для случая поиска минимума), отбрасывают.
    3. На следующей итерации в силу показанного выше свойства золотого сечения уже надо искать всего одну новую точку.
    4. Процедура продолжается до тех пор, пока не будет достигнута заданная точность

    L             1-L 



    X1                            X4


   1

  • золотое сечение

 

 

L=0,618

1-L=0,382



  f(2) X2=X1+0,382*(X4-X1)

           f(3) X3=X1+0,618*(X4-X1)


         X2       X3


   X1                     X4


        0,618  0,618

       сближаются


 

Рисунок 1 График функции sin(x)/х

 

 

АЛГОРИТМ ПРОГРАММЫ

Табулирование функции

 

 

 

 

 

 

 

 

Поиск максимума функции  сужением интервала

        











 






 нет


 

 да



 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ЛИСТИНГ ПРОГРАММЫ

unit Unit11;

 

interface

 

uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, Menus, StdCtrls, TeEngine, Series, ExtCtrls, TeeProcs, Chart,

  Grids;

 

type

  TForm1 = class(TForm)

    MainMenu1: TMainMenu;

    N1: TMenuItem;

    N2: TMenuItem;

    N3: TMenuItem;

    N4: TMenuItem;

    N5: TMenuItem;

    N6: TMenuItem;

    Label1: TLabel;

    Label2: TLabel;

    Label3: TLabel;

    Label4: TLabel;

    Edit1: TEdit;

    Edit2: TEdit;

    Edit3: TEdit;

    Edit4: TEdit;

    Chart1: TChart;

    Series1: TLineSeries;

    Label5: TLabel;

    Label6: TLabel;

    Label7: TLabel;

    Label8: TLabel;

    Label9: TLabel;

    Label10: TLabel;

    Label11: TLabel;

    Label12: TLabel;

    StringGrid2: TStringGrid;

    procedure N2Click(Sender: TObject);

    procedure FormActivate(Sender: TObject);

    procedure N4Click(Sender: TObject);

    procedure N5Click(Sender: TObject);

    procedure N6Click(Sender: TObject);

 

  private

    { Private declarations }

  public

    { Public declarations }

  end;

 

var

  Form1: TForm1;

  x0,x1,xk,dx,x,y,eps, MaxY,MaxX,MinY,MinX:real;

  n                                     :integer;

implementation

 

{$R *.dfm}

function f(x:real):real;

  begin

  if X<>0 then f:=sin(X)/X;

end;

//===================табулирование=======================

procedure Tab(Chart1:TChart; StringGrid2:TStringGrid);

var i: integer;

begin

//X0:=StrToFloat(Edit1.Text);

//X1:=StrToFloat(Edit2.Text);

//dX:=StrToFloat(Edit3.Text);

  Chart1.Series[0].Clear;

  X:=X0;

  MaxY:=f(X); MinY:=f(X);

 

  StringGrid2.RowCount:=trunc((X1-X0)/dX)+1;

  StringGrid2.Cells[0,0]:='X=';

  StringGrid2.Cells[1,0]:='Y=';

 

  i:=1;

 

   repeat

     Y:=f(X);

     StringGrid2.Cells[0,i]:=FloatToStrF(X,ffFixed,10,4);

     StringGrid2.Cells[1,i]:=FloatToStrF(Y,ffFixed,10,4);

     if Y>=MaxY then begin MaxY:=Y; MaxX:=X; end;

     if Y<=MinY then begin MinY:=Y; MinX:=X; end;

     Chart1.Series[0].AddXY(X,Y);

     X:=X+dX; i:=i+1;

   until X>X1 ;

end;

 

procedure TForm1.FormActivate(Sender: TObject);

begin

X0:=StrToFloat(Edit1.Text);

X1:=StrToFloat(Edit2.Text);

dX:=StrToFloat(Edit3.Text);

eps:=StrToFloat(Edit4.Text);

n:=trunc((X1-X0)/dX);

end;

procedure TForm1.N2Click(Sender: TObject);

  begin

  X0:=StrToFloat(Edit1.Text);

  X1:=StrToFloat(Edit2.Text);

  dX:=StrToFloat(Edit3.Text);

  Tab(Chart1,StringGrid2);

end;

 

///====Поиск максимума функции сужением интервала===///

procedure TForm1.N4Click(Sender: TObject);

var MaxYz,MinYz: real;

begin

X0:=StrToFloat(Edit1.Text);

X1:=StrToFloat(Edit2.Text);

dX:=StrToFloat(Edit3.Text);

eps:=StrToFloat(Edit4.Text);

n:=trunc((Xk-X0)/dX);

X:=X0;

repeat

  Tab(Chart1,StringGrid2);

  MaxYz:=MaxY;

  X0:=MaxX-dX;

  X1:=MaxX+dx;

  dX:=(X1-X0)/n;

  tab(Chart1,StringGrid2);

until abs (MaxY-MaxYz)<=abs(eps*MaxYz) ;

Label10.Caption:=FloatToStrF(MaxY,ffFixed,10,4);

end;

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

 procedure TForm1.N5Click(Sender: TObject);

 var X1,X2,X3,X4,f2,f3: real;

begin

X0:=StrToFloat(Edit1.Text);

Xk:=StrToFloat(Edit2.Text);

dX:=StrToFloat(Edit3.Text);

eps:=StrToFloat(Edit4.Text);

X1:=X0;

X4:=Xk;

////====определяем координаты Золотого сечения====////

X2:=X1+0.382*(X4-X1);

f2:=f(x2);

X3:=X1+0.618*(X4-X1);

f3:=f(x3);

   while abs(f2-f3)>abs(f2)*eps do

   begin

   if f2>f3 then

   begin

     X1:=X2; f2:=f3;

     X2:=X3;

     X3:=X1+0.618*(X4-X1);

     f3:=f(x3);

     end

   else begin

   X4:=X3; f3:=f2;

   X3:=X2;

   X2:=X1+0.382*(X4-X1);

   f2:=f(x2);

   end;

  end;

Tab(Chart1,StringGrid2);

Label12.Caption:=FloatToStrF(f2,ffFixed,10,4);

Label8.Caption:=FloatToStr(MinY);

end;

 

//====нахождение корней функции методом половинного деления===///

 procedure TForm1.N6Click(Sender: TObject);

 var A,B  : real;

     i    : integer;

begin

X0:=StrToFloat(Edit1.Text);

X1:=StrToFloat(Edit2.Text);

dX:=StrToFloat(Edit3.Text);

eps:=StrToFloat(Edit4.Text);

A:=X0;

X:=A+dX;

i:=1;

StringGrid2.RowCount:=i+1;

StringGrid2.Cells[0,0]:='имя корня';

StringGrid2.Cells[1,0]:='значение';

StringGrid2.Cells[0,1]:='  ';

StringGrid2.Cells[1,1]:='  ';

Chart1.Series[0].Clear;

while X<X1 do begin

  if f(A)*f(X)<0 then begin B:=x;

while abs(f(A)-f(B))>=(abs(eps*f(B)))+1e-6 do begin X:=(A+B)/2;

  if f(A)*f(X)>0  then A:=X else B:=X;

  end;

StringGrid2.Cells[0,i]:='X'+IntToStr(i)+'=';

StringGrid2.Cells[1,i]:=FloatToStrF(B,ffFixed,12,8);

i:=i+1;

StringGrid2.RowCount:=i;

  end;

Chart1.Series[0].AddXY(X,f(X));

A:=X; X:=A+dX;

  end;

  if i=1 then StringGrid2.Cells[0,i]:='корней нет';

 

 end;

end.

 

 

 

 

 

ВЫЗОВ И ЗАГРУЗКА

Способ вызова программы:

\\Vtit\tom1\EKE\EPB121\epb22045\Documents\MATLAB\Лабораторная работа2\Programm2.mdl

Если ссылка не работает, то необходимо открыть вручную: EKE→EPB121→epb22045→Лабораторная работа2→Programm2

 

ВХОДНЫЕ ДАННЫЕ

X0=-10

X1=20

dX=0,03

eps=0,001

 

 

 

 

ВЫХОДНЫЕ ДАННЫЕ

 

Табулирование функции

Рисунок 3 Табулирование функции

 

Поиск максимума функции  сужением интервала

Рисунок 4 Поиск максимума функции сужением интервала

 

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

Рисунок 5 Метод золотого сечения

 

Нахождение корней функции  методом половинного деления

Рисунок 6 Нахождение корней функции методом половинного деления

 


Информация о работе Исследование функции с использованием метода золотого сечения с помощью Delphi