Заключение
В процессе выполнения задания курсовой работы было рассмотрено численное решение ОДУ методом пристрелки.
В разработанной программе реализован метод пристрелки.
Программа написана на языке Паскаль.
Задача выполнена в полном объеме.
Список литературы
-
Исаков В.Б. Элементы численных методов: Учебное пособие для студентов, обучающихся по специальности Математика группы Педагогические специал. – М.: Академия, 2003.- 192с.: ил.
-
Н.С. Бахвалов, Н.П. Жидков,Г.М. Кольбеков Численные методы. М.: 2000.
3. Поршнев С.В., Беленкова И.В. Численные методы на базе Mathcad + CD.
СПб.: "БХВ-Петербург" 2005.
Приложение
unit PRSTUnit;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Runge, StdCtrls;
const
Hbeg = 1e-5; // начальный шаг метода Рунге-Кутта
TBeg0 = 0.0; // интервал
TEnd0 = 1.0; //
TBeg1 = 1.0; // интервал для тестового примера
TEnd1 = 2.0; //
HDif = 1e-10; // шаг для метода Ньютона
EpsPribl = 1e-15; //
EpsFPribl = 1e-18; //
IterCount = 50; // количество итераций
type
TPRSTForm = class(TForm)
Memo1: TMemo;
Memo2: TMemo;
Button1: TButton;
CheckBox1: TCheckBox;
procedure Button1Click(Sender: TObject);
procedure CheckBox1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
function Ygrec( Alf, Bet: extended; var Flag: Integer ): styp;
procedure Neyton( var Alf, Bet : extended; var NFlag: Integer);
public
{ Public declarations }
PPrint: Boolean;
end;
var
PRSTForm: TPRSTForm;
Yb1, Yb2 : Extended;
TBeg, TEnd : extended;
implementation
{$R *.DFM}
{ TPRSTForm }
//Метод Ньютона
procedure TPRSTForm.Neyton( var Alf, Bet: extended; var NFlag: Integer );
var
Z : styp;
AlfOld, AlfNew, BetOld, BetNew, FToch : extended;
f0, g0, f1, f2, g1, g2, Dj : extended;
i, FlagY : integer;
begin
if not CheckBox1.Checked then begin
Yb1 := Sqrt( 0.1 );
Yb2 := -1 / Yb1;
end
else begin
Yb1 := 2 * ln( 2 );
Yb2 := ln( 2 ) + 1;
end;
i := 0;
AlfNew := Alf; // неизвестные константы
BetNew := Bet; // в точке y = a
repeat
NFlag := 0;
FlagY := 0;
AlfOld := AlfNew;
BetOld := BetNew;
i := i + 1;
Z := Ygrec(AlfOld, BetOld, FlagY); // находим значения на одном конце отрезка
f0 := Z[1]; // y(b)
g0 := Z[2]; // y'(b)
Z := Ygrec(AlfOld + HDif, BetOld, FlagY);
f1 := Z[1] - f0; // для расчета производной по Alf
g1 := Z[2] - g0; // для расчета производной по Alf
Z := Ygrec(AlfOld, BetOld + HDif, FlagY);
f2 := Z[1] - f0; // для расчета производной по Bet
g2 := Z[2] - g0; // для расчета производной по Bet
Dj := f1 * g2 - f2 * g1; // определитель
if Dj <> 0 then
begin
AlfNew := AlfOld - HDif * ( ( g2 * ( f0 - Yb1 ) - f2 * ( g0 - Yb2 ) ) / Dj );
BetNew := BetOld + HDif * ( ( g1 * ( f0 - Yb1 ) - f1 * ( g0 - Yb2 ) ) / Dj );
end
else NFlag := 10;
Z := Ygrec(AlfNew, BetNew, FlagY);
FToch := Abs( Z[1] - Yb1 ) + Abs( Z[2] - Yb2 );
Memo1.Lines.Add('Alf = '+FloatToStr(AlfNew)+' Bet = '+FloatToStr(BetNew)+' |F| + |G| = '+FloatToStr(Ftoch));
until ( i > IterCount ) or ( FlagY <> 0 ) or ( NFlag = 10 ) or ( Ftoch < EpsFPribl )
or ( Abs( AlfOld - AlfNew ) + Abs( BetOld - BetNew ) < EpsPribl );
if NFlag <> 10 then NFlag := FlagY;
Alf := AlfNew;
Bet := BetNew;
if NFlag <> 0 then Memo1.Lines.Add('Error = ' + IntToStr( NFlag ));
end;
// Возращает решение на одном конце отрезка
function TPRSTForm.Ygrec( Alf, Bet: extended; var Flag: Integer ): styp;
var
Z : styp;
begin
if not CheckBox1.Checked then begin
Z[1] := Sqrt( 1.1 );
Z[2] := 0.0; end else begin
Z[1] := 0.0;
Z[2] := 1.0; end;
Z[3] := Alf;
Z[4] := Bet;
// Применение метода Рунге-Кутта
if not CheckBox1.Checked then
Runge.Rkf( Hbeg, TBeg, TEnd, Z, Flag, Runge.Right1, Runge.Prn )
else
Runge.Rkf( Hbeg, TBeg, TEnd, Z, Flag, Runge.Right2, Runge.Prn );
Result := Z;
end;
procedure TPRSTForm.Button1Click(Sender: TObject);
var
Flag : Integer;
Alf, Bet : Extended;
Z : Styp;
begin
PPrint := false;
Alf := 0.1;
Bet := 0.1;
Neyton( Alf, Bet, Flag );
Flag := 0;
PPrint := true;
if not CheckBox1.Checked then begin
Z[1] := Sqrt( 1.1 );
Z[2] := 0.0;
end else begin
Z[1] := 0.0;
Z[2] := 1.0;
end;
Z[3] := Alf;
Z[4] := Bet;
if not CheckBox1.Checked then
Runge.Rkf( Hbeg, TBeg, TEnd, Z, Flag, Runge.Right1, Runge.Prn )
else
Runge.Rkf( Hbeg, TBeg, TEnd, Z, Flag, Runge.Right2, Runge.Prn );
Memo1.Lines.Add('');
end;
procedure TPRSTForm.CheckBox1Click(Sender: TObject);
begin
if not CheckBox1.Checked then begin
TBeg := TBeg0;
TEnd := TEnd0;
end else begin
TBeg := TBeg1;
TEnd := TEnd1;
end
end;
procedure TPRSTForm.FormCreate(Sender: TObject);
begin
TBeg := TBeg0;
TEnd := TEnd0;
end; end.
{Метод Рунге-Кутта 2-го порядка,с автоматическим выбором шага.
Отладочный пример :
y'= y;
y(0)=1;
y(x)=exp(x);
Основной пример 23 :
y'=cos(y)/(x+2)-0.3*y*y
y(0)=0
Решение: y(x)=exp(x). }
uses crt,graph;
const eps=1E-2;
A=0;
B=1;
Y0=0;
hp=0.1;
var H,Hmin,YB,Y00:real;
i,r:integer;
device,mode,d:integer;
as,bs:string[20];
function f(X,Y:real):real;
begin
f:=cos(y)/(x+2)-0.3*y*y;
{ f:=y;}
end;
procedure RKF1(H,X1,Y1:real;var X2,Y2:real);
var k1,k2:real;
begin
k1:=H*f(X1,Y1);
k2:=H*f(X1+H,Y1+k1);
X2:=X1+H;
Y2:=Y1+(k1+k2)/2;
end;
procedure RGK2(H,A,B,Y0:real;var YB:real);
var X1,Y1:real;
begin
X1:=A; Y1:=Y0;
while X1<=B-H do RKF1(H,X1,Y1,X1,Y1);
if X1<B then RKF1(B-X1,X1,Y1,X1,Y1);
YB:=Y1;
end;
procedure RGK3(H,A,B,Y0:real;var Hmin,YB:real);
var x1,x2,x3,y1,y2,y3,s:real;
count:integer;
begin
hmin:=h; x1:=A; Y1:=Y0;
while x1<B do
begin
s:=eps;
count:=0;
repeat
RKF1(H,X1,Y1,X3,Y3);
RKF1(H/2,X1,Y1,X2,Y2);
RKF1(H/2,X2,Y2,X2,Y2);
y1:=y3;
s:=abs((y1-y2)/3); {15}
if s>=eps then
begin
h:=h/2;
count:=count+1;
if h<hmin then hmin:=h;
end;
if s<(eps) then {32}
begin
h:=2*h;
if h<hmin then hmin:=h;
end;
if count=5 then
begin
writeln(' Выберите меньший начальный шаг!');
readkey;
halt;
end;
until s<eps;
X1:=X2;
if ( H > (B-X1) ) and ( (B-X1) > 0) then H:=B-X1;
end;
YB:=Y1;
end;
begin
TextColor(10);
TextBackGround(1);
clrscr;
write('Задайте начальный шаг. H= ');
readln(H);
clrscr;
RGK3(H,A,B,Y0,Hmin,YB);
{ Вывод значений решения на [0..1]
с оптимальным шагом Hmin
в узлах xi=hp*i; hp=0.1}
device:=0;
initgraph(device, mode,'c:\bp70\bgi');
for i:=1 to 5 do
r:=33*i;
SetLineStyle(0,0,ThickWidth);
SetColor(9);
rectangle(0,0,200,2*r);
line(0,22,200,22);
SetLineStyle(0,0,NormWidth);
line(100,0,100,2*r);
SetColor(14);
OutTextXY(11,11,' X ');
OutTextXY(125,11,' Y ');
SetColor(10); d:=0; y00:=y0;
for i:=1 to 10 do begin
str(hp*i:5:4,as);
OutTextXY(11,31*i,as);
rgk2(hmin,d*hp,(d+1)*hp,y00,yb);
str(yb:8:6,bs);
OutTextXY(125,31*i,bs);
d:=d+1; y00:=yb;
end;
readln;
closegraph;
writeln;
writeln(' Начальный шаг: ',H:10:8);
writeln;
writeln(' Минимальный шаг: ',Hmin:10:8);
writeln;
readkey;
end.