Курсовая работа: Сравнительный анализ методов оптимизации
Исходя из графика ОДЗ, можно определить, что оптимальным
решением является отрезок прямой , входящий в
ОДЗ, проверим: 2,5*2+2=7.
x1 = 2,5, x2 = 2 f(x)=14.
Заключение
Целью данного курсового проекта было изучение методов
оптимизации функции. Методов одномерной оптимизации: метод дихотомии, золотого
сечения; многомерной безусловной оптимизации: покоординатный циклический спуск,
метод Хука – Дживса, правильный симплекс, деформированный симплекс, а также
методов условной оптимизации Метод преобразования целевой функции, метод
штрафных функций, табличный симплекс – метод.
Список используемой литературы
1.
А.Г.Трифонов. Постановка задачи оптимизации и численные методы ее решения;
2.
Б. Банди. Методы оптимизации. Вводный курс., 1988;
3.
Мендикенов К.К. Лекции
Приложение А
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace lab1
{
public partial class Form1 : Form
{
class global
{
private global() { }
public static double a = 0.64;
public static double b = 1.77;
public static double e = 0.0001;
public static double al = 0.00001;
public static double x = 0;
public static double y = 0;
public static int iter = 0;
}
public Form1()
{ InitializeComponent(); }
private void textBox1_TextChanged(object
sender, EventArgs e)
{global.e =
Convert.ToDouble(textBox1.Text); }
private void textBox2_TextChanged(object
sender, EventArgs e)
{ global.al =
Convert.ToDouble(textBox2.Text); }
public double F(double x)
{ return (Math.Pow((2.5 - x), 2) + 3.1 *
x); }
public double Z(double x, double y)
{ return (2.5 * Math.Pow(x, 2) + 2 * x *
y + 3.1 * Math.Pow(y, 2) -2* x-3*y); }
public double Dixotom()
{
global.iter = 1;
global.a =
Convert.ToDouble(textBox4.Text);
global.b =
Convert.ToDouble(textBox3.Text);
richTextBox1.Text =
richTextBox1.Text+"a="+Convert.ToString(global.a)+"; b="+Convert.ToString(global.b)+(char)13;
while (true)
{
double x1 =
(global.a+global.b)/2-global.al;
double x2 = (global.a + global.b) / 2 +
global.al;
if (F(x1) < F(x2)) global.b = x2;
else global.a = x1;
richTextBox1.Text = richTextBox1.Text +
Convert.ToString(global.iter) + ") x1=" + Convert.ToString(x1) +
"; x2=" + Convert.ToString(x2) + "; f(x1)=" +
Convert.ToString(F(x1)) + "; f(x2)=" + Convert.ToString(F(x2)) +
"; a=" + Convert.ToString(global.a) + "; b=" +
Convert.ToString(global.b) + (char)13;
global.iter++;
if (Math.Abs(global.b - global.a) <
global.e) break;
} return (global.a + global.b) / 2;
}
public double Zolot()
{ global.iter = 1;
global.a =
Convert.ToDouble(textBox4.Text);
global.b =
Convert.ToDouble(textBox3.Text);
richTextBox1.Text = richTextBox1.Text +
"a=" + Convert.ToString(global.a) + "; b=" +
Convert.ToString(global.b) + (char)13;
double x2 = global.a+0.618*(global.b -
global.a) ;
double x1 = global.a + (1-0.618) *
(global.b - global.a);
while (true)
{
if (Math.Abs(global.b - global.a) <
global.e) break;
richTextBox1.Text = richTextBox1.Text +
Convert.ToString(global.iter) + ") a=" + Convert.ToString(global.a) +
"; b=" + Convert.ToString(global.b) + "; x1=" +
Convert.ToString(x1) + "; x2=" + Convert.ToString(x2) + ";
f(x1)=" + Convert.ToString(F(x1)) + "; f(x2)=" +
Convert.ToString(F(x2)) + (char)13;
if (F(x2) > F(x1))
{ global.b = x2; x2 = x1; x1 = global.a
+ 0.372 * (global.b - global.a); }
else { global.a = x1; x1 = x2; x2 =
global.a + 0.618 * (global.b - global.a); }
global.iter++;
}
return (global.a + global.b) / 2;
}
private void button1_Click(object
sender, EventArgs e)
{ richTextBox1.Text = "";
global.al =
Convert.ToDouble(textBox2.Text);
global.e =
Convert.ToDouble(textBox1.Text);
if (radioButton1.Checked) global.x =
Dixotom();
if (radioButton2.Checked) global.x =
Zolot();
label2.Text = "Минимум: x*=" + Convert.ToString(global.x) + "; y(x*)=" +
Convert.ToString(F(global.x)) + ", число итераций:
"+Convert.ToString(global.iter-1);
}
public void Spusk(double x,double y)
{
while (true)//идем вправо
{ x = x + global.al; if (Z(x, y) >
Z(x - global.al, y)) break; global.iter++;
richTextBox2.Text = richTextBox2.Text + Convert.ToString(global.iter)+
") x=" + Convert.ToString(x) + "; y=" + Convert.ToString(y)
+ "; z(x,y)=" + Convert.ToString(Z(x, y)) + "; al=" +
Convert.ToString(global.al) + (char)13;
x = x - global.al;//возвращаемся на неудачный шаг
while (true)//идем влево
{ x = x - global.al; if (Z(x, y) >
Z(x + global.al, y)) break; global.iter++;
richTextBox2.Text = richTextBox2.Text +
Convert.ToString(global.iter) + ") x=" + Convert.ToString(x) +
"; y=" + Convert.ToString(y) + "; z(x,y)=" +
Convert.ToString(Z(x, y)) + "; al=" + Convert.ToString(global.al) +
(char)13; }
x = x + global.al;//возвращаемся на неудачный шаг
global.x=x; global.y=y;
SpuskV(x, y);
}
public void SpuskV(double x, double y)
{
while (true)//идем вверх
{ y = y + global.al; if (Z(x, y) >
Z(x, y - global.al)) break; global.iter++;
richTextBox2.Text = richTextBox2.Text +
Convert.ToString(global.iter) + ") x=" + Convert.ToString(x) +
"; y=" + Convert.ToString(y) + "; z(x,y)=" +
Convert.ToString(Z(x, y)) + "; al=" + Convert.ToString(global.al) +
(char)13; }
y = y - global.al;//возвращаемся на неудачный шаг
while (true)//идем вниз
{ y = y - global.al; if (Z(x, y) >
Z(x, y + global.al)) break; global.iter++;
richTextBox2.Text = richTextBox2.Text +
Convert.ToString(global.iter) + ") x=" + Convert.ToString(x) +
"; y=" + Convert.ToString(y) + "; z(x,y)=" +
Convert.ToString(Z(x, y)) + "; al=" + Convert.ToString(global.al) +
(char)13; }
y = y + global.al;//возвращаемся на неудачный шаг
global.x = x; global.y = y;
if (global.al/2 > global.e) {
global.al = global.al / 2; Spusk(x, y); }
}
public void Hyg(double x, double y)
{ while (true)
{int min=Vibor(x, y);
if (min == 1) { x = x + 2 * global.e; y
= y + 2 * global.e; if (Z(x - 2 * global.e, y - 2 * global.e) < Z(x, y)) break;
}
if (min == 2) { x = x - 2 * global.e; y
= y + 2 * global.e; if (Z(x + 2 * global.e, y - 2 * global.e) < Z(x, y))
break; }
if (min == 3) { x = x - 2 * global.e; y
= y - 2 * global.e; if (Z(x + 2 * global.e, y + 2 * global.e) < Z(x, y))
break; }
if (min == 4) { x = x + 2 * global.e; y
= y - 2 * global.e; if (Z(x - 2 * global.e, y + 2 * global.e) < Z(x, y))
break; }
global.iter++;
richTextBox2.Text = richTextBox2.Text +
Convert.ToString(global.iter) + ") x=" + Convert.ToString(x) +
"; y=" + Convert.ToString(y) + "; z(x,y)=" +
Convert.ToString(Z(x, y)) +(char)13; }
global.x = x; global.y = y;
}
public int Vibor(double x, double y)
{ int min = 0;
if (Z(x + global.e, y + global.e) <
Z(x, y)) min = 1;
if (Z(x + global.e, y - global.e) <
Z(x, y)) min = 2;
if (Z(x - global.e, y - global.e) <
Z(x, y)) min = 3;
if (Z(x - global.e, y + global.e) <
Z(x, y)) min = 4;
return min; }
public void Sym(double x, double y)
{ double x0 = x; double y0 = y; double
x1 = x0 + global.al; double y1 = y0;
double x2 = x0 + (global.al) / 2; double
y2 = y0 + global.al * Math.Sin(60);
richTextBox2.Text = richTextBox2.Text +
Convert.ToString(global.iter) + ") z(x0,y0)=" +
Convert.ToString(Z(x0, y0)) + " z(x1,y1)=" + Convert.ToString(Z(x1,
y1)) + " z(x2,y2)=" + Convert.ToString(Z(x2, y2)) + " al="
+ Convert.ToString(global.al) + (char)13;
while (true)
{ //поиск наименьшего
double mx0 = x0; double my0 = y0; double
mx1 = x1; double my1 = y1; double mx2 = x2; double my2 = y2;
double z1 = Z(mx0, my0); double z2 =
Z(mx1, my1); double z3 = Z(mx2, my2);
if ((z1 < z2) && (z2 < z3)
&& (z3 > z1)) { x0 = mx0; x1 = mx1; x2 = mx2; y0 = my0; y1 = my1; y2
= my2; }
if ((z1 < z2) && (z2 > z3)
&& (z3 > z1)) { x0 = mx0; x1 = mx2; x2 = mx1; y0 = my0; y1 = my2; y2
= my1; }
if ((z1 > z2) && (z2 < z3)
&& (z3 < z1)) { x0 = mx1; x1 = mx2; x2 = mx0; y0 = my1; y1 = my2; y2
= my0; }
if ((z1 > z2) && (z2 < z3)
&& (z3 > z1)) { x0 = mx1; x1 = mx0; x2 = mx2; y0 = my1; y1 = my0; y2
= my2; }
if ((z1 < z2) && (z2 > z3)
&& (z3 < z1)) { x0 = mx2; x1 = mx0; x2 = mx1; y0 = my2; y1 = my0; y2
= my1; }
if ((z1 > z2) && (z2 > z3)
&& (z3 < z1)) { x0 = mx2; x1 = mx1; x2 = mx0; y0 = my2; y1 = my1; y2
= my0; }
//проверка на выход
if (global.al <= global.e) break;
while (true)
{ //отражение относительно 3
double kx= (x0+x1)-x2; double ky = (y0 + y1) - y2;
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 |