Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Блок-схемы алгоритмов расчёта.

3.1 Метод бисекции.

 

[a, b] – интервал поиска корня, E – точность, K – корень, n – число итераций.


3.2 Метод хорд.

 

 

[a, b] – интервал поиска корня, E – точность, K – корень, n – число итераций.


3.3 Метод простой итерации.

 

 

 

[a, b] – интервал поиска корня, E – точность, K – начальное приближение, корень,

n – число итераций.


3.4 Метод Ньютона.

 

 

[a, b] – интервал поиска корня, E – точность, K – начальное приближение, корень,

n – число итераций.


3.5 Алгоритм Горнера.

 

 

 

у - многочлен вида .


3.6 Решение квадратного уравнения путём нахождения дискриминанта.

 

 

 

 

Для уравнения вида , где

a1,b1,c1 – коэффициенты, D – дискриминант.


Таблица идентификаторов.

переменная тип назначение
K,p,g,c,m real коэф. K,p,g,c,m уравнения
TA,TB,TKV real начальное, конечное, время квантования
aa,bb,cc real коэф. квадратного уравнения
E real точность
Xnach,Ynach integer начальное разрешение экрана
k real начальное приближение
i,n integer счётчики
shX,shY real масштабные коэф. осей
Ymax real максимальное значение функции
YF real текущее значение функции
x,y integer текущие координаты

Листинг программы.

unit Unit1;

 

interface

 

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, Mask, ExtCtrls, Unit2, ComCtrls, Grids, MPlayer,

Tlhelp32, jpeg, Menus, dwinlock;

 

type

TForm1 = class(TForm)

Button5: TButton;

Panel5: TPanel;

Label26: TLabel;

Memo1: TMemo;

Button6: TButton;

Button7: TButton;

Panel6: TPanel;

Label27: TLabel;

Label28: TLabel;

PageControl1: TPageControl;

TabSheet1: TTabSheet;

TabSheet2: TTabSheet;

TabSheet3: TTabSheet;

TabSheet4: TTabSheet;

Label4: TLabel;

ComboBox1: TComboBox;

Label5: TLabel;

MaskEdit1: TMaskEdit;

Label21: TLabel;

Label15: TLabel;

MaskEdit4: TMaskEdit;

Label19: TLabel;

MaskEdit2: TMaskEdit;

Label6: TLabel;

MaskEdit3: TMaskEdit;

Label20: TLabel;

Label14: TLabel;

Button2: TButton;

Label3: TLabel;

Label1: TLabel;

Label8: TLabel;

Label9: TLabel;

MaskEdit5: TMaskEdit;

Label10: TLabel;

MaskEdit6: TMaskEdit;

Label12: TLabel;

MaskEdit7: TMaskEdit;

Button1: TButton;

Label13: TLabel;

Label16: TLabel;

MaskEdit8: TMaskEdit;

Label17: TLabel;

MaskEdit9: TMaskEdit;

Label18: TLabel;

MaskEdit10: TMaskEdit;

Button3: TButton;

Label22: TLabel;

Label23: TLabel;

MaskEdit11: TMaskEdit;

Label24: TLabel;

MaskEdit12: TMaskEdit;

Label25: TLabel;

MaskEdit13: TMaskEdit;

Button4: TButton;

Panel1: TPanel;

Label2: TLabel;

Label29: TLabel;

Label30: TLabel;

Label31: TLabel;

Panel2: TPanel;

Label32: TLabel;

Label33: TLabel;

Label34: TLabel;

Label35: TLabel;

Label36: TLabel;

Panel3: TPanel;

Label37: TLabel;

Label38: TLabel;

Label39: TLabel;

Panel4: TPanel;

Label40: TLabel;

Label41: TLabel;

Label42: TLabel;

Label43: TLabel;

Label44: TLabel;

Memo2: TMemo;

Memo3: TMemo;

Memo4: TMemo;

Memo5: TMemo;

Button8: TButton;

StringGrid1: TStringGrid;

Memo6: TMemo;

Timer1: TTimer;

Panel7: TPanel;

Image1: TImage;

