Использование программной среды PascalABC.NET для построения графиков функций одной переменной
МБОУ Лицей №7 имени Д.П. Уланова, г. Химки, МО
Учитель информатики Сапрыкин Владимир Маевич
Методическая разработка
«Прикладная алгебра. Использование программной среды PascalABC.NET для построения графиков функций одной переменной».
Графическое отображение функций одной переменной является одной из важнейших составляющих курса алгебры. На занятиях по предмету учащиеся чаще всего строят графики табулированных функций, то есть, по предварительно составленным таблицам значений аргумента и самой функции. Настоящая разработка призвана облегчить прикладное использование среды программирования PascalABC для построения, в частности, графиков линейных и показательных функций одной переменой. Разработка используется для учащихся 9-х классов, при изучении ими раздела «основы программирования» в рамках учебного курса «Информатика и ИКТ». Таким образом, достигаются две цели:
Более глубокое понимание понятия «функция» как зависимости из курса алгебры путем наглядного представления графиков распространенных математических функций.
Тренировка алгоритмического мышления и закрепление навыков программирования в рамках предмета Информатика и ИКТ.
Закрепление навыков достигается путем многократной модификации программного кода с незначительным изменением общей алгоритмической структуры, с учетом специфики той или иной функции (например, наличия или отсутствия отрицательных значений при любом значении аргумента). Учащимся предлагается несложный базовый алгоритм написания кода, с четким разъяснением специфики работы той или иной программной процедуры. После успешного освоения материала (получения графика функции на экране монитора), ученику предлагается изменить существующий код для описания иной функции с иными значениями аргумента.
Для построения графиков используется модуль GraphABC, входящий в базовый пакет программной среды PascalABC. Вызов модуля осуществляется стандартной процедурой uses.
Program mygraph;
Uses GraphABC;
Поскольку в учебных целях обычно строятся графики табулированных функций, т.е. с конечным количеством значений аргумента, график целесообразно строить так же, как и на уроках алгебры, т.е. по вычисленным точкам, соединяя их прямыми отрезками. Для этого удобно использовать единственную процедуру LineTo(X,Y), входящую в модуль GraphABC, аргументами которой являются целочисленные координаты новой точки на плоскости, в которую следует провести линию из текущей точки.
Например, программный шаблон (это еще не готовая программа!) построения графика показательной функции y:=x2 на интервале значений аргумента от 1 до 10 может быть таким:
Program mygraph;
Uses GraphABC;
Var x: integer;
begin
for x:=1 to 10 do
LineTo(x,x*x)
end.
В качестве аргумента x процедуры LineTo используется значение аргумента собственно функции, а аргументом y служит ее вычисленное значение в данной точке. Перебор значений аргумента от 1 до 10 удобно осуществлять, используя цикл. В данном случае, как легко увидеть, программа использует лишь одну переменную x. Переменная y в явном виде не определена: она существует лишь в виде вычисляемого выражения x*x. Как вариант, можно записать программный код с явным вычислением значения функции, y, с последующей подстановкой данной переменной в аргументы процедуры LineTo. Программа становится более наглядной, однако в этом случае раздел описания переменных необходимо дополнить, добавив в него y.
Uses GraphABC;
Var x,y: integer;
begin
for x:=1 to 10 do
begin
y:=x*x;
LineTo(x,y);
end;
end.
Если использовать указанный шаблон без изменений, то результатом будет слегка изогнутая линия, идущая практически вертикально от начала координат вниз, вдоль левой границы рабочего окна. Непропорциональный вид графика происходит оттого, что изменение аргумента функции по оси x на графике находится в пределах 10 пикселей (ведь переменная в цикле принимает значения от 1 до 10), в то время как вычисленное значение на оси y изменяется в диапазоне от 1 до 100 пикселей (поскольку 102=100).
На данном этапе следует предложить ученику продумать механизм изменения масштаба изображения по оси x для того, чтобы график стал более наглядным. В случае затруднений можно напомнить, что при построении графиков в тетрадях на уроках математики, в качестве единицы отсчета по оси х иногда используют 1 клетку (~5 мм.), а иногда 2 клетки (~1 см.). В качестве подсказки можно указать, что аргументы процедуры LineTo могут быть представлены в виде
непосредственно чисел, в виде переменных, в виде выражений.
LineTo(10, 50); LineTo(x, y); LineTo(x*5, y);
Последний вариант для данной задачи представляется оптимальным, поскольку график функции становится более наглядным, и по нему можно визуально определять тренд и экстраполировать значения в невычисленную область. Изменение х на каждую единицу переносит точку построения графика не на 1, а на 5 пикселей вправо.
При успешном построении графика вдумчивые ученики непременно обращают внимание на то, что визуально он представляет собой инверсию того графика, который строится в стандартной декартовой системе координат. То есть, развивается не вверх, а вниз. Именно в этот момент наиболее удобно разъяснить причину этого явления.
При ручном начертании графика ученик, как правило, строит на листе бумаги стандартный вариант координатной плоскости, в которой начало координат (х:=0, у:=0) находится в центре листа, а сама плоскость разделена координатными осями на квадранты:
(+x, +y), (–x, +y), (–x, –y), (+x, –y).
Окно модуля GraphABC по умолчанию представляет собой лишь один квадрант (+х, +у), причем начало координат (0,0) находится в левом верхнем углу, и положительное направление по оси у – сверху вниз, а не снизу вверх, как это принято.
Для того чтобы график функции приобрел привычный вид, необходимо ввести смещение по оси у. То есть, выполнить два условия. Во-первых, сместить воображаемую ось абсцисс и, соответственно, предполагаемую начальную точку графика вниз, чтобы освободить место над ней. Это даёт возможность при увеличении вычисленного значения функции (у) строить новую точку визуально выше предыдущей, хотя в действительности такое построение, «с точки зрения» самого модуля GraphABC, будет соответствовать уменьшению координаты у. Это следует разъяснять непосредственно в процессе работы. Важно, чтобы ученик самостоятельно пришел к выводу, что для получения требуемого результата (визуальное поднятие графика при увеличении вычисленного значения функции у) в качестве второго аргумента для процедуры LineTo следует использовать не собственно значение у, а разность между первоначальным значением выбранного смещения и вычисленным значением у. В этом случае, как показывает практика, понимание «внутреннего устройства» координатной плоскости окна модуля GraphABC закрепляется в сознании ученика быстро и достаточно надежно. В качестве подсказки ученику предлагается вспомнить, как работает вычитание: уменьшаемое минус вычитаемое дает разность. При неизменном уменьшаемом (это величина смещения), рост вычитаемого (вычисленное значение у) неминуемо означает уменьшение разности (реальная координата точки), что и требуется получить для правильного построения точек в окне построителя.
Для смещения начальной точки, от которой начинается визуальное построение графика, используется процедура MoveTo(x, y), где х, у – целочисленные координаты целевой точки. В качестве визуальной поддержки можно также нарисовать ось абсцисс, что сделает построенный график еще более наглядным. Для рисования оси наиболее удобно пользоваться процедурой Line(х1,у1,х2,у2). Она строит линию между точками 1(х1,у1) и 2(х2,у2), для которых можно задать указанные координаты в виде абсолютных значений.
Пример программы, рисующей график показательной функции у=х2 при положительных значениях аргумента показан ниже:
Uses GraphABC;
Var x,y: integer;
begin
MoveTo(0,150); //задаем смещение вниз на 150 пикселей по левой границе окна
Line(0,150,100,150); //рисуем ось абсцисс (дл.=100) на этом уровне
for x:=1 to 10 do //запускаем цикл с единичным шагом увеличения аргумента х для вычисления значений у.
begin
y:=x*x; //вычисляем значение функции в каждом шаге цикла
LineTo(x*10,150-y); //рисуем линию к вычисленной точке, причем
рост значения у соответствует подъёму линии
end;
end.
Примечание 1: для того чтобы на графике функции не появлялось лишних «хвостов», ведущих от выбранного начала координат (которое мы установили процедурой MoveTo) к первой точке собственно графика, в качестве второго аргумента для MoveTo следует выбирать не саму начальную величину смещения (у нас это 150 пикселей), а сразу величину (150-у), рассчитанную для первой точки графика, т.е. исходя из первого значения х внутри цикла. Первым же аргументом целесообразно выбирать не 0, как предложено выше, а само первое значение аргумента х. В приведенном примере это будет значение 10 (поскольку х*10 при х:=1 даёт нам именно 10).
В этом случае начало построенного графика будет находится строго в первой его точке.
Примечание 2: использование функций с отрицательным значением аргумента х в процедуре LineTo также требует установки смещения вправо по горизонтальной оси (абсцисс), чтобы отвести начальную точку от границы окна и иметь возможность строить график и влево, и вправо от неё. Механизм установки смещения аналогичен описанному выше для оси ординат.
Заключение
Процедура LineTo удобна также для построения графиков случайных изменений величин, не описываемых известными функциями, например, для отображения суточных колебаний температуры воздуха, или ежедневных её значений. Таблицу значений температур в данном случае удобно представлять в виде одномерного массива (заполнение массива данными мы здесь не рассматриваем), а их выборку производить также с использованием цикла. Горизонтальный масштаб изображения (по оси абсцисс) выбирается произвольно с учетом потребностей экспериментатора.
Примерный вид указанной программы может быть таков:
Uses GraphABC;
Var d: integer; //используется для задания даты (номера дня месяца)
Var T:array[1..30] of integer; //массив из 30 значений температур
begin
moveTo(0,100); // смещение оси абсцисс на 100 точек ниже верхней границы окна
Line(0,100,600,100); // рисуем ось абсцисс длиной 600 точек на выбранном удалении
for d:=1 to 30 do //цикл с номером дня в качестве индексной переменной
begin
LineTo(d*20, 100-T[d]); //строим график смены температур с шагом 20 точек по оси х
//масштаб по оси у также можно увеличить, например: T[d]*2
end;
end.
В данном случае удаление линии графика от оси абсцисс вверх или вниз будет пропорционально температуре. Нулевая температура соответствует положению точки на оси абсцисс, отрицательное значение будет находиться ниже оси. Начальная точка лежит на левой границе окна.
Нужно отметить, что если массив температур содержит нецелочисленные значения, то есть, данные вещественного типа, то для целей построения графика их необходимо принудительно привести к целочисленному формату, то есть, округлить при помощи операции round. Это обусловлено тем, что аргументы процедуры LineTo могут принимать только целочисленные значения.
МБОУ Лицей №7 им. Д.П. Уланова стр. 13 PAGE 14115 из 13 NUMPAGES 14415 В.М. Сапрыкин
В данном случае необходимо также использовать операторные скобки begin end; чтобы в теле цикла for to отрабатывались две строчки кода.
15