3. Код программы
#include <vcl.h>
#include <math.h>
#include <windows.h>
#include <mmsystem.h>
#pragma hdrstop
#include "Unit1.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
// =============== Объявление переменных и задание их значений
float a1 = 3, b1 = 2, d1 = 2, a2 = 3, b2 = 3, d2 = 3, a = 1.2,
b, tK = 0.5, tKon = 10, t0 = 0, t, E = 0.001, xl, xr, c, d,
el[3], y;
bool began = false;
int i, n;
// ===========================================================
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
// === Отображение и скрытие необходимых компонентов на форме:
RadioGroup1->Visible = false;
RadioGroup2->Visible = false;
Chart1->Visible = false;
Button1->Visible = false;
BitBtn1->Caption = "";
BitBtn2->Caption = "";
BitBtn3->Caption = " Выход";
BitBtn1->Visible = false;
BitBtn2->Visible = false;
BitBtn3->Visible = false;
}
// ====================== Функции:
// ========== Нелинейное уравнение
float f (float x)
{
return 0.25*pow(x,3) + x - 1.2502;
}
// ====== Производная от функции f
float f1 (float x)
{
return 0.75*pow(x,2) + 1;
}
// ====== Функция, эквивалентная f
float fi (float x)
{
return 1.2502 - 0.25*pow(x,3);
}
// ===============================
// ==== Начало выполнения вычислений по нажатию кнопки "Вычислить":
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Series1->Clear(); // ============================= Очистка графика
n = 0;
xl = 0; // ============= Задание интервала поиска корней
xr = 2; // ======================= нелинейного уравнения
Series1->Clear(); // ============== Очистка графика перед запуском
// ===================================== Решение системы уравнений:
float z, p;
p = (((a1+a2)*(d1+d2))-(d1+d2))/(((a1+a2)*(b1+b2))-(b1+b2));// == p
z = (d1 - b1*p) / a1; // ================ z, выраженное с помощью p
if (fabs(z) > fabs(p))
c = z; else c = p;
Label12->Caption = ("p = "+FloatToStrF(p,ffFixed,8,3));
Label3->Caption = ("z = "+FloatToStrF(z,ffFixed,8,3));
// ===============================================================
// =================== Выбор метода решения нелинейного уравнения:
switch (RadioGroup2->ItemIndex)
{
// ================ Решение нелинейного уравнения методом Ньютона:
case 0:
while(fabs(xr - xl) > E)
{
if (n!=0) xl = xr;
xr = xl - f(xl) / f1(xl);
n++;
}
d = xl;
break;
// ======= Решение нелинейного уравнения методом простой итерации:
case 1:
do
{
if (n!=0) xl = xr;
xr = fi(xl);
n++;
}
while ((fabs(fi(xr)-fi(xl))) >= E);
d = xr;
break;
// =============== Решение нелинейного уравнения методом бисекции:
case 2:
float xm, xd;
xd = xr-xl;
xm = xl+xd;
while (xd>=E)
{
n++;
xd = xd/2;
xm = xl+xd;
if (f(xl) * f(xm) < 0)
xr = xm;
else
xl = xm;
}
d = xm;
break;
// =================== Решение нелинейного уравнения методом хорд:
case 3:
float xlh, xrh;
if (f(xl) < 0) xlh = xl; else xlh = xr;
do
{
if (n!= 0) xlh = xrh;
if (f(xl)<0) xrh = xlh - ((f(xlh)*(xr - xlh))/(f(xr) - f(xlh)));
else
xrh = xlh - ((f(xlh)*(xlh - xl))/(f(xlh) - f(xl)));
n++;
}
while (fabs(xrh - xlh) > E);
d = xrh;
break;
}
Label2->Caption=("x = d = "+ FloatToStrF(d,ffFixed,8,3));
Label32->Caption=("Проверка: " + FloatToStrF(f(d),ffFixed,8,5));
Label29->Caption=("Счётчик итераций: "+ IntToStr(n));
// ==============================================================
// =========================== Построение графика, схема Горнера:
b = fabs(d - a); // ============================== Коэффициент b
el[1] = a;
el[2] = b;
el[3] = c+d;
for (float t=t0;t<=tKon;t=t+tK)
{
y=el[1];
for(i=2;i<=3;i++)
{
y=y*t+el[i];
}
if (RadioGroup1->ItemIndex==1) // = Условие для построения
// ============================ графика в реальном времени
{
Series1->AddXY(t,y);
Sleep(tK*1000);
Application->ProcessMessages();
}
else Series1->AddXY(t,y);
}
}
// =======================================================
void __fastcall TForm1::Button2Click(TObject *Sender)
{
began = true;
Image1->Visible = false;
Image2->Visible = false;
Image3->Visible = false;
Label37->Visible = false;
Label38->Visible = false;
Label39->Visible = false;
Label40->Visible = false;
Label41->Visible = false;
Label42->Visible = false;
Label43->Visible = false;
RadioGroup1->Visible = true;
RadioGroup2->Visible = true;
Chart1->Visible = true;
Button1->Visible = true;
BitBtn1->Visible = true;
BitBtn2->Visible = true;
BitBtn3->Visible = true;
}
// ===============================================================
void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key,
TShiftState Shift)
{
if ((Key == 27) && (began == false))
Close();
}
// ===============================================================
void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
sndPlaySound("yesterday.wav", SND_ASYNC); // = Проигрывание музыки
}
// ===============================================================
void __fastcall TForm1::BitBtn2Click(TObject *Sender)
{
sndPlaySound(NULL,NULL); // ======== Остановка проигрывания музыки
}
// ===============================================================
