ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 18.07.2024
Просмотров: 24
Скачиваний: 0
Лабораторна робота №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();
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------