
После нажатия кнопки ок пользователь увидит на форме таблицу с
результатами
работы программы и 4 графика, соответствующие
заданию:
Рисунок 4. Форма с выполненным заданием и результатами
5 БЛОК-СХЕМА АЛГОРИТМА
5.1 БЛОК-СХЕМЫ ПРОЦЕДУР
5.1.1 iteration
5.1.2newton
5.1.3HalfDivide
5.1.4Chordes
6 ПРОВЕРКА СЧЕТА ПО ПРОГРАММЕ
При сравнении данных, полученных при решении задачи выяснилось, что наиболее быстрыми оказались методы касательных и итерация.Эти методы вычислили значение корня необходимой точности за 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))
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
doublefs(doublex)// первая производная
{
return 15*x*x-1;
}
//---------------------------------------------------------------------------
doublef(doublex) // исходное уравнение
{
return 5*x*x*x-x-1;
}
//---------------------------------------------------------------------------
long double f1(long double x) // сжимающая функция
{
return x*x;
}
//---------------------------------------------------------------------------
void newton(double a, double b)// касательные
{
double c,cnext,c1;
double ex[6] = { 0.01, 0.001, 0.0001, 0.00001, 0.000001, 0.0000001 };
int i,count=0;
c=(a+b)/2; // подсчитал первое и нулевое значение
cnext=c-(f(c)/fs(c));
for ( i = 0; i < 6; i++)
{
while (ABS(cnext-c)>ex[i])
{
c=cnext;
cnext=c-(f(c)/fs(c));
count++;
}
Form1->StringGrid1->Cells[3][i+1]=IntToStr(count);
}
}
//---------------------------------------------------------------------------
void iteration(double a, double b)
{
long double x,xnext;
long double ex[6] = { 0.01, 0.001, 0.0001, 0.00001, 0.000001, 0.0000001 };
int i,count=0;
x=(a+b)/2;
xnext=f1(x);
for ( i = 0; i < 6; i++)
{
while (ABS(xnext-x)>=ex[i])
{
x=xnext;
xnext=f1(x);
count++;
}
Form1->StringGrid1->Cells[4][i+1]=IntToStr(count);
}
}
//---------------------------------------------------------------------------
void HalfDivide(double a, double b)
{ double c;
int i,count=0;
double epsilon;
double ex[6] = { 0.01, 0.001, 0.0001, 0.00001, 0.000001, 0.0000001 };
for ( i = 0; i < 6; i++)
{
while (ABS(b-a)>ex[i])
{
c=(a+b)/2.0;
if(f(a)*f(c)<0.0)
{
b=c;
}
else
{
a=c;
}
count=count+1;
}
Form1->StringGrid1->Cells[1][i+1]=IntToStr(count);
}
}
//---------------------------------------------------------------------------
void Chordes(double a, double b)
{ int i,count=0;
double ex[6] = { 0.01, 0.001, 0.0001, 0.00001, 0.000001, 0.0000001 };
for ( i = 0; i < 6; i++)
{
while(ABS(b-a)>ex[i])
{
a = b - ((b - a) * f(b)/(f(b) - f(a)));
b = a - ((a - b) * f(a)/(f(a) - f(b)));
count++;
}
Form1->StringGrid1->Cells[2][i+1]=IntToStr(count);
}
}
//---------------------------------------------------------------------------
void ShowNotice()
{
MessageDlg("Задача решена", mtInformation, TMsgDlgButtons() << mbOK,1200);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int i,j;
double c;
int count=0;
double a, b;
a=StrToFloat(Edit3->Text);
b=StrToFloat(Edit4->Text);
iteration(a,b);
Chordes(a,b);
HalfDivide(a,b);
newton(a,b);
ShowNotice();
Label1->Visible=true;
Label3->Visible=true;
Label4->Visible=true;
Label5->Visible=true;
for (i=1;i<=StringGrid1->RowCount-1;i++)
{
Series1->AddXY(i,StrToInt(StringGrid1->Cells[1][i]),clBlack);
Series8->AddXY(i,StrToInt(StringGrid1->Cells[3][i]),clBlack);
Series5->AddXY(i,StrToInt(StringGrid1->Cells[2][i]),clBlack);
Series2->AddXY(i,StrToInt(StringGrid1->Cells[4][i]),clBlack);
}
Form1->StringGrid1->Visible=True;
Form1->Chart1->Visible=True;
Form1->Chart2->Visible=True;
Form1->Chart3->Visible=True;
Form1->Chart4->Visible=True;
}
//ShowNotice();
void__fastcallTForm1::FormCreate(TObject*Sender) // внешний вид таблицы , а также разметка и действия обьектов при старте формы
{
int i;
Form1->StringGrid1->ColCount=5;
Form1->StringGrid1->RowCount=7;
Form1->StringGrid1->Cells[1][0]="Метод половинного деления";
Form1->StringGrid1->Cells[2][0]="Метод хорд";
Form1->StringGrid1->Cells[3][0]="Метод касательных";
Form1->StringGrid1->Cells[4][0]="Метод итераций";
Form1->StringGrid1->Cells[0][1]="0.01";
Form1->StringGrid1->Cells[0][2]="0.001";
Form1->StringGrid1->Cells[0][3]="0.0001";
Form1->StringGrid1->Cells[0][4]="0.00001";
Form1->StringGrid1->Cells[0][5]="0.000001";
Form1->StringGrid1->Cells[0][6]="0.0000001";
for (i=1;i<5;i++)
Form1->StringGrid1->ColWidths[i]=175;
Form1->StringGrid1->RowHeights[0]=30;
Form1->StringGrid1->ColWidths[0]=100;
Edit1->Clear();
Edit3->Clear();
Edit4->Clear();
}
//---------------------------------------------------------------------------