Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Офрмление 15

.doc
Скачиваний:
0
Добавлен:
30.05.2020
Размер:
67.58 Кб
Скачать

Лабораторна робота №15. Алгоритми пошуку коренів рівнянь

Мета роботи : вивчити алгоритми пошуку коренів нелінійних рівнянь алгебри із заданою точністю.

Код

#include <vcl.h>

#pragma hdrstop

#include<math.h>

#include "Unit1.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

double fun(double,TRadioGroup*);

double Metod_Del_2(double,double,double,double,TRadioGroup*);

double Metod_Newtona(double,double,double);

double Metod_Newtona1(double,double,double);

double fun3(double);

double fun2(double);

double fun4(double);

double fun5(double);

//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)

{

double a,b,x,eps,h,y,r;

int nom=0,iter;

a=StrToFloat(Edit1->Text);

b=StrToFloat(Edit2->Text);

eps=StrToFloat(Edit3->Text);

h=StrToFloat(Edit4->Text);

if(RadioGroup1->ItemIndex==0){

Memo1->Lines->Add("Функція 4*х - 7*sin(х)");

Chart1->Series[0]->Clear();

for(x=a-h;x<b+h;x+=h)

Chart1->Series[0]->AddXY(x,fun(x,RadioGroup1));

Memo1->Lines->Add("------ Корені ------");

for(x=a;x<=b;x+=h){

if(fun(x,RadioGroup1)*fun(x+h,RadioGroup1)<0){

nom++;

if(RadioGroup2->ItemIndex==0)

y=Metod_Del_2(fun(x,RadioGroup1),x,x+h,eps,RadioGroup1);

if(RadioGroup2->ItemIndex==1)

y=Metod_Newtona1(x,x+h,eps);

Memo1->Lines->Add(IntToStr(nom)+"- й = "+FloatToStrF(y, ffFixed, 8,6));

}

}

if(nom==0) Memo1->Lines->Add("На відрізку коренів НЕМАЄ!");

}

if(RadioGroup1->ItemIndex==1){

Memo1->Lines->Add(" ");

Memo1->Lines->Add("f=ln(x)-5*pow(sin(x),2)");

Chart1->Series[0]->Clear();

for(x=a-h;x<b+h;x+=h)

Chart1->Series[0]->AddXY(x,fun(x,RadioGroup1));

Memo1->Lines->Add("------ Корені ------");

for(x=a;x<=b;x+=h){

if(fun(x,RadioGroup1)*fun(x+h,RadioGroup1)<0){

nom++;

if(RadioGroup2->ItemIndex==0)

y=Metod_Del_2(fun(x,RadioGroup1),x,x+h,eps,RadioGroup1);

if(RadioGroup2->ItemIndex==1)

y=Metod_Newtona(x,x+h,eps);

Memo1->Lines->Add(IntToStr(nom)+"- й = "+FloatToStrF(y, ffFixed, 8,6));

}

}

if(nom==0) Memo1->Lines->Add("На відрізку коренів НЕМАЄ!");

}

}

//---------------------------------------------------------------------------

//------------------------- Метод ділення відрізку навпіл ---------------------

double Metod_Del_2(double x, double x0, double x1, double eps,TRadioGroup *nomer1){

double x2, y0, y2;

y0=fun(x0,nomer1);

do {

x2=(x0+x1)/2;

y2=fun(x2,nomer1);

if(y0*y2>0){

x0=x2;

y0=y2;

}

else x1=x2;

} while (fabs(x1-x0)>eps);

return (x0+x1)/2;

}

//------------------------- Задана функція f(х)---------------------

double fun(double x, TRadioGroup *nomer){

double func=0;

if (nomer->ItemIndex==0) func=4*x-7*sin(x);

if (nomer->ItemIndex==1) func=log(x)-5*pow(sin(x),2);

return func;

}

void __fastcall TForm1::Button2Click(TObject *Sender)

{

Memo1->Clear();

}

//--------------------------------------------------------------------------

double Metod_Newtona(double x0, double x1, double eps){

double x2, y0, y2;

x2=x0;

do {

x0=x2;

x2=x0-(fun3(x0)/fun2(x0));

} while (fabs(x2 - x0)>eps);

return x2;

}

//--------------------------------------------------

double fun3(double x)

{

return 4*x-7*sin(x);

}

double fun2(double x)

{

return 4*x-7*sin(x);

}

double Metod_Newtona1(double x0, double x1, double eps){

double x2, y0, y2;

x2=x0;

do {

x0=x2;

x2=x0-(fun4(x0)/fun5(x0));

} while (fabs(x2 - x0)>=eps);

return x2;

}

//--------------------------------------------------

double fun4(double x)

{

return log(x)-5*pow(sin(x),2);

}

double fun5(double x)

{

return log(x)-5*pow(sin(x),2);

}

//---------------------------------------------------------------------------

void __fastcall TForm1::FormCreate(TObject *Sender)

{

Edit1->Text="2";

Edit2->Text="6";

Edit3->Text="2";

Edit4->Text="0,1";

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Edit1KeyPress(TObject *Sender, char &Key)

{

if (IsCharAlpha(Key) || Key=='=' || Key=='[' || Key==']') Key=0;

if(Key==VK_RETURN) {Edit1->SetFocus(); return;}

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Edit2KeyPress(TObject *Sender, char &Key)

{

if (IsCharAlpha(Key) || Key=='=' || Key=='[' || Key==']' || Key=='/' || Key=='.' ) Key=0;

if(Key==VK_RETURN) {Edit1->SetFocus(); return;}

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Edit3KeyPress(TObject *Sender, char &Key)

{

if (IsCharAlpha(Key) || Key=='=' || Key=='[' || Key=='-' || Key==']' || Key=='/' || Key=='.' ) Key=0;

if(Key==VK_RETURN) {Edit1->SetFocus(); return;}

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Edit4KeyPress(TObject *Sender, char &Key)

{

if (IsCharAlpha(Key) || Key=='=' || Key=='[' || Key=='-' || Key==']' || Key=='/' || Key=='.' ) Key=0;

if(Key==VK_RETURN) {Edit1->SetFocus(); return;}

}

//---------------------------------------------------------------------------

//---------------------------------------------------------------------------

void __fastcall TForm1::Memo1KeyPress(TObject *Sender, char &Key)

{

Key=0;

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button3Click(TObject *Sender)

{

Close();

}

//---------------------------------------------------------------------------

//---------------------------------------------------------------------------

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]