Реализация программы расчета задачи симплекс-метода

  • Вид работы:
    Курсовая работа (т)
  • Предмет:
    Информационное обеспечение, программирование
  • Язык:
    Русский
    ,
    Формат файла:
    MS Word
    616,05 Кб
  • Опубликовано:
    2013-08-06
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

Реализация программы расчета задачи симплекс-метода

СОДЕРЖАНИЕ

1. ПОСТАНОВКА ЗАДАЧИ

. ОПИСАНИЕ АЛГОРИТМОВ

. ПЕРЕЧЕНЬ ИДЕНТИФИКАТОРОВ

. КРАТКОЕ ОПИСАНИЕ ПРОГРАММЫ

. БЛОК-СХЕМА АЛГОРИТМА

.1 Блок-схемы процедур

.1.1 iteration

.1.2 Newton

.1.3 HalfDivide

.1.4 Chordes

. ПРОВЕРКА СЧЕТА ПО ПРОГРАММЕ

ЗАКЛЮЧЕНИЕ

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

1. ПОСТАНОВКА ЗАДАЧИ

Дано уравнение:

 [0,1]

Сравнить методы деления отрезка пополам, хорд, касательных и итераций, поочередно используя их для решения одного и того же уравнения. Независимо от метода заканчивать построения, как только будет получено такое приближение x, для которого |f(x)|< Ɛ, Ɛ = 0,01; 0,001;...10-7 . Для каждого из методов построить диаграмму и график изменения числа потребовавшихся приближений при переходе от одного значения Ɛ к другому и вывести данные числа в виде таблицы в файл.

2. ОПИСАНИЕ АЛГОРИТМОВ


МЕТОД ДЕЛЕНИЯ ОТРЕЗКА ПОПОЛАМ

Пусть дано уравнение f(x)=0, функция f(x) непрерывна на интервале [a,b]. Условие f(a)* f(b)<0 указывает тогда на наличие хотя бы одного корня на этом отрезке.


Поделим отрезок [a,b] пополам точкой c, координата которой c=(a+b)/2 и вычислим значение функции f(c).

Возможны два случая:

а) f(a)*f(c)>0, т.е. значения функции на концах отрезка [a, c] одинаковы по знаку; тогда корень уравнения находится на отрезке [c, b] и отрезок [a, c] можно исключить из дальнейшего рассмотрения, перенеся точку a в точку c: a=c; f(a)=f(c) (рис. а);

б) f(a)*f(c)<0, т.е. значение функции на концах отрезка [a, c] противоположны по знаку; тогда корень находится на отрезке [a, c] и отрезок [c, b] можно исключить из дальнейшего рассмотрения, перенеся точку b в точку c: b=c (рис. б).

После исключения правой или левой половины отрезка продолжают деление пополам до тех пор, пока длина оставшегося интервала [a, b] не станет меньше некоторой заданной малой величины Ɛ , т.е. |b-a| <Ɛ , и тогда любое значение аргумента из отрезка [a, b] можно считать корнем с погрешностью Ɛ .

МЕТОД ХОРД

Нелинейная функция f(x) на отделенном интервале [а,b] заменяется линейной, в качестве которой берется хорда - прямая, стягивающая концы нелинейной функции. Эта хорда определяется как прямая, проходящая через точки с координатами (а,f(а)) и (b,f(b)). Имея уравнение хорды: у = cx + d, можно легко найти точку ее пересечения с горизонтальной осью, подставив в уравнение у = 0 и найдя из него x. Естественно, в полученной таким путем точке x1 не будет решения, ее принимают за новую границу отрезка, где содержится корень. Через эту точку с координатами (x1,f(x1)) и соответствующую границу предыдущего интервала опять проводят хорду, находят x2 и т. д. несколько раз, получая последовательность: х3, х4, х5 ..., сходящуюся к корню.


Алгоритм метода зависит от свойств функции f(х). Если f(b) f"(b)>0, то строящаяся на каждом этапе хорда имеет правый фиксированный конец и тогда алгоритм будет выглядеть так:


при этом последовательность х1, х2, х3... будет приближаться к корню слева.

Если f(a) f''(a) > 0, то строящаяся при каждом этапе хорда имеет левый фиксированный ("закрепленный") конец и алгоритм выглядит следующим образом:


при этом последовательность х1, х2, ... будет приближаться к корню справа.

Условием прекращения пополнения последовательности является: |хi+1i| <Ɛ

МЕТОД НЬЮТОНА

Идея, на которой основан метод, аналогична той, которая реализована в методе хорд, только в качестве прямой берется касательная, проводимая в текущей точке последовательности. Уравнение касательной находится по координате одной точки и углу наклона (значение производной). В качестве начальной точки в зависимости от свойств функции берется или левая точка: x0 = а (если f(а) f"(a) > 0), или правая точка: x0 = b (если f(b) f"(b)>0).