Image3: TImage;

Image4: TImage;

MediaPlayer1: TMediaPlayer;

Timer2: TTimer;

Image2: TImage;

Timer3: TTimer;

Timer4: TTimer;

Panel8: TPanel;

Memo7: TMemo;

dWinLock1: TdWinLock;

MainMenu1: TMainMenu;

N1: TMenuItem;

N2: TMenuItem;

N3: TMenuItem;

procedure Button1Click(Sender: TObject);

procedure Button3Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

procedure ComboBox1Change(Sender: TObject);

procedure Button5Click(Sender: TObject);

procedure Button4Click(Sender: TObject);

procedure MaskEdit5Exit(Sender: TObject);

procedure MaskEdit6Exit(Sender: TObject);

procedure MaskEdit7Exit(Sender: TObject);

procedure Button6Click(Sender: TObject);

procedure Button7Click(Sender: TObject);

procedure MaskEdit11Change(Sender: TObject);

procedure MaskEdit12Change(Sender: TObject);

procedure MaskEdit13Change(Sender: TObject);

procedure MaskEdit2Exit(Sender: TObject);

procedure MaskEdit3Exit(Sender: TObject);

procedure MaskEdit1Exit(Sender: TObject);

procedure Button8Click(Sender: TObject);

procedure FormCreate(Sender: TObject);

procedure Timer1Timer(Sender: TObject);

procedure Timer2Timer(Sender: TObject);

procedure Timer3Timer(Sender: TObject);

procedure Timer4Timer(Sender: TObject);

procedure N1Click(Sender: TObject);

procedure Memo7Change(Sender: TObject);

procedure N2Click(Sender: TObject);

private

{ Private declarations }

public

 

 

{ Public declarations }

end;

 

var

Form1: TForm1;

K,a,b,E:real;

m,aa,bb,cc:real;

p,g,c:real;

TA,TB,Tkv:real;

i,n:integer;

Xnach,Ynach:integer;

implementation

 

 

{$R *.dfm}

//Процедура изменения разрешения на 1024х768

procedure TForm1.FormCreate(Sender: TObject);

var dm: TDevMode;

x,y:word;

begin

Xnach:=screen.Width;

Ynach:=screen.Height;

x:=1024;

y:=768;

ZeroMemory(@dm,sizeof(TDevMode));

dm.dmSize:= sizeof(TDevMode);

dm.dmPelsWidth:=x;

dm.dmPelsHeight:=y;

dm.dmFields:=DM_PELSWIDTH or DM_PELSHEIGHT;

ChangeDisplaySettings(dm,0);

 

{Включение таймеров заставки}

panel7.Align:=alClient;

image1.Align:=alClient;

image1.Center:=true;

i:=2;

mediaPlayer1.Play;

Timer1.Enabled:=true;

Timer2.Enabled:=true;

Timer3.Enabled:=true;

Timer4.Enabled:=true;

end;

 

//Функция преобразование пробелов полей ввода в нули

Function probeliVnyli(pr:string):string;

var ipr:integer;

begin

for ipr:=1 to length(pr) do

if pr[ipr]=' ' then pr[ipr]:='0';

probeliVnyli:=pr;

end;

 

//Нахождение коэффициента m

procedure TForm1.Button1Click(Sender: TObject);

var m1,m2:real;

label 2;

begin

 

if aa=0 then

begin

MessageDLG('Введите коэф a1 уравнения!',MTWarning,[mbOK],0);

MaskEdit5.SetFocus;

goto 2;

end;

 

aa:=strTOfloat(probeliVnyli(MaskEdit5.Text));

bb:=strTOfloat(probeliVnyli(MaskEdit6.Text));

cc:=strTOfloat(probeliVnyli(MaskEdit7.Text));

 

label33.Caption:='a1='+floatTOstr(cc);

label34.Caption:='b1='+floatTOstr(cc);

label35.Caption:='c1='+floatTOstr(cc);

 

m1:=(-bb-sqrt(bb*bb-4*aa*cc))/(2*aa);

m2:=(-bb+sqrt(bb*bb-4*aa*cc))/(2*aa);

 

