вторник, 21 декабря 2010 г.

Лабораторная работа №6

Тема: Определенный интеграл


Цель: Разработать алгоритм и программу решения прикладной задачи – вычисления определённого интеграла или площади, ограниченной двумя линиями.


Задание: Проиллюстрировать один из численных методов вычисления определенного интеграла. Численные методы вычисления определенных интегралов

Математическая модель: Разработать алгоритм и программу решения прикладной задачи – моделирование движения брошенных с земли объектов.

1) Метод прямоугольников

  • левых частей Ii = f(xi)dx

I = (f(x0) + f(x1) + ... + f(xn-1)) dx


Алгоритм: блок-схема

Программа:




Код программы:
const n = 200;

var h2,w2, a, b, xmin, xmax, ymin, ymax, n1, j:integer;
kx,ky, x, y, xsc, ysc, dx, s:real;

begin
h2:= round(Image1.Height/2);
w2:= round(Image1.Width/2);

Val(Edit5.Text, a);
Val(Edit6.Text, b);

//n1 for graph, n2 for a - b
Val(Edit7.Text, n1);
//Val(Edit8.Text, n2);

Val(Edit1.Text, xmin);
Val(Edit2.Text, xmax);
Val(Edit3.Text, ymin);
Val(Edit4.Text, ymax);


Image1.Canvas.Rectangle(0,0,w2*2,h2*2);
kx:=w2*2/(xmax-xmin);
ky:=h2*2/(ymax-ymin);

//ox, oy
Image1.Canvas.Pen.Color:=clgreen;
Image1.Canvas.MoveTo(0, round(h2*2+ymin*ky));
Image1.Canvas.LineTo(w2*2, round(h2*2+ymin*ky));
Image1.Canvas.MoveTo(round(-xmin*kx), 0);
Image1.Canvas.LineTo(round(-xmin*kx), h2*2);

x:=xmin;
dx:=(xmax-xmin)/n;
Image1.canvas.Pen.Color:=clRed;
while x '<' xmax do
begin
y:=(2*x*x+5*x)/(7+abs(pi*x));
xsc:= (x-xmin)*kx;
ysc:= h2*2-(y-ymin)*ky;
Image1.Canvas.ellipse(round(xsc),round(ysc),round(xsc+2),round(ysc+2));
x:=x+dx;
end;

Image1.Canvas.Pen.Color:=clgreen;
dx:=(b-a)/n1;
x:=a;
while (x<=(b-dx)) do
begin
y:=(2*x*x+5*x)/(7+abs(pi*x));
xsc:=(x-xmin)*kx;
ysc:=h2*2-(y-ymin)*ky;
Image1.Canvas.Rectangle(round(xsc), round(ysc), round((x-xmin+dx)*kx),round(h2));
x:=x+dx;
end;

x:=a;s:=0;
while x<=b-dx do
begin
s:=s+(2*x*x+5*x)/(7+abs(pi*x));
x:=x+dx;
end;
j:=round(dx*s);
Edit8.Text := IntToStr(j);
end;

среда, 8 декабря 2010 г.

Лабораторная работа No 10

Тема: Комбинированные преобразования

Цель: Комбинированные преобразования объектов на плоскости

Задание: На основе разработанных в предыдущих лабораторных работах программах по преобразованию объектов на плоскости, составить программу, которая как поворачивает объект на некоторый угол относительно начала координат, так и масштабирует объект (растяжение/сжатие вдоль оси ОХ/ОУ) т.е. осуществляет комбинированное преобразование объекта на плоскости.

Математическая модель:Разработать алгоритм и программу решения прикладной задачи – моделирование движения брошенных с земли объектов.


Алгоритм: блок-схема

Программа:





Код программы:

const m = 5;
const n = 2;

var a:array[0..m-1,0..n-1] of real = ((10,10),(50,10), (35, 25), (50, 40), (10, 40));
//matrices for multiplying, global
m1:array[0..m-1,0..n-1] of real;
m2:array[0..n-1,0..n-1] of real;

