Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
210700_МУ_ПР_ЯП.doc
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
539 Кб
Скачать
☆

Практическая работа 4 Визуальная среда разработки программ delphi

Реализация алгоритмов вычислительной математики на языках программирования в визуальной среде Turbo DELPHI. Методы Эйлера и Рунге-Кутты решения задачи Коши.

Цель работы:

Ознакомиться с графическими компонентами визуальной среды программирования DELPHI. Реализовать алгоритмы решения численного интегрирования дифференциальных уравнений ( задача Коши) методом Эйлера и методами второго порядка (по средней производной и в средней точке).

  1. Ознакомиться с графическим классом канва (Canvas) и его свойствами, предназначенными для рисования на канве пикселами.

  2. Ознакомиться с учебной программой рисования графика сигнала с учетом масштабирования.

  3. На основе процедуры интегрирования по методу Эйлера написать процедуру интегрирования методом средней производной. Выполнить процедуру для заданного дифференциального уравнения ( по вариантам) с начальными условиями (задача Коши).

  4. Построить график полученного решения.

Образец выполнения задания:

Создавать графические элементы можно на любом объекте, имеющем свойство Canvas. Этим свойством обладает, в частности, сама форма. Зададим значения свойств формы (как на рисунке ниже):

Caption = график сигнала;

Color = clWhite (либо другой по выбору из имеющегося списка).

Далее, переключимся в инспекторе объектов на вкладку Events и на событии OnPaint выполним двойной щелчок в поле значения этого события, в результате чего будет создана процедура перерисовки, в теле которой зададим оператор вызова процедуры построения графика сигнала:

procedure TForm1.FormPaint(Sender: TObject);

begin

grafik;

end;

В раздел implementation модуля поместим текст (выделенный ниже жирным курсивом) процедур построения графика и описания используемых переменных.

unit signal;

interface

uses

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

Dialogs;

type

TForm1 = class(TForm)

procedure FormPaint(Sender: TObject);

