Помощь в написании студенческих работ
Антистрессовый сервис

Разработка программы для вычисления функций

КонтрольнаяПомощь в написанииУзнать стоимостьмоей работы

Fb — значение функции в базовой точке}. Признак, что функция в точке x1 < чем в x. То установить флаг окончания поиска. То установить флаг окончания поиска. То установить флаг окончания поиска. Расчёт градиента (массив g) в точке x. Procedure TForm1. Edit5KeyPress (Sender: TObject; var Key: Char); Procedure TForm1. Edit5KeyPress (Sender: TObject; var Key: Char); Procedure TForm1. Edit4KeyPress… Читать ещё >

Разработка программы для вычисления функций (реферат, курсовая, диплом, контрольная)

МИНИСТЕРСТВО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ ВОРОНЕЖСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ ФАКУЛЬТЕТ ВЕЧЕРНЕГО И ЗАОЧНОГО ОБУЧЕНИЯ КАФЕДРА Автоматизированные и вычислительные системы КОНТРОЛЬНАЯ РАБОТА по дисциплине «Нелинейное программирование»

Выполнил:

ст. гр. ВМ-101

Машинистов К.Ю.

Проверил:

Сергеева Т.И.

ВОРОНЕЖ 2013

КОНТРОЛЬНОЕ ЗАДАНИЕ № 1

Таблица 1

Номер варианта

Функция

a

b

E

F (x) = -3· e-x·ln (2·x)

0.5

2.5

0.001

Решение:

unit Z6;

interface

uses

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

Dialogs, StdCtrls;

type

TForm1 = class (TForm)

Label1: TLabel;

Label2: TLabel;

Label3: TLabel;

Edit1: TEdit;

Edit2: TEdit;

Edit3: TEdit;

Label4: TLabel;

Label5: TLabel;

Label6: TLabel;

Label7: TLabel;

Button2: TButton;

Memo1: TMemo;

Memo2: TMemo;

Label9: TLabel;

procedure Button2Click (Sender: TObject);

procedure Edit1KeyPress (Sender: TObject; var Key: Char);

procedure Edit2KeyPress (Sender: TObject; var Key: Char);

procedure Edit3KeyPress (Sender: TObject; var Key: Char);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1. Button2Click (Sender: TObject);

begin

Form1.Close;

end;

procedure TForm1. Edit1KeyPress (Sender: TObject; var Key: Char);

begin

If Key=#13 then

begin

Key:=#0;

Edit2.SetFocus;

end;

end;

procedure TForm1. Edit2KeyPress (Sender: TObject; var Key: Char);

begin

If Key=#13 then

begin

Key:=#0;

Edit3.SetFocus;

end;

end;

procedure TForm1. Edit3KeyPress (Sender: TObject; var Key: Char);

const fi=1.618;

var a, b, e, x1, x2,y1,y2,rez:real;

s:string;

begin

If Key=#13 then

begin

Memo1.Lines.Clear;

Memo2.Lines.Clear;

Key:=#0;

a:=StrToFloat (Edit1.Text);

b:=StrToFloat (Edit2.Text);

e:=StrToFloat (Edit3.Text);

x1:=b-(b-a)/fi;

x2:=a+(b-a)/fi;

y1:=-3*exp (-x1)*ln (2*x1);

y2:=-3*exp (-x2)*ln (2*x2);

repeat

begin

if y1<=y2 then

begin

b:=x2; x2:=x1; y2:=y1;

x1:=b-(b-a)/fi; y1:=-3*exp (-x1)*ln (2*x1);

end

else

begin

a:=x1; x1:=x2; y1:=y2;

x2:=a+(b-a)/fi; y2:=-3*exp (-x2)*ln (2*x2);

end;

rez:= (x1+x2)/2;

s:=FloatToStr (rez);

Label9.Caption:=s;

s:=FloatToStr (x1);

Memo1.Lines.Add (s);

s:=FloatToStr (x2);

Memo2.Lines.Add (s);

end;

until abs (b-a)

end;

end;

end.

КОНТРОЛЬНОЕ ЗАДАНИЕ № 2

программный градиентный спуск координата Таблица 2

№ варианта

Функция

X

H

Xmin

F (x1, x2) = (x12 + x2 + 10)2 + (x1 + x22 — 122)2

(-10, -1)

(1, -11)

Решение:

unit Unit1;

interface

uses

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

Dialogs, StdCtrls;

type

t=array[1.2] of double;

TForm1 = class (TForm)

Label1: TLabel;

Label2: TLabel;

Edit1: TEdit;

Edit2: TEdit;

ListBox1: TListBox;

Button2: TButton;

Edit5: TEdit;

Label5: TLabel;

procedure Button2Click (Sender: TObject);

procedure Edit1KeyPress (Sender: TObject; var Key: Char);

procedure Edit2KeyPress (Sender: TObject; var Key: Char);

procedure Edit5KeyPress (Sender: TObject; var Key: Char);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

