- •В.П. Кондратьев языки программирования
- •210700 «Инфокоммуникационные технологии и системы связи»
- •Содержание
- •Пояснительная записка
- •Перечень практических занятий
- •Практическая работа 1 Структуры языка программированиия Pascal
- •Практическая работа 2 Структуры языка программированиия Pascal
- •Практическая работа 3 Визуальная среда разработки программ delphi
- •Практическая работа 4 Визуальная среда разработки программ delphi
- •Практическая работа 5 Основные алгоритмы обработки данных.
- •Практическая работа 6 Методы вычислений.
- •Практическая работа 7 Визуальное программирование
- •Практическая работа 8 Пакет математических вычислений maple.
- •Практическая работа 9 Пакет математических вычислений maple.
- •Литература
Практическая работа 4 Визуальная среда разработки программ delphi
Реализация алгоритмов вычислительной математики на языках программирования в визуальной среде Turbo DELPHI. Методы Эйлера и Рунге-Кутты решения задачи Коши.
Цель работы:
Ознакомиться с графическими компонентами визуальной среды программирования DELPHI. Реализовать алгоритмы решения численного интегрирования дифференциальных уравнений ( задача Коши) методом Эйлера и методами второго порядка (по средней производной и в средней точке).
Ознакомиться с графическим классом канва (Canvas) и его свойствами, предназначенными для рисования на канве пикселами.
Ознакомиться с учебной программой рисования графика сигнала с учетом масштабирования.
На основе процедуры интегрирования по методу Эйлера написать процедуру интегрирования методом средней производной. Выполнить процедуру для заданного дифференциального уравнения ( по вариантам) с начальными условиями (задача Коши).
Построить график полученного решения.
Образец выполнения задания:
Создавать графические элементы можно на любом объекте, имеющем свойство 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.
Процедуры соответствуют командным кнопкам, изображенным на рисунке