if abs(m2)>abs(m1) then m:=m1

else m:=m2;

if E=0 then E:=0.00001;

m:=round(m/E)*E;

label36.Caption:='m='+floatTOstr(m);

2:

end;

 

//Ввод значений коэффициентов p, g, c

procedure TForm1.Button3Click(Sender: TObject);

begin

p:=strTOfloat(probeliVnyli(MaskEdit8.Text));

g:=cos(strTOfloat(probeliVnyli(copy(MaskEdit9.Text,5,2)))*Pi/180);

c:=sin(strTOfloat(probeliVnyli(copy(MaskEdit10.Text,5,2)))*Pi/180);

 

label37.Caption:='p='+floatTOstr(round(p*100000)/100000);

label38.Caption:='g='+floatTOstr(round(g*100000)/100000);

label39.Caption:='c='+floatTOstr(round(c*100000)/100000);

end;

 

 

//Расчёт коэффициента K

procedure TForm1.Button2Click(Sender: TObject);

var a,b:real;

n,i:integer;

korn:boolean;

ll,ln:real;

label 2;

 

Function F(x:real):real;

begin

F:=sin(x/2)/cos(x/2)-cos(x/2)/sin(x/2)+x;

end;

 

Function D(z:real):real;

begin

D:=arctan(2/z);

end;

 

Function T(q:real):real;

begin

T:=1+2/(sin(q)*sin(q));

end;

 

begin

a:=strTOfloat(probeliVnyli(MaskEdit2.Text));

b:=strTOfloat(probeliVnyli(MaskEdit3.Text));

n:=strTOint(probeliVnyli(MaskEdit1.Text));

E:=1;

 

//Проверка коэф L

ln:=strTOfloat(probeliVnyli(MaskEdit4.Text));

label31.Caption:='L='+floatTOstr(ln);

a:=strTOfloat(probeliVnyli(MaskEdit2.Text));

b:=strTOfloat(probeliVnyli(MaskEdit3.Text));

if (ln<a) or (ln>b) then

begin

MessageDLG('Неверно выбрано начальное приближение!',MTWarning,[mbOK],0);

MaskEdit4.SetFocus;

goto 2;

end;

if ln=0 then

begin

MessageDLG('Введите начальное приближение!',MTWarning,[mbOK],0);

MaskEdit4.SetFocus;

goto 2;

end;

 

if Combobox1.ItemIndex=2 then

begin

ll:=1/(1+(4/(ln*ln)));

if abs(ll)>=1 then

begin

MessageDLG('Неверно выбрано начальное приближение!',MTWarning,[mbOK],0);

MaskEdit4.SetFocus;

goto 2;

end;

end;

 

ln:=strTOfloat(probeliVnyli(MaskEdit4.Text));

ll:=0;

if Combobox1.ItemIndex=3 then

begin

ll:=(-4)*(sin(ln/2)/cos(ln/2)-cos(ln/2)/sin(ln/2)+ln)*cos(ln);

ll:=ll/(sin(ln)*sin(ln)*sin(ln));

if ll<=0 then

begin

MessageDLG('Неверно выбрано начальное приближение!',MTWarning,[mbOK],0);

MaskEdit4.SetFocus;

goto 2;

end;

end;

 

For i:=1 to n do E:=E/10;

 

if (a=0) or (b=0) then

begin

MessageDLG('Введите предполагаемый промежуток нахождения корня!',MTWarning,[mbOK],0);

korn:=true;

MaskEdit3.SetFocus;

goto 2;

end;

korn:=false;

if F(a)*F(b)>0 then

begin

MessageDLG('Данный промежуток не содержит корней!',MTWarning,[mbOK],0);

korn:=true;

MaskEdit3.SetFocus;

goto 2;

end;

 

// ~ Метод бисекции

if ComboBox1.ItemIndex=0 then

begin

a:=strTOfloat(probeliVnyli(MaskEdit2.Text));

b:=strTOfloat(probeliVnyli(MaskEdit3.Text));

n:=0;

While abs(a-b)>E do

