Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Метод пристрелки.doc
Скачиваний:
87
Добавлен:
01.05.2014
Размер:
186.37 Кб
Скачать

Заключение

В процессе выполнения задания курсовой работы было рассмотрено численное решение ОДУ методом пристрелки.

В разработанной программе реализован метод пристрелки.

Программа написана на языке Паскаль.

Задача выполнена в полном объеме.

Список литературы

  1. Исаков В.Б. Элементы численных методов: Учебное пособие для студентов, обучающихся по специальности Математика группы Педагогические специал. – М.: Академия, 2003.- 192с.: ил.

  2. Н.С. Бахвалов, Н.П. Жидков,Г.М. Кольбеков Численные методы. М.: 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.

25