Алгоритм записывается следующим образом:


Условием прекращения пополнения последовательности является: |хi+1i| <Ɛ

МЕТОД ИТЕРАЦИЙ

Предварительно исходное уравнение f(x) = 0 преобразуют к виду: f(х) = х, что является частным случаем более общей структуры: g(x) = f(x). Затем выбирают начальное значение х0 и подставляют его в левую часть уравнения, но f(х0) != х0, поскольку х0 взято произвольно и не является корнем уравнения. Полученное уравнение f(х0) = х1 рассматривают как очередное приближение к корню. Его снова подставляют в левую часть уравнения f(х1) и получают следующее значение х22= f(х1)) и т. д., в общем случае хi+1 = f(хi). Получающаяся таким образом последовательность: х0, х1, х2, х3 , х4,... при определенных условиях может сходиться к корню х*.


Условием сходимости является |f'(х)| < 1 на [а,b].

Условием прекращения пополнения последовательности является: |хii+1|<Ɛ

3. ПЕРЕЧЕНЬ ИДЕНТИФИКАТОРОВ


Модуль Form1 (форма программы)

отрезок хорда итерация идентификатор

Объекты формы

Имя объекта

Тип объекта

Описание

Image1

TImage

Изображение, содержащее уравнение

Memo1

TMemo

Поле, содержащее необходимое задание

Edit3

TEdit

Поле для ввода промежутков(начальный)

Edit4

TEdit

Поле для ввода промежутков(конечный)

Button1

TButton

Кнопка «Решить»

Label1

TLabel

Метка с подписью «Метод деления отрезка пополам:»

Label2

TLabel

Метка с подписью «Введите промежутки»

Label3

Метка с подписью «Метод хорд:»

Label4

TLabel

Метка с подписью «Метод касательных:»

Label5

TLabel

Метка с подписью «Метод итераций:»

Chart1

TChart

Гистограмма для вывода результатов метода деления

Chart2

TChart

Гистограмма для вывода результатов метода хорд

Chart3

TChart

Гистограмма для вывода результатов метода касательных

Chart4

TChart

Гистограмма для вывода результатов метода итераций


Процедуры формы Form1

1.      newton - процедура решения уравнения методом касательных

2.      iteration - процедура решения уравнения методом итераций

3.      HalfDivide - процедура решения уравнения методом половинного деления

4.      Chordes - процедура решения уравнения методом хорд

5.      ShowNotice - процедура для вывода сообщения успешного решения поставленной задачи

.        Button1Click - реакция на нажатие кнопки «Решить». Вызов основных процедур и заполнение таблицы вывода а также гистограмм.

.        FormCreate - процедура, которая заполняет шапку таблиц, задает разметку и начальные действия объектов при старте программы.

4. КРАТКОЕ ОПИСАНИЕ ПРОГРАММЫ


Входными данными являются:

- уравнение вида  ;

a - левое значение заданного промежутка;

b - правое значение заданного промежутка;

Рассмотрим алгоритм работы программы.

При запуске программы пользователь видит на экране первую форму программы, на которой располагается заданное уравнение и поля для ввода промежутков (рис. 1).

Рисунок 1. Главная форма программы

Для начала работы программы необходимо заполнить все поля, показанные на рисунке 2.

Рисунок 2. Необходимые поля для заполнения

После ввода данных на форме необходимо нажать на кнопку Решить. После нажатия кнопки пользователь увидит сообщение о решенной задаче

Рисунок 3. Сообщение об успешном решении задачи

После нажатия кнопки ОК пользователь увидит на форме таблицу с результатами работы программы и 4 графика, соответствующие заданию:

Рисунок 4. Форма с выполненным заданием и результатами

 

5. БЛОК-СХЕМА АЛГОРИТМА




5.1 Блок-схемы процедур

 

.1.1 iteration

 

5.1.2 newton



5.1.3 HalfDivide

 



5.1.4 Chordes

 

. ПРОВЕРКА СЧЕТА ПО ПРОГРАММЕ

При сравнении данных, полученных при решении задачи выяснилось, что наиболее быстрыми оказались методы касательных и итерация. Эти методы вычислили значение корня необходимой точности за 3 прохода. Наиболее медленным оказался метод половинного деления. Метод хорд вычислил корень необходимой точности за 4 прохода.

ЗАКЛЮЧЕНИЕ