begin

K:=(a+b)/2;

n:=n+1;

if F(a)*F(K)<0 then b:=K

else a:=K;

end;

end;

 

// ~ Метод Хорд

if ComboBox1.ItemIndex=1 then

begin

n:=0;

a:=strTOfloat(probeliVnyli(MaskEdit2.Text));

b:=strTOfloat(probeliVnyli(MaskEdit3.Text));

if F(a)<0 then

begin

k:=a;

While abs(F(k))>E do

begin

n:=n+1;

k:=k-(F(k)*(b-k))/(F(b)-F(k));

end;

end

 

else

begin

k:=b;

While abs(F(k))>E do

begin

n:=n+1;

k:=k-(F(k)*(k-a))/(F(a)-F(k));

end;

end;

end;

 

// ~ Метод простой Итерации

if ComboBox1.ItemIndex=2 then

begin

a:=strTOfloat(probeliVnyli(MaskEdit2.Text));

b:=strTOfloat(probeliVnyli(MaskEdit3.Text));

k:=strTOfloat(probeliVnyli(MaskEdit4.Text));

n:=0;

While abs(F(k))>E do

begin

n:=n+1;

k:=D(k);

end;

end;

 

// ~ Метод Ньютона

if ComboBox1.ItemIndex=3 then

begin

n:=0;

a:=strTOfloat(probeliVnyli(MaskEdit2.Text));

b:=strTOfloat(probeliVnyli(MaskEdit3.Text));

k:=strTOfloat(probeliVnyli(MaskEdit4.Text));

While abs(F(k))>E do

begin

n:=n+1;

k:=k-F(k)/T(k);

end;

end;

if korn=true then begin

k:=0;

n:=0;

end;

Label14.Caption:='n= '+floatTOstr(n);

n:=strTOint(probeliVnyli(MaskEdit1.Text));

E:=1;

For i:=1 to n do E:=E/10;

k:=round(k/E)*E;

 

label30.Caption:=Label14.Caption;

label32.Caption:='K='+floatTOstr(K);

2:

end;

 

//Действия на изменение способа вычисления коэф К

procedure TForm1.ComboBox1Change(Sender: TObject);

begin

if Combobox1.ItemIndex=0 then

begin

Label15.Visible:=False;

MaskEdit4.Visible:=False;

Memo2.Visible:=true;

Memo3.Visible:=false;

Memo4.Visible:=false;

Memo5.Visible:=false;

end;

if Combobox1.ItemIndex=1 then

begin

Label15.Visible:=False;

MaskEdit4.Visible:=False;

Memo3.Visible:=true;

Memo2.Visible:=false;

Memo4.Visible:=false;

Memo5.Visible:=false;

end;

if Combobox1.ItemIndex=2 then

begin

Label15.Visible:=True;

MaskEdit4.Visible:=True;

MaskEdit4.Clear;

MaskEdit4.SetFocus;

Memo4.Visible:=true;

Memo2.Visible:=false;

Memo3.Visible:=false;

Memo5.Visible:=false;

end;

if Combobox1.ItemIndex=3 then

begin

Label15.Visible:=True;

MaskEdit4.Visible:=True;

MaskEdit4.Clear;

MaskEdit4.SetFocus;

Memo5.Visible:=true;

Memo2.Visible:=false;

Memo3.Visible:=false;

Memo4.Visible:=false;

end;

end;

 

 

//Ввод значений отрезков времени

procedure TForm1.Button4Click(Sender: TObject);

begin

MaskEdit12Change(form1);

MaskEdit13Change(form1);

TA:=strTOfloat(probeliVnyli(MaskEdit11.Text));

TB:=strTOfloat(probeliVnyli(MaskEdit12.Text));

TKV:=strTOfloat(probeliVnyli(MaskEdit13.Text));

end;

 

//Проверка разрешениия перехода к построению графика

procedure TForm1.Button5Click(Sender: TObject);

begin

Button5.Enabled:=true;

if (k=0) and (m=0) and (p=0) and (g=0) and (c=0) or (TB=0) or (TKV=0) then