{$R *.dfm}

{Процедура поиска минимума}

procedure TForm1. Edit5KeyPress (Sender: TObject; var Key: Char);

var

x, b, y, p: t; {массивы для точек}

h, k, fi, fb: double; {h, k — шаг, fi — значение функции,

fb — значение функции в базовой точке}

e, a: boolean;

i, fe: integer;

{функция, минимум которой требуется найти}

function F (x1, x2: double):double;

begin

f:=sqr (sqr (x1)+x2+10)+sqr (x1+sqr (x2)-122);

fe:=fe+1;

end;

{процедура вывода на экран координат очередной найденной точки}

procedure printrezult;

begin

listbox1.Items.Add ('Точка');

listbox1.Items.Add (FloatToStrF (x[1], ffFixed, 3, 3)+

';'+FloatToStrF (x[2], ffFixed, 3, 3));

listbox1.Items.Add ('f (x1,x2)='+FloatToStr (fi));

listbox1.Items.Add ('');

end;

begin

If Key=#13 then

begin

Key:=#0;

{ Введённые данные переводим из строки в число}

x[1]: =strtofloat (edit1.Text);

x[2]:=strtofloat (edit2.Text);

h:=strtofloat (edit5.Text);

{Начальные значения}

fe:=0;

k:=h;

y:=x;

p:=x;

b:=x;

{Начальное значение функции}

fi:=F (x[1], x[2]);

listbox1.Items.Add ('Начальное значение функции');

printrezult;

{Признак исследования функции вокруг базисной точки }

a:=true; fb:=fi; e:=false;

while not e do

begin

{Исследование функции в окрестности базисной точки}

for i:=1 to 2 do

begin

x[i]: =y[i]+k;

if F (x[1], x[2])>fi then

begin

x[i]: =y[i]-k;

if F (x[1], x[2])>fi then x[i]: =y[i] else y[i]: =x[i];

end

else

begin

y[i]:=x[i];

end;

fi:=F (x[1], x[2]);

listbox1.Items.Add ('Исследующий поиск');

printrezult;

end;

{Если функция уменьшилась, то поиск по образцу }