//matric to draw, global
main:array[0..m-1,0..n-1] of real;

//transponent matrix (a,b,c,d)
b:array[0..n-1,0..n-1] of real;

//rotate matrix
d:array[0..n-1,0..n-1] of real;

h,w,h2,w2:integer;
u:real;

//main = m1 x m2
procedure multiplyMatrices();
var i, j, k: integer;
s:real;
begin
for i:=0 to m-1 do
begin
for j:=0 to n-1 do
begin
s:=0;
for k:=0 to n-1 do
begin
s:=s+m1[i][k]*m2[k][j];
end;
main[i][j]:=s;
end;
end;

end;


procedure drawFlag();
var i: integer;
begin;
Image1.Canvas.MoveTo(round(w2+main[0][0]),round(h2-main[0][1]));
for i:=1 to m-1 do
begin
Image1.Canvas.LineTo(round(w2+main[i][0]), round(h2-main[i][1]));
end;
Image1.Canvas.LineTo(round(w2+main[0][0]),round(h2-main[0][1]));
end;

begin

Val(Edit1.Text,b[0][0]);
Val(Edit2.Text,b[0][1]);
Val(Edit3.Text,b[1][0]);
Val(Edit4.Text,b[1][1]);

Val(Edit5.Text,u);
u:= u*pi/180;
d[0][0]:= cos(u);
d[0][1]:= sin(u);
d[1][0]:= -sin(u);
d[1][1]:= cos(u);

h:= Image1.Height;
w:= Image1.Width;
h2:= round(h/2);
w2:= round(w/2);

//ox, oy
Image1.Canvas.Pen.Color:=clgreen;
Image1.Canvas.Rectangle(0,0,w,h);
Image1.Canvas.MoveTo(0, h2);
Image1.Canvas.LineTo(w, h2);
Image1.Canvas.MoveTo(w2, 0);
Image1.Canvas.LineTo(w2, h);

//initial image
Image1.Canvas.Pen.Color:=clgreen;
main:= a;
drawFlag();

//move by OX, OY
Image1.Canvas.Pen.Color:=clblue;
m1:= a;
m2:= b;
multiplyMatrices();
drawFlag();

//rotate by angle u
Image1.Canvas.Pen.Color:=clpurple;
m1:= a;
m2:= d;
multiplyMatrices();
drawFlag();

// move by OX, OY and rotate by angle u
Image1.Canvas.Pen.Color:=clred;
m1:= main;
m2:= b;
multiplyMatrices();
drawFlag();

Лабораторная работа №5

Тема: Правильный многоугольник

Цель: Разработать алгоритм и программу решения прикладной задачи – построения правильного многоугольника с заданным числом вершин.

Задание: Построить правильный n -угольник, количество углов которого задано и вводиться через пользовательский интерфейс.

Математическая модель:



Алгоритм: Блок-схема

Код программы:

const r = 50;
var h, w, h2, w2, n, xsc, ysc, i: integer;
a,da, b,x,y:real;
begin
h:= Image1.Height;
w:= Image1.Width;
h2:= round(h/2);
w2:= round(w/2);

//ox, oy
Image1.Canvas.Pen.Color:=clgreen;
Image1.Canvas.Rectangle(0,0,500,500);
Image1.Canvas.MoveTo(0, h2);
Image1.Canvas.LineTo(w, h2);
Image1.Canvas.MoveTo(w2, 0);
Image1.Canvas.LineTo(w2, h);

Image1.Canvas.Pen.Color:=clred;
Val(Edit1.Text,n);
da:=(2*pi)/n;

x:= r*cos(0);
y:= r*sin(0);
xsc:=round(w2+x);
ysc:=round(h2-y);
Image1.Canvas.MoveTo(xsc, ysc);
for i:=1 to n+1 do
begin
x:=r*cos(a);
y:=r*sin(a);
xsc:= round(w2+x);
ysc:= round(h2-y);
Image1.Canvas.LineTo(xsc, ysc);
a:=a+da;
end;

