close

Вход

Забыли?

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

?

Lab 2

код для вставкиСкачать
МІНІСТЕРСТВО ОСВІТИ, НАУКИ, МОЛОДІ ТА СПОРТУ УКРАЇНИ
НАЦІОНАЛЬНА МЕТАЛУРГІЙНА АКАДЕМІЯ УКРАЇНИ
"Кафедра інформаційних технологій і систем"
Лабораторна робота №2
З дисципліни: "Математичні основи оптимального проектування"
Перевірив _____ В.Н. Безуб
"___" ________2012
Виконав
студент гр. КН-09-1
_______ Мельник М.С.
"___" _________2012
Дніпропетровск
2012
Задание:
Написать программу на С++ для определения экстремума двумерной функции F(x1, x2) с точностью E.
Для реализации метода необходимо создать класс С++б содержащий функцию calc() - реализующую один шаг алгоритма. Тестовая функция представлена в виде указателя на функцию.
Целевая функция f(x) = f(x1, x2) зависит от двух аргументов.
Функция f(x) следующего вида:
f(x) = a*x1 + b*x2 + exp(c*x1*x1+d*x2*x2).
Исходный код:
#include <iostream>
#include <cmath>
#include <conio.h>
using namespace std;
class Simplex {
private:
const static double a = 12, b = -0.8, c = 1.44, d = 2.2, e = 0.0003;
public:
void calc();
double func(double x1, double x2);
};
void Simplex::calc(){
int i, k, p, d, u;
double x1[100], x2[100], r, E, x1min, x2min, ymin;
double y[10], yu, l1, l2, c1, c2, u1, u2;
// 1) Задаем начальные значения
x1[0] = 1; x2[0] = 0;
r = 1; E = 0.0003;
//-----------------
// 2) Вычисляем координаты вершин
x1[1] = x1[0] + r;
x2[1] = x2[0];
x1[2] = x1[0];
x2[2] = x2[0] + r;
//-----------------
// 3) Вычисляем значение функции в вершинах
y[0] = func(x1[0], x2[0]);
y[1] = func(x1[1], x2[1]);
y[2] = func(x1[2], x2[2]);
u = 0;
//-----------------------
//-----------------------
do{
p=1;
// 4) Определение направления улучшения решения
if(y[0] > y[1]){
if(y[0] > y[2]){
l2 = 0;
if(y[1] > y[2]){
l1 = 2;
} else {
l1 = 1;
}
} else {l2 = 2; l1 = 1;}
} else {
if(y[1] > y[2]){
l2 = 1;
if(y[0] > y[2]){
l1 = 2;
} else{
l1 = 0;
}
} else{
l2 = 2;
l1 = 0;
}
}
// 5) Определяем координаты отраженной точки
if(r > E){
p = 0;
if(l2 == 0) {c1 = 0.5 * (x1[1] + x1[2]);}
if(l2 == 1) {c1 = 0.5 * (x1[0] + x1[2]);}
if(l2 == 2) {c1 = 0.5 * (x1[0] + x1[1]);}
if(l2 == 0) {c2 = 0.5 * (x2[1] + x2[2]);}
if(l2 == 1) {c2 = 0.5 * (x2[0] + x2[2]);}
if(l2 == 2) {c2 = 0.5 * (x2[0] + x2[1]);}
k = l2;
d = l1;
u1 = 2 * c1 - x1[k]; // 1 отр. точка
u2 = 2 * c2 - x2[k]; // 2 отр. точка
yu = func(u1, u2); // значение функции в отр.точке
// 6) Построение нового симплекса
if(yu < y[k]){
x1[k] = u1; x2[k] = u2; y[k] = yu;
} else {
r = r/2;
for(i = 0; i <=2 ; i++){
if(i != d){
x1[i] = (x1[i] + x1[d]) / 2.0;
x2[i] = (x2[i] + x2[d]) / 2.0;
y[i] = func(x1[i], x2[i]);
cout << x1[i] << " " << x2[i] << " " << y[i] << endl;
}
}
u++;
}
}
} while(p==0);
u--;
x1min=x1[d];
x2min=x2[d];
ymin=func(x1min,x2min);
cout << "\n\nfunkciai: f(x) = a*x1 + b*x2 + pow(E, c*x1*x1 + d*x2*x2)\n\n";
cout << "funkciai: f(x) = 12*x1 + (-0.8)*x2 + pow(E, 1.44*x1*x1 + 2.2*x2*x2)\n\n";
cout << endl << "rezultat:" << endl;
cout << "X1 = " << x1min << " X2 = " << x2min << " F = " << ymin << endl;
cout << endl << "iteracii: " << u << endl;
}
double Simplex::func(double x1, double x2)
{
double f;
f=a*x1 + b*x2 + exp(c*x1*x1+d*x2*x2);
return(f);
}
int main(){
Simplex obj;
obj.calc();
return 0 ;
}
Вывод:
Документ
Категория
Рефераты
Просмотров
6
Размер файла
36 Кб
Теги
lab
1/--страниц
Пожаловаться на содержимое документа