if (fi

begin

//поиск по образцу

for i:=1 to 2 do p[i]: =2*(y[i]-b[i])+b[i];

b:=y;

x:=p;

y:=p;

fb:=fi; a:=false;

fi:=F (x[1], x[2]);

listbox1.Items.Add ('Поиск по образцу');

printrezult;

end

else

begin

if a then

begin

k:=k/10;

//listbox1.Items.Add ('Уменьшить длину шага');

//Завершить вычисления, если шаг достаточно мал

e:=k<0.1;

end

else

begin

p:=b;

y:=b;

x:=b;

a:=true;

fi:=F (x[1], x[2]); fb:=fi;

listbox1.Items.Add ('Замена базисной точки');

printrezult;

end;

end;

end;

// Результат

listbox1.Items.Add ('Минимум найден');

printrezult;

listbox1.Items.Add ('Кол-во вычислений:'+IntToStr (fe));

end;

end;

// Выход

procedure TForm1. Button2Click (Sender: TObject);

begin

close;

end;

procedure TForm1. Edit1KeyPress (Sender: TObject; var Key: Char);

begin

If Key=#13 then

begin

Key:=#0;

Edit2.SetFocus;

end;

end;

procedure TForm1. Edit2KeyPress (Sender: TObject; var Key: Char);

begin

If Key=#13 then

begin

Key:=#0;

Edit5.SetFocus;

end;

end;

end.

КОНТРОЛЬНОЕ ЗАДАНИЕ № 3

Таблица 3

№ вар.

Функция

X

H

Xmin

F (x1.x4) = (x1+7)2 + 2*(x2−7)2 + 3*(x3+7)2 + 4*(x4−7)2

(4,-1,4,-1)

(-7,7,-7,7)

Решение:

unit Unit1;

interface

uses

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

Dialogs, StdCtrls;

const

// число переменных функции

n=4;

type

// тип для массивов с координатами

vector=array[1.n] of double;

TForm1 = class (TForm)

Label1: TLabel;

Label2: TLabel;

Label3: TLabel;

Edit1: TEdit;

Edit2: TEdit;

Edit3: TEdit;

Button1: TButton;

ListBox1: TListBox;

Label4: TLabel;

Edit4: TEdit;

Edit5: TEdit;

Label5: TLabel;

procedure Button1Click (Sender: TObject);

procedure Edit1KeyPress (Sender: TObject; var Key: Char);

procedure Edit2KeyPress (Sender: TObject; var Key: Char);

procedure Edit3KeyPress (Sender: TObject; var Key: Char);

procedure Edit4KeyPress (Sender: TObject; var Key: Char);

procedure Edit5KeyPress (Sender: TObject; var Key: Char);

private

{ Private declarations }

procedure Rezultat (x:vector);

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

{$R *.dfm}

//Функция

function F (x:vector):double;

begin

f:=sqr (x[1]+7)+2*sqr (x[2]-7)+3*sqr (x[3]+7)+4*sqr (x[4]-7);

end;

//Выход

procedure TForm1. Button1Click (Sender: TObject);

begin

close;

end;

// вывод координат точки и значения функции в этой точке

procedure TForm1. Rezultat (x:vector);

begin

listbox1.Items.Add ('F ('+floattostrf (x[1], fffixed, 8,3)+','+

floattostrf (x[2], fffixed, 8,3)+','+floattostrf (x[3], fffixed, 8,3)+

','+floattostrf (x[4], fffixed, 8,3)+')='+

floattostrf (f (x), fffixed, 8,3));

end;

// Основные вычисления

procedure TForm1. Edit1KeyPress (Sender: TObject; var Key: Char);

begin

If Key=#13 then

begin

Key:=#0;

Edit2.SetFocus;

end;

end;

procedure TForm1. Edit2KeyPress (Sender: TObject; var Key: Char);

begin

If Key=#13 then

begin

Key:=#0;

Edit3.SetFocus;

end;

end;

procedure TForm1. Edit3KeyPress (Sender: TObject; var Key: Char);

begin

If Key=#13 then

begin

Key:=#0;

Edit4.SetFocus;

end;

end;

procedure TForm1. Edit4KeyPress (Sender: TObject; var Key: Char);

begin

If Key=#13 then

begin

Key:=#0;

Edit5.SetFocus;

end;

end;

// Основные вычисления

procedure TForm1. Edit5KeyPress (Sender: TObject; var Key: Char);

var

x, x1, xr, rx, g: vector;

k, m, i: integer;

t, e1, e2, mmm, mmm1, u, u1, u2: double;

prizn, prizn1: boolean;

begin

If Key=#13 then

begin

Key:=#0;

//считывание данных

x[1]: =strtoint (edit1.Text);

x[2]:=strtoint (edit2.Text);

x[3]:=strtoint (edit3.Text);

x[4]:=strtoint (edit4.Text);

t:=strtoint (edit5.Text);

//Точность и начальные значения

e1:=0.0001;

e2:=0.0015;

m:=100;

k:=0;

prizn:=false;

while not prizn do

begin

//вывод текущей точки и номера итерации

rezultat (x);

// расчёт градиента (массив g) в точке x.

for i:=1 to n do

x1[i]: =x[i];

for i:=1 to n do

begin

x1[i]: =x1[i]+e1;

g[i]:=(f (x1)-f (x))/e1;

x1[i]:=x[i];

end;

//mmm = модуль градиента

mmm:=0;

for i:=1 to n do

mmm:=mmm+sqr (g[i]);

mmm:=sqrt (mmm);

if mmm

begin

//если модуль градиента меньше установленной точности,

// то установить флаг окончания поиска

prizn:=true;

// и подготовить массив xr с координатами точки результата

for i:=1 to n do

xr[i]: =x[i];

end

else

begin

if k>=m then

begin

//если число итераций превысило допустимое,

// то установить флаг окончания поиска

prizn:=true;

// массив xr с координатами точки результата

for i:=1 to n do

xr[i]: =x[i];

end

else

begin

//Установить точку x1 равную x

for i:=1 to n do

x1[i]: =x[i];

// признак, что функция в точке x1 < чем в x

prizn1:=false;

while not prizn1 do

begin

// сместить x1 в направлении градиента на текущий шаг t

for i:=1 to n do

x1[i]: =x1[i]-t*g[i];

u1:=f (x1); u2:=f (x); u:=u1-u2;

if u<0 then

begin

//если функция в точке x1 < чем в x, то установить соответствующий признак

prizn1:=true;

end

else

begin

//если функция в точке x1 < чем в x, то

//уменьшить шаг в 10 раз

t:=t/10;

// установить точку x1 равную x

for i:=1 to n do

x1[i]: =x[i];

end;

end;

//формирование вектора rx из точки x в точку x1

for i:=1 to n do

rx[i]: =x1[i]-x[i];

//mmm1 = модуль вектора rx

mmm1:=0;

for i:=1 to n do

mmm1:=mmm1+sqr (rx[i]);

mmm1:=sqrt (mmm1);

u1:=f (x1);

u2:=f (x);

u:=u1-u2;

if (mmm1

begin

//если модуль вектора rx меньше установленной точности

//и разность значений функции в точках x и x1 также меньше установленной точности

// то установить флаг окончания поиска

prizn:=true;

// и подготовить массив xr с координатами точки результата

for i:=1 to n do

xr[i]: =x1[i];

end

else

begin

// иначе

// увеличить счётчик итераций на 1

k:=k+1;

// установить точку x равную x1

for i:=1 to n do

x[i]: =x1[i];

end;

end;

end;

end;

//вывод результата — точки xr

rezultat (xr);

end;

end;

end.

Показать весь текст
Заполнить форму текущей работой