Лабораторная работа №7

Тема: Умножение матриц
Цель:
Разработать алгоритм и программу решения прикладной задачи – умножение мартиц.
Задание: Умножить матрицу А с размерностью m × n на матрицу В с размерностью n × l .


Для двух матриц -
матрицы А с размерностью m × n и матрицы В с размерностью n × l


Математическая модель:



Алгоритм: Блок-схема


Программа:


Код программы:


const m = 2;
const n = 3;
const l = 4;

var a:array[0..m-1,0..n-1] of integer = ((1,2,3),(3,4,4));
b:array[0..n-1,0..l-1] of integer = ((1,2,3,4),(3,4,5,6),(1,2,3,4));
c:array[0..m-1,0..l-1] of integer;
s,i,j,k:integer;

begin

for i:=0 to m-1 do
begin
for j:=0 to n-1 do
StringGrid1.Cells[j+1,i+1]:=InttoStr(a[i][j]);
end;


for i:=0 to n-1 do
begin
for j:=0 to l-1 do
StringGrid2.Cells[j+1,i+1]:=InttoStr(b[i][j]);
end;

for i:=0 to m-1 do
begin
for j:=0 to l-1 do
begin
s:=0;
for k:=0 to n-1 do
begin
s:=s+a[i][k]*b[k][j];
end;
c[i][j]:=s;
StringGrid3.Cells[j+1,i+1]:=InttoStr(c[i][j]);
end;
end;

end;

вторник, 26 октября 2010 г.

Лабораторная работа №4

Тема: Траектория тела
Цель:
Разработать алгоритм и программу решения прикладной задачи – моделирование движения брошенных с земли объектов.


Задание:
Изобразить местонахождение тела, брошенного с земли с начальной скорость U0 под углом к горизонту α, через равные интервалы времени ( N – число равных временных интервалов)


Математическая модель:


U0 - начальная скорость движения тела
α - угол к горизонту под которым брошено тело
N – число равных временных интервалов (между подкидыванием тела)

Координаты произвольной точки траектории движения определяются уравнениями:

Для определения времени полета приравняем у = 0

Тогда длительность временного интервала (шаг по t )

Преобразование системы координат:

Для вычисления масштабных коэффициентов по x и y , необходимо определить максимальную дальность полета и максимальную высоту подъема.

Очевидно, что дальность полета максимальна при α = 45 °. Следовательно, коэффициент масштабирования по х равен:

Максимальная высота подъема определяется из условия, что проекция скорости на ось у в наивысшей точке подъема равна 0. Исходя из этого условия можно определить время подъема:

Таким образом

Очевидно, что высота подъема максимальна при α = 90°. Следовательно, коэффициент масштабирования по у равен:

Таким образом, экранные координаты тела равны:


Алгоритм:

Программа:

Код программы:

var u0, h, n, w, xsc, ysc:integer;
i, a, t, dt, xmax, kx, ky, x, y:real;
const g = 9.8;
begin
Val(Edit1.Text, u0);
Val(Edit1.Text, a);
Val(Edit1.Text, n);

h:=Image1.Height;
w:=Image1.Width;

Image1.Canvas.pen.Color := clWhite;
Image1.Canvas.Rectangle(0 ,0, w, h);
Image1.Canvas.pen.Color := clGreen;

a:= a*pi/180;
t:= 2*u0*sin(a)/g;
dt := t/n;

xmax := u0*u0*sin(2*a)/g;
kx := w/(u0*u0/g);
ky := h/((u0*u0/g)/2);

Image1.Canvas.Moveto(10,h);
i:= 0;