procedure FormResize(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

{$R *.dfm}

procedure grafik;

const

omega_r=50;

omega_h=5*omega_r;

T=1/700;

N=1000;{число точек графика}

type

dann= array[0..N] of real;

var

L,R,W,H: integer;

X: dann;

Y: dann;

k:integer;

ymin,ymax:real;

Mx,My:real;

x0,y0: integer;

function signal(j:integer):real;

begin

X[j]:=sin(j*omega_r*T/(2*Pi))+

cos(j*omega_r*T/Pi)+sin(j*omega_h*T/Pi)/5;

signal:=X[j];

end;

procedure min_max(Y:dann; var min, max:real);

var

k: integer;

begin

min:=Y[0];max:=Y[0];

for k := 1 to N do

if Y[k]> max then

max:=Y[k]

else if Y[k]< min then

min:=Y[k];

end;

begin

L:=10;

R:=form1.clientHeight-10;

W:=form1.Width-50;

H:=form1.clientheight-20;

for k:=0 to N do

signal(k);

min_max(X,ymin,ymax);

Mx:=W/N;

My:=H/(ymax-ymin);

x0:=L;

y0:=R-abs(Round(ymin*My));

with form1.Canvas do

begin

for k:=0 to N do

form1.Canvas.Pixels[x0+round(k*Mx),y0-round(X[k]*My)]:=clRed;

Moveto(L,R);lineto(L,R-H);

moveto(x0,y0);lineto(x0+W,y0);

textout(x0+W,y0,'x');

textout(L+10, R-10, floattostrF (ymin,

ffGeneral, 6, 3));

end;

end;

{=================================================}

procedure TForm1.FormPaint(Sender: TObject);

begin

grafik;

end;

Перед выполнением и отладкой программы сохраним проект в отдельной папке. Выполним запуск программы и обнаружим, что при изменении размеров формы график искажается. Добавим к проекту процедуру перерисовки графика с предварительной очисткой новой канвы. Для этого в поле значения события OnResize (на вкладке инспектора объектов) выполним двойной щелчок и в появившейся заготовке соответствующей процедуры наберем операторы очистки канвы и перерисовки графика:

procedure TForm1.FormResize(Sender: TObject);

begin

form1.Canvas.FillRect(rect(0,0,clientwidth,clientheight));

grafik;

end;

end.{конец модуля}

После запуска программы при изменении размеров формы (окна программы) и при развертывании на весь экран (максимизация размеров окна) график перерисовывается заново.

Решение задачи Коши методом Эйлера реализуется следующим модулем:

unit difur;

interface

uses

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

Dialogs, StdCtrls, ExtCtrls;

type

TForm1 = class(TForm)

Button1: TButton;

Label1: TLabel;

Image1: TImage;

Button2: TButton;

Button3: TButton;

ListBox1: TListBox;

Button4: TButton;

procedure Button1Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

procedure Button3Click(Sender: TObject);

procedure Button4Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

{$R *.dfm}

const

h=0.1;

var

Koeff:real;

U:array[0..50] of real;

ib,ik:array[0..50] of real;

ik2:array[0..50] of real;

maU,miU:real;

function f(t:real):real;

begin

if t<0 then

f:=0

else

f:= sin(Pi*t);

end;

function Fs(t,tau:real):real;

var

z:real;

begin

z:=frac(t/tau);

Fs:=f(z);

end;

function polin(x:real):real;forward;

{=********************************************************=}

function koren(x0,h:real):real;

var

a,b:real;

ya,y:real;

x:real;

begin

a:=0;b:=3;

ya:=polin(a);

repeat

x:=(a+b)/2;

y:=polin(x);

if (y*ya>0) then

a:=x else

b:=x;

{ writeln(a,b);}

{ readkey;}

until b-a<0.00001;

Koren:=x;

end;

function polin(x:real):real;

begin

polin:=2*x*x*x*x-x*x*x-8;

end;

procedure Euiler(x0,y0,h:real;var y:real);

var

y1:real;

begin

y1:=0.01*(cos(4*x0+y0)-2*1.56*y0+fs(x0,1)) ;

y:=y0+h*y1;

end;

{=************************************************************=}

procedure TForm1.Button1Click(Sender: TObject);

var

s1:string[10];

begin

Koeff:=koren(0,0.000001);

str(Koeff:8:5,s1);

Label1.Caption:='корень='+chr(13)+s1;

end;

procedure TForm1.Button2Click(Sender: TObject);

var

i:integer;

y:integer;

z:real;

begin

canvas.pen.Color:=clblue;

image1.canvas.moveto(1,100);

image1.canvas.lineto(500,100);

image1.canvas.Pixels[41,41]:=clred;

for i:= 1 to 500 do

begin

z:=100-fs(i/200,1)*100;

y:=round(z);

image1.canvas.Pixels[i,y]:=clred;

end;

end;

procedure TForm1.Button3Click(Sender: TObject);

var

y0:real;

x:real;

y:real;

i:integer;

s1:string[3];

s2:string[10];

begin

y0:=0.1;

maU:=y0;MiU:=y0;

U[0]:=y0;

for i:=1 to 50 do

begin

x:=i*h;

Euiler(x,y0,h,y);

y0:=y;

str(i:3,s1);

str(y:8:4,s2);

listbox1.Items.Add(s1+s2);

{writeln(rf,x:6:2,' ',y:14:-28);}

U[i]:=y;

if maU<y then maU:=y;

if miU>y then miU:=y;

end;

str(maU:8:2,s1);

end;

procedure TForm1.Button4Click(Sender: TObject);

var

i:integer;

y:integer;

z:real;

begin

image1.Refresh;

image1.canvas.Refresh;

canvas.pen.Color:=clblue;

image1.canvas.moveto(1,100);

image1.canvas.lineto(500,100);

for i:= 0 to 50 do

begin

z:=(U[i]-miU)*200/(maU-miU);

y:=round(z);

image1.canvas.Pixels[i*10,y]:=clred;

end;

end;

end.

Процедуры соответствуют командным кнопкам, изображенным на рисунке

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]