begin

MessageDLG('Проверьте значения коэффициентов!',MTWarning,[mbOK],0);

end

else Form2.Visible:=true;

end;

 

//Проверка существования корней квадратного уравнения

procedure TForm1.MaskEdit5Exit(Sender: TObject);

begin

aa:=strTOfloat(probeliVnyli(MaskEdit5.Text));

bb:=strTOfloat(probeliVnyli(MaskEdit6.Text));

cc:=strTOfloat(probeliVnyli(MaskEdit7.Text));

if (bb*bb-4*aa*cc)<0 then

begin

MessageDLG('Проверьте коэффициенты: уравнение не имеет решения!',mtError,[mbOK],0);

Button1.Enabled:=false;

end

else Button1.Enabled:=true;

label33.Caption:='a1='+floatTOstr(aa);

end;

procedure TForm1.MaskEdit6Exit(Sender: TObject);

begin

aa:=strTOfloat(probeliVnyli(MaskEdit5.Text));

bb:=strTOfloat(probeliVnyli(MaskEdit6.Text));

cc:=strTOfloat(probeliVnyli(MaskEdit7.Text));

if (bb*bb-4*aa*cc)<0 then

begin

MessageDLG('Проверьте коэффициенты: уравнение не имеет решения!',mtError,[mbOK],0);

Button1.Enabled:=false;

end

else Button1.Enabled:=true;

label34.Caption:='b1='+floatTOstr(bb);

end;

procedure TForm1.MaskEdit7Exit(Sender: TObject);

begin

aa:=strTOfloat(probeliVnyli(MaskEdit5.Text));

bb:=strTOfloat(probeliVnyli(MaskEdit6.Text));

cc:=strTOfloat(probeliVnyli(MaskEdit7.Text));

if (bb*bb-4*aa*cc)<0 then

begin

MessageDLG('Проверьте коэффициенты: уравнение не имеет решения!',mtError,[mbOK],0);

Button1.Enabled:=false;

end

else Button1.Enabled:=true;

label35.Caption:='c1='+floatTOstr(cc);

end;

 

//Скрыть-восстановить область условий

procedure TForm1.Button6Click(Sender: TObject);

begin

Panel5.Top:=707;

button6.Visible:=false;

Button7.Visible:=true;

end;

procedure TForm1.Button7Click(Sender: TObject);

begin

Panel5.Top:=609;

button6.Visible:=true;

Button7.Visible:=false;

end;

 

//Проверка заданных промежутков времени

procedure TForm1.MaskEdit11Change(Sender: TObject);

var TTA:real;

begin

TTA:=strTOfloat(probeliVnyli(MaskEdit11.Text));

if TTA<0 then

begin

MessageDLG('Начальный момент времени T не может быть меньше нуля!',mtError,[mbOK],0);

maskEdit11.SetFocus;

end;

label40.Caption:='T='+floatTOstr(TTA);

end;

 

procedure TForm1.MaskEdit12Change(Sender: TObject);

var TTA,TTB:real;

begin

TTA:=strTOfloat(probeliVnyli(MaskEdit11.Text));

TTB:=strTOfloat(probeliVnyli(MaskEdit12.Text));

if (TTB<0) or (TTB<=TTA) then

begin

MessageDLG('Конечный момент времени T` не может быть меньше начального T!',mtError,[mbOK],0);

maskEdit12.SetFocus;

end;

label41.Caption:='T='+floatTOstr(TTB);

end;

 

procedure TForm1.MaskEdit13Change(Sender: TObject);

var TTB,TTKV:real;

begin

TTB:=strTOfloat(probeliVnyli(MaskEdit12.Text));

TTKV:=strTOfloat(probeliVnyli(MaskEdit13.Text));

if TTKV=0 then

begin

MessageDLG('Проверьте значение времени квантования tкв',mtError,[mbOK],0);

maskEdit13.SetFocus;

end;

if TTKV>TTB then

begin

MessageDLG('Проверьте значение времени квантования tкв',mtError,[mbOK],0);

maskEdit13.SetFocus;

end;

