Построение графиков функций
Проведение численных расчетов желательно сопровождать визуализацией промежуточных и окончательных результатов на экране монитора. Это позволяет избежать некоторых ошибок, а также контролировать результаты расчета и оптимизировать алгоритм. Графики функций строятся обычно в декартовой системе координат (XoY). Функция может быть задана в явном виде, например, y=F(x), в неявном: F(x, y)=0, илив параметрическом виде: x=Fx(t), y=Fy(t).
Здесь F(x), F(x, y), Fx(t), Fy(t) - функции, x, t - аргументы (параметры).
Значения "x", "y" , полученные в результате расчета, будем называть расчетными координатами точек. При построении графика на экране монитора расчетные значения "x", "y" необходимо пересчитать в графические (экранные) координаты xG, yG. Напомним, что графические координаты изменяются в пределах [0 . . GetMaxX] - по горизонтали, [0 . . GetMaxY] - по вертикали.
Для изменения графических координат экрана в Турбо-Паскале предусмотрено задание графического окна процедурой:
SetViewPort(xG1, yG1, xG2, yG2, Cl);
где (xG1, yG1), (xG2, yG2) - координаты левого верхнего и правого нижнего вершин прямоугольника, образующего графическое окно (тип Integer).
Cl- признак рисования за границами окна (тип Boolean) задается в модуле Graph константами:ClipOn = True - рисование только в пределах окна,
ClipOff= False- рисование в пределах экрана.
После задания графического окна изменяется начало системы координат (рисунок на экране сохраняется) и можно рисовать кривые с отрицательными значениями координат точек, например, установив начало координат в центре экрана:
xG2:= GetMaxX; yG2:= GetMaxY; xG1:= xG2 div 2; yG1:= yG2 div 2;
и задав Cl:= ClipOff; Направление осей при этом не меняется, график не масштабируется, а процедура SetBkColor(N); изменит цвет всего экрана. Графическое окно можно очистить процедурой
ClearViewPort;
При этом восстанавливается система координат экрана, а изображение в области прямоугольника с координатами вершин (xG1, yG1), (xG2, yG2) затирается цветом фона.
Построение графиков на экране монитора имеет свои особенности, связанные с пикселным изображением и системой координат экрана. Поскольку для некоторых режимов работы монитора отношение ширины к высоте экрана не равно (GetMaxX+1)/(GetMaxY+1), то при построении по точкам вместо окружности получается эллипс. Для рисования правильных геометрических фигур по точкам необходимо подключить процедуру:
GetAspectRatio(xx, yy);
возвращающую значения xx, yy - параметры (тип Word), определяющие коэффициент сжатия изображения k = xx/yy. При построении графиков или рисовании
фигур по точкам значения координат "y" необходимо умножить на "k". Отметим, что для монитора VGA в режиме Gm=2 значение k=1.
Практическое задание N 2. 1
1. Задать графическое окно с началом в центре экрана. Для драйвера VGA в режимах 0, 1, 2 при k=1 и k = xx/yy выполнить следующие действия.
1. 1. Процедурой Circle(x, y, r); нарисовать окружность радиусом 50 с центром в начале координат. Процедурой Line(x1, y1, x2, y2); нарисовать квадрат, описанный вокруг окружности. Очистить графическое окно.
1. 2. Процедурой Rectangle(x1, y1, x2, y2); нарисовать квадрат со стороной 100 с центром в начале координат. Процедурой Line(xi, yi, xj, yj); нарисовать окруж-ность (в виде многоугольника), вписанную в квадрат. Очистить графическое окно.
Примечание. Вывести надпись - номер режима и значение k. При k=1 и режимах 0, 1 окружность не будет вписанной в квадрат.
Построение графика функции Y = F(x) с масштабированием по осям координат.
При построении графиков функций на экране монитора необходимо преобразовывать расчетные координаты в графические с соблюдением определенных пропорций, а также предусмотреть возможность масштабирования графика по осям координат. Это вызывает необходимость создания специального алгоритма и процедур, обеспечивающих универсальность программирования графических изображений. Ниже приводится алгоритм построения графиков в правой системе координат, расположенной в заданной области экрана, с возможностью автоматического масштабирования.
0 left right XG Пусть задана непрерывная функция F(x)
в диапазоне изменения аргумента x=[A. . B].
up y
Требуется построить по N точкам график
функции Y=F(x) в прямоугольной области
A 0 B x экрана left, up, right, down.
down
0 £ left, right £ GetMaxX
YG 0 £ up, down £ GetMaxY
Алгоритм построения графика функции Y=F(x).
1). Определяем массивы значений аргумента и функции: x[i], Y[i]=F(x[i]), где i= 1. . . N. При равномерном разбиении интервала [A. . B] массивы можно задавать операторами:
Dx:= (B-A)/(N-1);{ шаг разбиения по "х" }
for i:= 1 to N do begin
x[i]:= A + round(Dx*(i-1)); Y[i]:= F(x[i]) end;
2). Определяем наибольшее (Y_MAX) и наименьшее (Y_MIN) значения функции в заданном интервале изменения аргумента:
Y_MAX:= Y[1]; Y_MIN:= Y[1];
for i:= 1 to N do begin
IF Y_MAX < Y[i] THEN Y_MAX:= Y[i];
IF Y_MIN > Y[i] THEN Y_MIN:= Y[i] end;
В случае явного задания функции, для аргумента "х" имеем наибольшее значение X_MAX:= B и наименьшее значение X_MIN:= A.
Наибольшее и наименьшее значения функции и аргумента необходимы для полного размещения графика в расчетной области. Эти значения можно изменять с целью уменьшения размеров графика или увеличения его отдельных частей.
3). Определяем коэффициенты масштабирования при построении графика в заданной области экрана:
Kx:= (right-left)/(X_MAX - X_MIN);
Ky:= (down - up )/(Y_MAX - Y_MIN);
Если параметры функции "х" и "y" имеют одинаковую размерность или оба безразмерны, то может появиться искажение естественной формы кривой вследствие разного масштабирования по осям координат: чрезмерное растяжение/сжатие по одной из осей. Например, при рисовании по точкам вместо окружности будет нарисован эллипс. Кроме этого следует учитывать искажение формы графика, регулируемое параметрами процедуры GetAspectRatio(xx, yy). Для вывода графика без искажения формы кривой следует переназначить координаты области экрана так, чтобы получить Ky=K*Kx, где K=xx/yy.
Операторы для автоматического масштабирования приведены ниже в модуле GR_F для различных случаев, определяемых значением параметра “pr”.
1: pr = 1. Пусть заданы нижняя, верхняя и левая границы области построения графика: down, up, left. Необходимо найти значение right при условиях: Ky = K * Kx и right<=GetMaxX. Если условие ограничения графика по длине экрана не выполняется, то полагается right:=GetMaxX; и значение "up" корректируется (уменьшается).
XG
YG
| 2: pr = 2. Пусть заданы левая, правая и нижняя границы области построения графика: left, right, down. Необходимо найти значение up при условиях: Kx = Ky / K и up>=0. Если условие ограничения графика по высоте экрана не выполняется, то полагается up:=0; и значение "right" корректируется (уменьшается).
4). Строим оси координат (начало координат x = 0, y = 0 ).
5). Строим график в виде последовательных отрезков используя аналоги графических процедур BGI:
moveto_G(x[1], y[1]);
for i:=2 to N do lineto_G(x[i], y[i]);
Ниже приводятся операторы модуля GR_F, наращивая который аналогами графических процедур BGI можно строить графики в расчетной области.
Unit GR_F;{ модуль GR_F }
{$N+}{подключение сопроцессора}
INTERFACE
Var right, left, down, up: integer; k_xy, kx, ky, X_max, X_min, Y_max, Y_min: double; { описание глобальных переменных }
procedure mash( c, c1, pr:word);{ c - номер цвета линий}
procedure oci;{ c1 - номер цвета фона }
procedure Lineto_G(x1, y1:double);{ аналог графической процедуры Lineto}
IMPLEMENTATION
Uses Graph;
PROCEDURE mash;
Var xx, yy: word; xg_m, yg_m:integer;
Begin xg_M:=GetMaxX; yg_M:=GetMaxY;
{----- ввести операторы контроля заданных значений глобальных переменных ----}
{ X_min < X_max; 0 <left< right <xg_M; Y_min < Y_max; 0 <down <up <yg_M }
GetAspectRatio(xx, yy); k_xy:=xx/yy;
ky:=(down-up)/(Y_max-Y_min); kx:=(right-left)/(X_Max-X_min);
case pr of{ pr - признак построения графиков }
1: begin kx:=ky/k_xy;{pr=1 - без искажения формы, меняя Right}
right:= left + Round(kx*(X_max- X_min));
if right>GetMaxX then begin right:=GetMaxX;
kx:=(right-left)/(X_Max-X_min); ky:=kx*k_xy;
up:=down - Round(ky*(Y_max - Y_min)); end; end;
2: begin ky:=kx*k_xy;{pr=2 - без искажения формы, меняя Up}
up:= down - Round(ky*(Y_max- Y_min));
if up<0 then begin up:=0;
ky:=(down-up)/(Y_max-Y_min); kx:=ky/k_xy;
right:=left+Round(kx*(X_max-X_min)); end; end;
end;{pr=0 - в заданной области}
Setcolor(c); SetFillStyle(1,c1); bar(left, up, right, down);
End;
PROCEDURE oci;{ оси координат строятся только в пределах заданной области}
Var xg0, yg0:integer;
Begin XG0:=left - round( kx*X_min);
YG0:=down + round( ky*Y_min);
if X_MIN*X_MAX <=0 then line(XG0, up, XG0, down);
if Y_MIN*Y_MAX <=0 then line(LEFT, YG0, RIGHT, YG0);
End;
PROCEDURE Lineto_G;{рисование линии из текущей позиции курсора}
Var xg1, yg1:integer;{т. 1 - конец линии}
Begin
xg1:= left + Round(kx*(x1- X_min));
yg1:= down - Round(ky*(y1- Y_min)); lineto(xg1, yg1);
End;
BEGIN
END.
Приведенное описание размещения графика в прямоугольной области экрана позволяет: выводить кривые по точкам с отрицательными значениями координат, масштабировать график (сжимать/растягивать), изменять цвет фона внутри прямоугольника, задаваемого процедурой Bar(left, up, right, down).
Доработать методику для совместного построения нескольких графиков несложно. Необходимо для всех функций определить дискретные координаты y[i] и найти наибольшее и наименьшее значения для всех функций в заданных диапазонах изменения аргументов. Наибольшим значениям присвоить Y_MAX и X_MAX, а наименьшим - Y_MIN и X_MIN. Затем определить область для построения графика и координаты точек кривых. Кривые для разных функций желательно рисовать разным цветом с указанием вида функции.
Практическое задание N 2. 2
1. Построить графики функций Y1(x) и Y2(x) в двух областях экрана.
2. Построить графики Y1(x) и Y2(x) в одной области экрана.
Примечание:использовать библиотеку GR_F для построения графиков с автоматическим масштабированием, сохраняющим естественную форму кривой.
Необходимо также вывести надпись вида функции и диапазона изменения "х". Вид функций Y1(x) и Y2(x) приведен в таблице:
N Функция Y1(x) Диапазон изменения "х" Функция Y2(x)
1 Sin(x) -5 ...5 Sin(x2)
2 Sin(x) + x -15 ...15 Sin(x) + x2/10
3 Cos(x)*x -15 ...15 Sin(x)*x
4 Cos(x2-4*x-1) -1 ...10 Sin(x2-4*x-1)
-10 ...10
5 (x2-1)/(x4+1) -2 ...2 -x5+2*x3-1
6 x*(x-3)*(x+1) -3 ...3 x*(x-3)*(x-1)
7 x2*(x-2)*(x+1) -3 ...3 x2*(x+2)*(x+1)
8 Exp(x) + Exp(-x) -1 ...1 Exp(x)+Exp(-2*x)
-3 ...3
9 x2*Sin(1/x) 0.1 ...3 x3*Sin(1/x2)
0.01 ...0.1
10 x*Sin2(1/x) 0.1 ...5 (x+1)*Sin2(1/x)
0.01 ...0.1
11 Sqrt(x2+2)*Sin(x) -10 ...10 (x+1)*Sin(x)
-1 ...1
Практическое задание N 2. 3
1. Построить графики функций Y(x) и Yi(x) в одной области экрана с автоматическим масштабированием по осям координат.
Примечание: График функции Yi(x) строится для трех и четырех членов разложения функции Y(х) в бесконечный ряд Тейлора. Например, для функции Y(x)=exp(x) нужно построить графики Y(x) = exp(x), Y3(x) = 1+x+x2/2!, Y4(x) = 1+x+x2/2+x3/3!. Показатель степени функции Y(x) = (1+x)m "m" - вещественное число. Необходимо вывести надпись вида функции и диапазона изменения "х". Вид функций Y(x) и Yi(x) приведен в таблице:
N Функция Y(x) Разложение в ряд Тейлора Yi(x) Интервал "x"
1 Exp(x) 1 + x + x2/2! + x3/3! + ..-3 . . . 2
2 Sin(x) x - x3/3! + x5/5! - x7/7! + ..-3 . . . 3
3 Cos(x) 1 - x2/2! + x4/4! - x6/6! + ..-3 . . . 3
4 (1+x)m 1+m*x+m*(m-1)*x2/2!+m*(m-1)*(m-2)*x3/3!+.. -0, 9 . . 0, 9
5 Ln(1+x) x - x2/2 + x3/3 - x4/4 + ..-0, 95 . . 3
6 Arctan(x) x - x3/3 + x5/5 - x7/7 + ..-1 . . . 1
Построение графика функции Y = FY(t), X = FX(t).
Движение одной точки вокруг другой (полюса) удобно описывать в виде зависимости расстояния "r" между точками от угла "fi" между неподвижной линией (горизонталью) и линией, соединяющей точку с полюсом: r = F(fi). Такая система координат называется полярной. Проекции точки на оси декартовой системы координат находятся по формулам:x= r*cos(fi), y= r*sin(fi).
Таким образом получаем неявное задание функции Y от X. Здесь параметром является угол fi. Сформулируем задачу в общем виде.
Пусть заданы непрерывные функции FX(t) и FY(t) в диапазоне изменения параметра t = [A. . B]. Требуется построить по N точкам в прямоугольной области экрана left, up, right, down график функции, заданной в параметрической форме Y = FY(t), X = FX(t).
Алгоритм построения графика функции Y = FY(t), X = FX(t).
1. Определяеммассивы значений параметра и функций: t[i], X[i]=FX(t[i]), Y[i]=FY(t[i]), где i= 1. . . N. При равномерном разбиении интервала [A. . B] массивы можно задавать операторами:
Dt:= (B-A)/(N-1);{ шаг разбиения по "х" }
for i:= 1 to N do begin
t[i]:=A+round(Dt*(i-1)); X[i]:=FX(t[i]); Y[i]:=FY(t[i]) end;
2. Согласно п. 2 алгоритма построения графика функции Y = F(x) определяем наибольшее (Y_MAX) и наименьшее (Y_MIN) значения функцииY = FY(t) в заданном интервале изменения параметра t и аналогичноX_MAX, X_MIN для функции X=FX(t).
Далее следуем п. п. 3. . 5 алгоритма построения графика функции Y = F(x)
Параметрическая форма задания функций позволяет значительно разнообразить виды графических кривых.
Практическое задание N 2. 4
1. Построить графики функции, заданной в параметрической форме Y = FY(t), X = FX(t), в четырех областях экрана для различных значений коэффициента "A".
Примечание: Необходимо вывести надпись вида функции, значения коэффициента "A" и диапазон изменения параметра "t". Вид функции приведен в таблице:
N X(t) Y(t) интервал по "t" коэффициент "А"
1 A*t2 t*(3-t2) -3 ... 3 1 2 3 5
2 2*t-t2 A*t-t3 -2 ... 2 -1 0 1 3
3 A*t4 t2-A*t5 -1 ... 1,5 1 2 3 4
4 A*t2 t3+t4 -2 ... 1,5 1 2 3 4
5 Sin(A*t) Sin(3*t) -2 ... 2 -1 2 4 5
6 Sin(t-A) Sin(t) 0 ... 4 -1 1 2 3
7 A*Cos3(t) Sin3(t) -2 ... 2 -1 1 2 3
8 Cos(t)+A*Cos(t) Sin(t)-A*Sin(t) 0 ... 4 -2 -1 1 4
9 Cos(t)+t*Sin(t) Sin(t)-A*t*Cos(t) 0 ... 4 -1 0 1 2
Практическое задание N 2. 5
1. Построить графики функции, заданной в полярных координатах r= F(fi) переводом в Декартовые X= r*cos(fi), Y = r*sin(fi) для различных значений коэффициентов "A" и "В", меняя экран. Здесь r - радиус, fi - угол в радианах.
Примечание: Необходимо вывести надпись вида функции, значения коэффициентов "A" и "В", диапазон изменения "fi". Вид функции приведен в таблице:
N Кривая Функция r(fi) Диапазон fi A B
1 Спираль A*fi 0 ... 8 -1 1 3 -
Архимеда 0 ... 40 -
-10 ... 10 -
2 Спираль A*fi + B 0 ... 8 -1 0 1 -1 0 1
Архимеда -8 ... 8
3 Гиперболическая A/fi + B 0,1 ... 10 -1 1 2 -2 0 2
спираль 1 ... 30
4 Логарифмическая A*Exp(B*fi) -3 ... 3 -1 1 -1 0 1
спираль -7 ... 7
5 Спираль A*fi2 - B -8 ... 8 -1 1 2 0 1 2
Галилея -2 ... 2 -1 0 1
6 Роза A*Sin(B*fi) 0 ... 8 -1 1 2 целые и
A*Cos(B*fi) 0 ... 40 дробные
A + Sin(B*fi) 0 ... 100 -1 0 1 числа
A + Cos(B*fi)
7 Улитка A*Cos(fi) + B 0 ... 8 -1 0 1 -A A/2 A
Паскаля -4 ... 4 -1 0 1
8 Каппа A*Ctg(fi) + B 0,2 ... 1,5 1 2 4 -1 0 1
1 ... 1,56 -1 0 1
9 Конхоида A/Sin(fi) + B 0,1 ... 1,5 -1 1 2 -1 0 1
Никомеда A/Cos(fi) + B 1 ... 1,56
10 Кохлеоида A*Sin(fi)/fi + B 0,2 ... 1 1 2 4 -1 0 1
0,5 ... 8
11 Декартов (A*Cos(fi)+Sin(fi))/ 0... 1 -1 1 2 -
лист /(Cos3(fi)+Sin3(fi))
12 Строфоида A*Cos(2*fi)/Cos(fi) 0,1 ... 1,5 -3 -2 1 -
13 Циссоида A*Sin2(fi)/Cos(fi) 0,1 ... 1,5 -1 1 2 -
Диокла 1 ... 1,56
Не нашли, что искали? Воспользуйтесь поиском по сайту:
©2015 - 2024 stydopedia.ru Все материалы защищены законодательством РФ.
|