Разработка программы для вычисления функций
Программная реализация приложения для вычисления заданных функций. Процедура поиска минимума функции. Применение методов Хука-Дживса и градиентного спуска для решения задачи. Исследование функции в окрестности базисной точки, определение ее координат.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | контрольная работа |
Язык | русский |
Дата добавления | 02.02.2014 |
Размер файла | 767,1 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
19
МИНИСТЕРСТВО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ
ВОРОНЕЖСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
ФАКУЛЬТЕТ ВЕЧЕРНЕГО И ЗАОЧНОГО ОБУЧЕНИЯ
КАФЕДРА Автоматизированные и вычислительные системы
КОНТРОЛЬНАЯ РАБОТА
по дисциплине “Нелинейное программирование”
Выполнил:
ст. гр. ВМ-101
Машинистов К.Ю.
Проверил:
Сергеева Т.И.
ВОРОНЕЖ 2013
КОНТРОЛЬНОЕ ЗАДАНИЕ №1
Таблица 1
Номер варианта |
Функция |
a |
b |
E |
|
6 |
F(x) = -3·e-x·ln(2·x) |
0.5 |
2.5 |
0.001 |
Решение:
unit Z_6;
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)<e;
end;
end;
end.
КОНТРОЛЬНОЕ ЗАДАНИЕ №2
программный градиентный спуск координата
Таблица 2
№ варианта |
Функция |
X |
H |
Xmin |
|
6 |
F(x1, x2) = (x12 + x2 + 10)2 + (x1 + x22 - 122)2 |
(-10, -1) |
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<fb-0.00000001) then
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.00000001;
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 |
|
6 |
F(x1..x4) = (x1+7)2 + 2*(x2-7)2 + 3*(x3+7)2 + 4*(x4-7)2 |
(4,-1,4,-1) |
4 |
(-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<e1 then
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<e2) and (abs(u)<e2) then
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.
Размещено на Allbest.ru
Подобные документы
Математические и алгоритмические основы решения задачи. Функциональные модели и блок-схемы решения задачи. Программная реализация решения задачи. ЛИСП-реализация вычисления неэлементарных функций. Вычисления гамма функции для положительных неизвестных х.
курсовая работа [621,2 K], добавлен 18.01.2010Постановка задачи. Математические и алгоритмические основы решения. Функциональные модели и блок-схемы решения. Программная реализация решения. Пример выполнения программы. Методы, использующие исключение отрезков. Учет информации о значениях функции.
курсовая работа [527,0 K], добавлен 15.01.2010Разработка различных программ для вычисления X и Y по формуле, для вычисления интеграла, для вычисления таблицы значений функции и для вычисления элементов вектора. Составление блок-схемы программы. Ввод значений, описание переменных и условия расчета.
контрольная работа [148,1 K], добавлен 08.11.2013Принципы разработки математических моделей, алгоритмов и программ. Составление программы вычисления функции с использованием нестандартных функций. Нахождение значения корней нелинейного уравнения по методу касательных. Программа для вычисления интеграла.
курсовая работа [568,3 K], добавлен 07.03.2015Численные методы в задачах без ограничений. Схема методов спуска. Среда редактора Visual Basic. Использование объектов ActiveX в формах. Блок-схема алгоритма моделирования. Задачи оптимизирования детерменированных функций с единственной точкой экстремума.
курсовая работа [129,5 K], добавлен 26.04.2010Рассмотрение методов прямоугольников и трапеций как способов вычисления определенных интегралов. Характеристика графика зависимости погрешности от числа разбиений N. Создание приложения по вычислению интеграла с помощью методов приближенного вычисления.
курсовая работа [1,6 M], добавлен 20.06.2012Методы и алгоритмы вычисления определенных интегралов: метод трапеций и метод Симпсона (метод парабол). Оформление функции вычисления заданного определённого интеграла на Visual Basic 6.0. Программный код функции. Создание приложения для вычисления.
курсовая работа [483,6 K], добавлен 25.06.2014Теоретические основы метода оптимизации. Разработка компьютерной системы для решения задач многомерной безусловной оптимизации методом Хука-Дживса с минимизацией по направлению. Описание структуры программы и результаты ее отладки на контрольных примерах.
курсовая работа [595,4 K], добавлен 13.01.2014Нахождение стационарной точки. Расчет безусловного экстремума функции методами прямого поиска. Графическое пояснение метода равномерного симплекса. Метод поиска Хука-Дживса. Метод сопряженных направлений Пауэлла. Разработка программного модуля расчетов.
курсовая работа [1,4 M], добавлен 16.09.2012Подбор параметров линейной функции. Вычисление значения функции в заданных промежуточных точках с использованием математических пакетов. Исследование математической модели решения задачи. Составление программы для вычисления коэффициента корреляции.
курсовая работа [2,3 M], добавлен 21.10.2014