label42.Caption:='tкв='+floatTOstr(TTKV);

end;

 

//Перенос значений на панель расчётных данных

procedure TForm1.MaskEdit2Exit(Sender: TObject);

begin

a:=strTOfloat(probeliVnyli(MaskEdit2.Text));

label2.Caption:='a='+floatTOstr(a);

end;

procedure TForm1.MaskEdit3Exit(Sender: TObject);

begin

b:=strTOfloat(probeliVnyli(MaskEdit3.Text));

label29.Caption:='b='+floatTOstr(b);

end;

procedure TForm1.MaskEdit1Exit(Sender: TObject);

begin

label44.Caption:='-'+MaskEdit1.Text;

label43.Caption:='E=10';

end;

 

//Построение таблицы сравнения методов нахождения коэф К

procedure TForm1.Button8Click(Sender: TObject);

var gn,gk:string;

begin

StringGrid1.Visible:=true;

StringGrid1.Cells[0,0]:='Методы\значения';

StringGrid1.Cells[0,1]:='Метод Бисекции';

StringGrid1.Cells[0,2]:='Метод Ходр';

StringGrid1.Cells[0,3]:='Метод пр. Итерации';

StringGrid1.Cells[0,4]:='Метод Ньютона';

StringGrid1.Cells[1,0]:='K';

StringGrid1.Cells[2,0]:='n';

i:=combobox1.ItemIndex;

gn:=label30.Caption;

gK:=label32.Caption;

combobox1.ItemIndex:=0;

Button2.Click;

stringGrid1.Cells[1,1]:=floatTOstr(K);

StringGrid1.Cells[2,1]:=label30.Caption;

combobox1.ItemIndex:=1;

Button2.Click;

stringGrid1.Cells[1,2]:=floatTOstr(K);

StringGrid1.Cells[2,2]:=label30.Caption;

combobox1.ItemIndex:=2;

Button2.Click;

stringGrid1.Cells[1,3]:=floatTOstr(K);

StringGrid1.Cells[2,3]:=label30.Caption;

combobox1.ItemIndex:=3;

Button2.Click;

stringGrid1.Cells[1,4]:=floatTOstr(K);

StringGrid1.Cells[2,4]:=label30.Caption;

combobox1.ItemIndex:=i;

Label30.Caption:=gn;

label32.Caption:=gK;

end;

 

//Действия на срабатывание событий таймеров заставки

procedure TForm1.Timer1Timer(Sender: TObject);

begin

image1.Visible:=false;

image2.Visible:=true;

image2.Align:=alClient;

image2.Center:=true;

Timer1.Enabled:=false;

end;

procedure TForm1.Timer2Timer(Sender: TObject);

begin

image2.Visible:=false;

image3.Visible:=true;

image3.Align:=alClient;

image3.Center:=true;

timer2.Enabled:=false;

end;

procedure TForm1.Timer3Timer(Sender: TObject);

begin

image3.Visible:=false;

image4.Visible:=true;

image4.Align:=alClient;

image4.Center:=true;

Timer3.Enabled:=False;

end;

procedure TForm1.Timer4Timer(Sender: TObject);

begin

Timer2.Enabled:=false;

image4.Visible:=false;

panel7.Visible:=false;

mediaPlayer1.Stop;

Timer4.Enabled:=false;

end;

 

procedure TForm1.N1Click(Sender: TObject);

begin

panel8.Visible:=true;

end;

procedure TForm1.Memo7Change(Sender: TObject);

begin

Panel8.Visible:=false;

end;

 

procedure TForm1.N2Click(Sender: TObject);

var dm: TDevMode;

begin

ZeroMemory(@dm,sizeof(TDevMode));

dm.dmSize:= sizeof(TDevMode);

dm.dmPelsWidth:=xnach;

dm.dmPelsHeight:=ynach;

dm.dmFields:=DM_PELSWIDTH or DM_PELSHEIGHT;

ChangeDisplaySettings(dm,0);

Application.Terminate;

end;

 

end.

 

unit Unit2;

 

interface

 

 

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, ExtCtrls, StdCtrls, dwinlock;

 