while i <= t do
begin
x:= u0*cos(a)*i;
y:= u0*sin(a)*i - g*i*i/2;
xsc := round(x*kx);
ysc := round(h - y*ky);
Image1.Canvas.Lineto(xsc, ysc);
i := i + dt;
end;

суббота, 16 октября 2010 г.

Лабораторная работа №3

Тема: График функции в среде Lazarus

Цель: Разработать алгоритм и программу решения прикладной задачи – построение графика заданной функции. Научиться переводить декартовые координаты в экранные.


Задание:
Построить график функции y = Ax2 + Bx + C в диапазоне ( x min, y min ) – ( x max, y max ). Постоянные А, В, С, x min , y min , x max , y max вводятся через пользовательский интерфейс.


Математическая модель решения задачи:

y = Ax2 + Bx + C


Преобразование стандартных координат в экранные:

kx= Image1.Width/(xmax-xmin) //
коэффициент масштабирования по оси Ox
ky= Image1.Height/(ymax-ymin)
//
коэффициент масштабирования по оси Oy

xsc= (xmin- x)*kx //экранная координата x
ysc= Image1.Height – (y - ymin )*ky
//экранная координата y


Программа:




Код программы:

procedure TForm1.DrawClick(Sender: TObject);

var h, w, i, xsc, ysc, n, x, y, xmin, xmax, ymin, ymax, ox, oy: integer;
kx, ky, av, bv,cv: real;
begin
Val(Edit1.Text, av);
Val(Edit2.Text, bv);
Val(Edit3.Text, cv);
Val(Edit4.Text, xmin);
Val(Edit5.Text, xmax);
Val(Edit6.Text, ymin);
Val(Edit7.Text, ymax);

h:=Image1.Height;
w:=Image1.Width;

Image1.Canvas.Rectangle(0 ,0, w, h);

kx:= w/(xmax-xmin);
ky:= h/(ymax-ymin);

x:=xmin;
n:=xmax-xmin;

Image1.canvas.MoveTo(xmin,10);
for i:=0 to n do
begin
y:= round(av*x*x+bv*x+cv);
xsc := round((x - xmin)*kx);
ysc := round(h - (y - ymin)*ky);
Image1.Canvas.LineTo(xsc,ysc);
x:=round(x+kx);
end;
ox:=round(-xmin*kx);
oy:=round(-ymin*kx);
Image1.Canvas.Pen.Color := clGreen;
Image1.canvas.MoveTo(ox,0);
Image1.canvas.LineTo(ox,h);
Image1.canvas.MoveTo(0,oy);
Image1.canvas.LineTo(w,oy);
Image1.Canvas.Pen.Color := clBlack;

end;

среда, 22 сентября 2010 г.

Лабораторная работа № 2

Тема: Работа с графикой в среде Lazarus

Цель:
Знакомство с возможностями создания графических объектов посредством среды разработки программного обеспечения Lazarus.


Задание:
1) Нарисовать в объекте TImage треугольник, одна сторона которого черная, другая красная и третья - синяя.
2) Создать программу рисующую треугольник, координаты вершин которого можно изменять через пользовательский интерфейс.

Алгоритм:


Программа:


Код программы:

procedure TForm1.Button1Click(Sender: TObject);
var ax, ay, bx, by, cx, cy:integer;
begin
ax:= StrtoInt(Edit1.Text);
ay:= StrtoInt(Edit2.Text);
bx:= StrtoInt(Edit3.Text);
by:= StrtoInt(Edit4.Text);
cx:= StrtoInt(Edit5.Text);
cy:= StrtoInt(Edit6.Text);
Image1.Canvas.Rectangle(0, 0, 500, 500);
Image1.Canvas.MoveTo(ax,ay);
Image1.Canvas.pen.Color := clblue;
Image1.Canvas.LineTo(bx,by);
Image1.Canvas.pen.Color := clred;
Image1.Canvas.LineTo(cx,cy);
Image1.Canvas.pen.Color := clgreen;
Image1.Canvas.LineTo(ax,ay);
end;