Индивидуальное задание № 7
1.Начальные условия: U(0)=0.25
2.Полином: x^5-7x-6
3.Коррекция: в средней точке
4.Метод поиска корня: Метод касательных
2.Листинг программы
unit kustysheva;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Label1: TLabel;
Label2: TLabel;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
BitBtn3: TBitBtn;
BitBtn4: TBitBtn;
ListBox1: TListBox;
SaveDialog1: TSaveDialog;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
procedure BitBtn3Click(Sender: TObject);
procedure BitBtn4Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
const
exp=0.000001;
x0=3;
U0=0.25;
h=0.1;
Nzach=7;
koc=1;
Npoint=50;
hinteg=5/Npoint;
Var
T:real;
U:array [0..Npoint+1] of real;
fname:string;
ft:text;
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
procedure kasat(t,eps:real; var koren:real);
begin
repeat
t:=t-(t*t*t*t*t-7*t-6)/(5*sqr(sqr(t))-7);
until abs (t*t*t*t*t-7*t-6) < eps;
koren:=t;
end;
//--------------------------------------------------------------------------------------------------------------
function signal(t:real):real;
Var
z:real;
begin
if t<0 then
z:=0
else if t<1/2 then z:=2*t
else if t<=1 then z:=2-2*t
else z:=0;
signal:=z;
end;
function Period(x,T:real):real;
begin
x:=x-trunc(x/T)*T;
Period:=signal(x);
end;
procedure grafik;
Var
k:integer;
x,y:real;
begin
T:=1.6;
Form1.ListBox1.Visible:=true;
Form1.ListBox1.Width:=520;
With Form1.listBox1.Canvas do
begin
moveTo(5,15);
for k := 0 to 100 do
begin
x:=k*0.05;
y:=Period(x,T)*100;
LineTo(5*k+5,115-round (y));
end;
end;
end;
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
function RHS (x,U:real):real;
begin
RHS:=Nzach*(cos((4+Nzach/10)*x+U)+T*Period(x,T)-koc*U);
end;
procedure difur;
Var
k:integer;
x,y:real;
begin
U[0]:=U0;
for k := 0 to Npoint do
begin
x:=k*hinteg;
y:=RHS(x,U[k]);
{коррекция метода Эйлера}
U[k+1]:= U[k]+hinteg*y;
Form1.ListBox1.Items.Add
(floattostrf(x,FFGeneral,6,2)+' '+floattostrf(U[k],ffFixed,10,4));
end;
end;
//=================================================================
procedure zapis;
Var
k:integer;
begin
Assignfile(ft,fname);
rewrite(ft);
for k := 0 to Npoint do
Writeln(ft,k*0.1:8:2,U[k]:10:4);
Closefile(ft);
end;
//--------------------------------------------------------------------------------------------------------
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
Label1.Caption:='рисуем график сигнала' ;
grafik;
BitBtn1.Visible:=false;
BitBtn2.Visible:=true;
BitBtn2.SetFocus;
end;
procedure TForm1.BitBtn2Click(Sender: TObject);
begin
Label1.Caption:='Решаем задачу Коши' ;
difur;
BitBtn2.Visible:=false;
BitBtn3.Visible:=true;
BitBtn3.SetFocus;
end;
procedure TForm1.BitBtn3Click(Sender: TObject);
begin
Label1.Caption:='Записываем в файл' ;
if SaveDialog1.Execute then
Fname:=SaveDialog1.FileName;
Label1.Caption:='идет запись в файл'+fname;
zapis;
BitBtn3.Visible:=false;
BitBtn4.Visible:=true;
BitBtn4.SetFocus;
end;
procedure TForm1.BitBtn4Click(Sender: TObject);
begin
Label1.Caption:='Рисуем спектр сигнала' ;
BitBtn4.Visible:=false;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Label1.Caption:='находим корень';
kasat(x0,exp,T);
Label2.Caption:='корень='+floattostr(T);
Button1.Visible:=false;
BitBtn1.Visible:=true;
BitBtn1.SetFocus;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
close;
end;
end.