type

TForm2 = class(TForm)

PaintBox1: TPaintBox;

Panel1: TPanel;

Button1: TButton;

Label1: TLabel;

Label2: TLabel;

Timer1: TTimer;

Label3: TLabel;

Label4: TLabel;

RadioGroup1: TRadioGroup;

RadioButton1: TRadioButton;

RadioButton2: TRadioButton;

Timer2: TTimer;

dWinLock1: TdWinLock;

Button2: TButton;

procedure Button1Click(Sender: TObject);

procedure PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,

Y: Integer);

procedure Timer1Timer(Sender: TObject);

procedure Timer2Timer(Sender: TObject);

procedure RadioButton1Click(Sender: TObject);

procedure PaintBox1Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

 

var

Form2: TForm2;

 

 

implementation

uses unit1;

var YF,YMAX:real;

x,y,i:integer;

shX,shY:real;

t:real;

A:array[1..3] of real;

 

{$R *.dfm}

 

//Функция вычисления y по алгоритму Горнера

Function F(z:real):real;

var h:real; i:integer;

begin

h:=p;

For i:=1 to 3 do h:=h*z+A[i];

F:=abs(h);

end;

 

//Вывод текущих координат на панель

procedure TForm2.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,

Y: Integer);

var q:real;

begin

q:=F(TB);

label1.Caption:='t='+floatTOstr((X-30)*TB/920);

label2.Caption:='Y='+floatTOstr(q*(550-Y)/480);

label3.Caption:='XX='+intTOstr(X);

label4.Caption:='YY='+intTOstr(Y);

end;

 

//Прорисовка осей

procedure TForm2.PaintBox1Click(Sender: TObject);

begin

PaintBox1.Canvas.Pen.Color:=clCream;

paintbox1.Canvas.Rectangle(0,0,1024,640);

 

//Координатные оси и стрелки

x:=30;

y:=550;

PaintBox1.Color:=clBlack;

PaintBox1.Canvas.Pen.Width:=2;

PaintBox1.Canvas.MoveTo(x,y+10);

PaintBox1.Canvas.LineTo(x,20);

PaintBox1.Canvas.LineTo(x-5,45);

PaintBox1.Canvas.MoveTo(x,20);

PaintBox1.Canvas.LineTo(x+5,45);

PaintBox1.Canvas.TextOut(1004,570,'T');

 

PaintBox1.Canvas.MoveTo(x-5,y);

PaintBox1.Canvas.LineTo(1010,y);

PaintBox1.Canvas.LineTo(985,y-5);

PaintBox1.Canvas.MoveTo(1010,y);

PaintBox1.Canvas.LineTo(985,y+5);

PaintBox1.Canvas.TextOut(7,14,'Y');

 

//Коэффициент преобразования по оси Х

shX:=(950-30)/TB;

 

t:=Tkv;

While t<TB do

begin

y:=550;

x:=30+round(t*shX);

PaintBox1.Canvas.TextOut(x-8,y+10,floatTOstr(t));

PaintBox1.Canvas.MoveTo(x,y-3);

PaintBox1.Canvas.LineTo(x,y+3);

t:=t+Tkv;

end;

PaintBox1.Canvas.TextOut(950,y+10,floatTOstr(TB));

PaintBox1.Canvas.MoveTo(950,y-3);

PaintBox1.Canvas.LineTo(950,y+3);

 

//Вычисление YMAX и коэффициента преобразования по оси Y

A[1]:=g; A[2]:=c; A[3]:=k-m;

t:=0;

Ymax:=0;

While t<=TB do

begin

yF:=F(t);

if yF>Ymax then YMAX:=yF;

t:=t+TKV;

end;

t:=TB;

yF:=F(t);

if yF>Ymax then YMAX:=yF;

shY:=(550-70)/YMAX;

 

//Метки по оси Y

x:=30;

For i:=1 to 10 do

begin

y:=round(550-i*(550-70)/10);

PaintBox1.Canvas.MoveTo(x-3,y);

PaintBox1.Canvas.LineTo(x+3,y);