В данном курсовом проекте я реализовал программу расчета задачи симплекс - метода. Программа была написана мной на объектно-ориентированном языке С++ в среде разработки Borland C++ Bulder 6. Данная среда программирования довольно широко охватывает потребности объектно-ориентированного программирования - она не только имеет огромный набор уже готовых компонентов, созданных в ней же самой, но и позволяет легко создавать свои объекты. Благодаря этой особенности, все компоненты сторонних разработчиков ничем не отличаются от стандартного набора и не требуют особых ухищрений, при добавлении их в среду и использовании в ней.

 

 

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


#include <vcl.h>

#pragma hdrstop

#include <stdlib.h>

#include <math.h>

#include "Unit1.h"

#pragma package(smart_init)

#pragma resource "*.dfm"

#define ABS(A) ((A) >= 0 ? (A) : -(A))*Form1;

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

} fs(double x)// первая производная

{15*x*x-1;

} f(double x) // исходное уравнение

{5*x*x*x-x-1;

}double f1(long double x) // сжимающая функция

{x*x;

}newton(double a, double b)// касательные

{c,cnext,c1;ex[6] = { 0.01, 0.001, 0.0001, 0.00001, 0.000001, 0.0000001 }; i,count=0;

c=(a+b)/2; // подсчитал первое и нулевое значение

{(ABS(cnext-c)>ex[i])

{=cnext;=c-(f(c)/fs(c));++;

}->StringGrid1->Cells[3][i+1]=IntToStr(count);

}

}iteration(double a, double b)

{double x,xnext;double ex[6] = { 0.01, 0.001, 0.0001, 0.00001, 0.000001, 0.0000001 };i,count=0;=(a+b)/2;=f1(x);( i = 0; i < 6; i++)

{(ABS(xnext-x)>=ex[i])

{=xnext;=f1(x);++;

}->StringGrid1->Cells[4][i+1]=IntToStr(count);

}

}HalfDivide(double a, double b)

{ double c;i,count=0;epsilon;ex[6] = { 0.01, 0.001, 0.0001, 0.00001, 0.000001, 0.0000001 };( i = 0; i < 6; i++)

{(ABS(b-a)>ex[i])

{=(a+b)/2.0;(f(a)*f(c)<0.0)

{=c;

}

{=c;

}=count+1;

}->StringGrid1->Cells[1][i+1]=IntToStr(count);

}

}Chordes(double a, double b)

{ int i,count=0;ex[6] = { 0.01, 0.001, 0.0001, 0.00001, 0.000001, 0.0000001 };( i = 0; i < 6; i++)

{(ABS(b-a)>ex[i])

{= b - ((b - a) * f(b)/(f(b) - f(a)));= a - ((a - b) * f(a)/(f(a) - f(b)));++;

}->StringGrid1->Cells[2][i+1]=IntToStr(count);

}

}ShowNotice()

{("Задача решена", mtInformation, TMsgDlgButtons() << mbOK,1200);

}__fastcall TForm1::Button1Click(TObject *Sender)

{i,j;c;count=0;a, b;=StrToFloat(Edit3->Text);=StrToFloat(Edit4->Text);(a,b);(a,b);(a,b);(a,b);();->Visible=true;->Visible=true;->Visible=true;->Visible=true;(i=1;i<=StringGrid1->RowCount-1;i++)

{->AddXY(i,StrToInt(StringGrid1->Cells[1][i]),clBlack);->AddXY(i,StrToInt(StringGrid1->Cells[3][i]),clBlack);->AddXY(i,StrToInt(StringGrid1->Cells[2][i]),clBlack);->AddXY(i,StrToInt(StringGrid1->Cells[4][i]),clBlack);

}->StringGrid1->Visible=True;->Chart1->Visible=True;->Chart2->Visible=True;->Chart3->Visible=True;->Chart4->Visible=True;

}

//ShowNotice(); __fastcall TForm1::FormCreate(TObject *Sender) // внешний вид таблицы , а также разметка и действия обьектов при старте формы

{i;->StringGrid1->ColCount=5;->StringGrid1->RowCount=7;->StringGrid1->Cells[1][0]="Метод половинного деления";->StringGrid1->Cells[2][0]="Метод хорд";->StringGrid1->Cells[3][0]="Метод касательных";->StringGrid1->Cells[4][0]="Метод итераций";->StringGrid1->Cells[0][1]="0.01";->StringGrid1->Cells[0][2]="0.001";->StringGrid1->Cells[0][3]="0.0001";->StringGrid1->Cells[0][4]="0.00001";->StringGrid1->Cells[0][5]="0.000001";->StringGrid1->Cells[0][6]="0.0000001";(i=1;i<5;i++)->StringGrid1->ColWidths[i]=175;->StringGrid1->RowHeights[0]=30;->StringGrid1->ColWidths[0]=100;->Clear();->Clear();->Clear();

}

Похожие работы на - Реализация программы расчета задачи симплекс-метода

 

Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!