PaintBox1.Canvas.TextOut(x-27,y,intTOstr(round(YMAX*i/10)));

end;

end;

 

//Реакция на нажатие кнопки "Построение"

procedure TForm2.Button1Click(Sender: TObject);

begin

paintBox1Click(form2);

 

paintBox1.Canvas.Pen.Color:=clRed;

 

//Начальные условия для таймера машинного времени

if RadioButton2.Checked=true then

begin

t:=TA;

i:=0;

yF:=F(t);

x:=round(shX*t);

y:=round(shY*YF);

PaintBox1.Canvas.MoveTo(30+x,550-y);

i:=1;

Timer1.Enabled:=true;

end;

 

//Начальные условия для таймера реального времени

if RadioButton1.Checked=true then

begin

t:=TA;

yF:=F(t);

x:=round(shX*t);

y:=round(shY*YF);

PaintBox1.Canvas.MoveTo(30+x,550-y);

Timer2.Enabled:=true;

end;

end;

 

//Включаем таймер машинного времени

procedure TForm2.Timer1Timer(Sender: TObject);

begin

t:=t+TKV;

if t>TB then begin

Timer1.Enabled:=False;

t:=TB;

YF:=F(t);

x:=round(shX*t);

y:=round(shY*yF);

PaintBox1.Canvas.LineTo(30+x,550-y);

end;

YF:=F(t);

x:=round(shX*t);

y:=round(shY*yF);

PaintBox1.Canvas.LineTo(30+x,550-y);

end;

 

 

//Включаем таймер реального времени

procedure TForm2.Timer2Timer(Sender: TObject);

begin

t:=t+0.01;

if t>(TB) then Timer2.Enabled:=False;

YF:=F(t);

x:=round(shX*t);

y:=round(shY*yF);

PaintBox1.Canvas.LineTo(30+x,550-y);

end;

 

//Выключение таймеров

procedure TForm2.RadioButton1Click(Sender: TObject);

begin

t:=0;

Timer1.Enabled:=false;

Timer2.Enabled:=false;

PaintBox1.Canvas.MoveTo(30,550);

PaintBox1Click(form2);

end;

 

procedure TForm2.Button2Click(Sender: TObject);

begin

Timer1.Enabled:=false;

Timer2.Enabled:=false;

form2.Visible:=false;

end;

end.


Результаты расчёта.

6.1 Коэффициент K.

Как было сказано выше, коэффициент K уравнения рассчитывался четырьмя методами. Так, по результатам этих расчётов имеем следующие значения (при точности вычислений и начальном приближении для метода простой итерации и метода Ньютона :

 

Методы\Коэффициенты K n
Метод Бисекции 1,07688  
Метод Хорд 1,07687  
Метод Простой Итерации 1,07688  
Метод Ньютона 1,07687  

 

Как показывают расчёты данный коэффициент наиболее целесообразно рассчитывать методом Ньютона или методом хорд.

Построим диаграмму, отображающую эффективность вычислений: по оси ординат откладывается величина, равная: .

 

 

Коэффициент m.

Коэффициент m рассчитывался как наибольший по модулю корень уравнения , которое решалось через дискриминант. В результате решения уравнения получили два корня: и . Следовательно m= -0,5.

График функции.

 

После расчёта всех коэффициентов можно приступить к непосредственно построению графика функции.

t y
0,00 0,577
0,75 2,016
1,50 7,668
2,25 20,822
3,00 44,770
3,75 82,802
4,50 138,201
5,25 214,280
6,00 314,308
6,75 441,582
7,50 599,394
8,25 791,033
9,00 1019,790
9,75 1288,957
10,50 1601,823
11,25 1961,680
12,00 2371,818
12,75 2835,527
13,50 3356,098
14,25 3936,822
15,00 4580,990
15,75 5291,891
16,50 6072,818
17,00 6633,963

, где , , , m= -0,5, K =1,07687, t=0..17.

 


Список использованных источников.

· Лекции по курсу “Информатика” Тарасевич Л.А.

 

· “Учебный курс Delphi 7” Бобровский С.

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...