КАК ПОСТРОИТЬ ГРАФИК Сумина Г.А., Сурчалова Л.В., МОУ «Лицей прикладных наук» г. Саратова Пояснительная записка. название: «Построение и масштабирование Творческое графиков функций». Количество часов на курс: 32. Образовательная область: Информатика и информационные технологии. Тип курса: профильный, предметно-ориентированный курс, направленный на развитие содержания предмета «Информационные технологии» Курс рассчитан на профильное обучение в школах, лицеях, гимназиях по информатике и информационным технологиям в 10-11 классах Идея курса: привить интерес к программированию, научить понимать, как на экране строится один график или несколько, масштабируется экран. Обоснованность курса заключается в том, что умение программировать на хотя бы одном алгоритмическом языке позволяет осваивать самостоятельно любые языки программирования, что готовит учащихся к профессиональной деятельности в информационном обществе. Решая задачи, связанные с построением графиков, мы можем рассматривать численные методы: решения нелинейных уравнений, интегрирования, решения обыкновенных дифференциальных уравнений первого порядка. Особенностью курса является наличие большого количества интересных, специально подобранных задач, ранее не рассмотренных в учебной литературе. Состав учебно-методического комплекта. Учебно-методический комплект по Элективному курсу для профильной подготовки учеников 10-11 классов «Построение и масштабирование графиков функций» включает в себя учебное пособие (теоретически материал и задания для самостоятельной работы), презентации для лекций, дополнительную литературу. Задания в учебно-методическом комплекте разной сложности, что делает возможным личностно-ориентированный подход к учащимся. Ко всем заданиям даны подробные пояснения. Текущий контроль усвоения материала можно осуществить по результатам выполнения заданий, а итоговый контроль - по выполнению творческого задания и его защиты. Организация учебного процесса реализуется в виде уроков, большая часть из которых в виде практических работ на компьютере на алгоритмическом языке Паскаль. Программа курса. 1. Текстовый и графический видеорежимы. 2. Методика построения графика функций в графическом режиме. 3. Методика построения графика функций на весь экран. 4. Методика построения осей координат и их оцифровка. 5. Методика построения графика функций в прямоугольнике или на координатной сетке. Примечание. В элективном курсе учитывается ситуация, что учащиеся знают основные алгоритмические структуры и основы языка Паскаль. Построение графиков с использованием коэффициентов масштабирования в литературе по информатике встречается редко и описано недостаточно подробно. Как правило, приводится алгоритм построения графика непрерывной функции на весь экран монитора без оцифровки осей и масштабирования. Работа с графикой на языке Паскаль достаточно сложная вещь, которая требует знаний не только алгоритмических конструкций, строковых переменных, типов данных и их совместимости, циклов, стандартных и пользовательские процедур и функции, метода координат, но и знаний по устройству дисплея и режимов его работы. Изучение данной темы способствует углублению знаний не только по информатике, но и другим предметам. Построение графиков функции и его масштабирование используется во многих прикладных программах по математике (построение и исследование графиков функций при изучении темы «Численные методы решения нелинейных уравнений, интегрирования, решения дифференциальных уравнений»). В Приложениях 1-6 приведены тексты программ, решенных учениками Лицея колледжа прикладных наук на языке Паскаль, и результаты их выполнения для различных параметров. Курс «Как построить график» позволяет понять экранные координаты, графические примитивы и их использование, работу со строками, численные методы решения математических задач. Требования к знаниям учащихся. После изучения курса учащиеся должны уметь: Масштабировать декартовы координаты для изображения на мониторе. Строить графики непрерывных функций и оси координат. Оцифровывать оси координат. Строить несколько графиков. Иллюстрировать математические задачи на построение графиков функций. Тематическое планирование курса. № 1. 2. 3. 4. 5. 6. 8. 9. Тема Текстовый и графический видеорежимы. Построение графика функций в графическом режиме. Построение графика функций на весь экран. Построение осей координат и их оцифровка. График функций в прямоугольнике или на координатной сетке. Иллюстрация численных методов. Метод бисекции. Иллюстрация численных методов. Численное интегрирование. Иллюстрация численных методов. Численное решение ОДУ. Итого Теория 1 Практика 2 2 2 2 4 6 6 1 1 1 2 2 32 Текстовый и графический видеорежимы. Графики функций на компьютере можно построить в текстовом или графическом видеорежиме. Управление памятью в этих режимах осуществляется с помощью констант, процедур и функций стандартных модулей CRT и GRAPH [5]. В текстовом режиме размеры экрана по горизонтали могут быть 80 или 40, по вертикали - 25, 43 или 50 позиций (графическом режиме размеры экрана - от 320*200, 640*480, 1280*1024) в зависимости от типа видеоадаптера, установленного в компьютере. В Паскале принята следующая система координат: (1,1) координата Х (MaxX, 1) (1, MaxY) (MaxX, MaxY) текстовый видеорежим модуль CRT (0,0) координата Х (GetMaxX,0) (0, GetMaxY) (GetMaxX,GetMaxY) графический видеорежим модуль GRAPH График функции должен хорошо выглядеть на экране компьютера и сопровождаться поясняющей информацией, которая облегчала бы его анализ. При выводе графика на экран возникает проблема выбора масштабирования; необходимости оценки границ изменения аргумента и функции: соотношение между вещественными и целочисленными значения номеров позиций на экране, Х и Y. График функций в графическом режиме. Рассмотрим построение графиков непрерывных функций. Обычно график можно построить, определив несколько его точек и последовательно соединив их непрерывной линией. Некоторые сложности возникают при построении графика на компьютере, который имеет «перевернутый экран», т.е. началом отсчета координат является верхний левый угол. Такую систему координат называют «экранной». Часто график функции располагают в центре экрана, совмещая центр графика с центром экрана, такая система координат называется - «центральной». На экране компьютера можно расположить график функции следующим образом: 1. на весь экран, на половину экрана, на треть экрана, на четверть и т.д.; 2. в прямоугольнике или на координатной сетке. Рассмотрим каждый из этих случаев отдельно. Построение графика функции на весь экран. Рассмотрим алгоритм построения графика непрерывной функции f(x) на отрезке [a, b] для которой известны значения минимума fmin и максимума fmax на данном отрезке. Для этого необходимо поставить во взаимно однозначное соответствие точки координатной плоскости, на которой расположен график и точки экрана. Приведем формулы пересчета, которые выглядят следующим образом: x-a fmax - y xэ = p + -------- m, yэ= q + -------------- n, (*) b-a fmax – fmin где xэ, yэ – координаты экрана; p, q - отступы по вертикали и горизонтали соответственно, m, n - ширина и высота прямоугольника, на котором строится график функции, соответственно, x, y - координаты точек графика на плоскости. Например, при x = a, xэ = p, а при y = fmin, yэ = q; при x = b, xэ = p+m, а при y = fmax, yэ = =q+n. Если p = 0, q = 0, m = 640, n = 480, то график строится на весь экран. В Приложении в табл.1 и 2 приведены коэффициентами масштабирования, соотношения между которыми позволяют разделить экран на несколько частей. Как видно из формулы (*) для построения графика необходимо вычислить значения функции f(x). Алгоритм, вычисляющий эти значения, лучше всего оформить в виде функции на языке Паскаль. Например: function f(x:real):real; begin f:=x*cos(x); end; Для построения графика необходимо вычислять значение функции во всех точках дважды: 1) для нахождения ymax и ymin; 2) при построении графика. Поэтому алгоритм вычисления максимального и минимального значения графика функции f(x) удобнее выделить в процедуру. procedure min_max(a,b:integer;var ymin,ymax:real); var x:real; begin (начало процедуры) x:=a; ymin:=f(a); ymax:=f(a); while x<=b do begin if f(x)<ymin then ymin:=(f(x)); if f(x)>ymax then ymax:=(f(x)); x:=x+0.01; end; end; (конец процедуры). Если необходимо построить график по уже имеющимся значениям, например, полученным в ходе проведения эксперимента, то значения точек функции лучше запомнить в массиве. Данный алгоритм предлагается реализовать учащимся самостоятельно. Масштабирование графика позволяет одновременно построить несколько графиков функций в любой части экрана и вывести сопровождающую информацию. Для этого экран разбивается на несколько частей. В Приложении приведены примеры разбиения экрана на две, три и четыре части. Случаи деления экрана на четыре и шесть частей и расчет коэффициентов масштабирования экрана предлагается учащимся для самостоятельного решения. Оси координат и их оцифровка. Чтобы придать графику функций привычный для нас вид, на экране необходимо нарисовать оси координат. Если график проходит через начало координат, то оси координат можно расположить в центре экрана - точки центра экрана находятся (GetMaxX div 2, GetMaxY div 2). Ниже приведен фрагмент программы для построения осей координат в центре экрана. line(0,GetMaxY div 2,GetMaxX,GetMaxY div 2); (Ось X) line(GetMaxX div 2,0,GetMaxX div 2, GetMaxY); (Ось Y) line(620,235,640,240); (стрелка оси X) line(620,245,640,240); line(317,20,320,0); line(323,20,320,0). (стрелка оси Y) Фон, на котором строится график функции задается с помощью стандартной процедуры setbkcolor (color). Цвет осей задается setcolor (color). На экран можно поместить текстовую информацию, используя специальную процедуру OutTextxy(x, y, 'text'), которая выдает текст (строку) из переменной на графический экран. outtextxy(630,245,'X'); (обозначение оси x) outtextxy(310,5,'Y'); (обозначение оси y) Для того, чтобы нанести деления и числовые отметки на оси координат на экран нужно выдавать не текст, а значение вещественного числа. Для этого используем стандартную процедуру str(x:1,r), чтобы получить представление числа в виде строки символов. Результат помещаем в символьную строку. for i:=0 to 16 do begin line(40*i+0,238,40*i+0,242); (нанесение делений на ось OX) line(318,40*i+40,322,40*(i+1)); (нанесение делений на ось OY) end; aa:=-9; for i:=0 to 16 do begin aa:=aa+1; str(aa:1,r); outtextxy(40*i+0,250,r); end; (нанесение числовых отметок на ось OY) bb:=-5; for i:=0 to 11 do begin if bb<>0 then begin str(bb:1,r); outtextxy(328,440-40*i,r); end; bb:=bb+1; end; (нанесение числовых отметок на ось OX) Построение графика функции и примеры решения использованием данной методики приведены в Приложениях 1-6. задач с Построение графика функций в прямоугольнике или на сетке. Если график функции лежит далеко от начала координат, то его удобнее строить на координатной сетке. Для этого экран делят равностоящими вертикальными и горизонтальными линиями. Расстояния между ячейками сетки определяются следующим образом: dx=(GetMaxX – p)/k, dy=(GetMaxY– q)/k, где p и q- отступы от края экрана, k - количество ячеек. Алгоритм построения графика, разметки сетки, оцифровки осей аналогичен алгоритму построения графика на весь экран. Если при решении задачи необходимо знать о наличии корней уравнения, то на экран можно вывести одновременно и ось координат и сетку. Определение корней уравнения можно выделить или в отдельную процедуру или в отдельный модуль, который можно использовать и при решении других задач. Создать такой модуль предлагается учащимся выполнить самостоятельно. Задачу величины ячеек координатной сетки необходимо рассматриваться отдельно и предлагается учащимся для самостоятельного решения. Примеры построения графиков функций на координатной сетке приводятся в Приложении 6. Численное интегрирование. Численное интегрирование основано на том, что функция описывается интерполяционным многочленом: f ( x) a 0 a1 x1 a 2 x 2 ... a n x n (Строится по точкам) Т.к. не все функции интегрируются, то приходится применять численные методы. Функция у f (x) заменяется интерполяционным многочленом P (x ) , который в точках xi равен значению функции. P ( xi ) f ( xi ) Метод прямоугольника. Где h (b a) / n - шаг, n-число точек, (a-b)- интервал, тогда xi 1 xi h На отрезке [ x0 h / 2, x0 h2] интеграл будет равен площади прямоугольника: На отрезке [a,b] интеграл будет Равен площади n-прямоугольников: x0 h 2 x0 f ( x)dx h x0 2 b f ( x)dx a h 2 y dx y h 0 0 h x0 2 ba ( y1 / 2 y3 / 2 ... y( 2 n1) / n ) Rn n Интеграл слева вычисляется по формуле: b f ( x)dx a b f ( x)dx a ba ( y 0 y1 ... y n1 ) Rn n ba ( y1 y 2 ... y n ) Rn n Интеграл справа вычисляется по формуле: Где Rn - погрешность, которая вычисляется по формуле: Rn Где (b a ) 2 M 1 2n M 1 max f ' ( x) a ,b Метод трапеций. Рассмотрим случай, когда интерполяционный многочлен первого порядка: f(x)=P(x) и нам известно, что f ( x0 ) y0 , f ( x1 ) y1 . Мы хотим построить интерполяционный многочлен: P( x ) y 0 y1 y0 ( x x0 ) n Рассмотрим вычисление интеграла при f(x)=P(x): x h0 f ( x)dx x0 x0 h (y 0 x0 x0 h f ( x)dx x0 . y1 y 0 y y 0 ( x0 h)( x0 h) 2 x0 ( x0 h) ( x x0 )) dx y 0 ( x0 h) ( 1 )( ) h h 2 y1 y 0 x0 2 x0 y y 0 x0 h 2 2 x0 h 2 x0 2 x0 h )( ) y 0 x0 y 0 h ( 1 )( ) y 0 x0 h 2 h 2 2 2 2 ( y1 y 0 ) x0 2 y 0 h 2 ( y1 y 0 )( x0 h 2 ) ( y1 y 0 ) x0 2h 2h 2 2 2 2 2 y h 2 y1 x0 y 0 x0 y1 h 2 y 0 h 2 y1 x0 y 0 x0 y y1 0 ( 0 )h 2h 2 2 2 2 2 y 0 x0 ( Таким образом, интеграл, вычисляемый по методу трапеции на отрезке [a,b] равен: b b a a f ( x)dx p( x)dx Rn b a y0 yn ( y1 ... y n 1 ) Rn n 2 (b a) 3 M2 12n Где Rn - погрешность для метода трапеций, вычисляемая по формуле: M 2 max f '' ( x) [ a ,b ] Метод Симпсона (парабол). Для этого метода промежуток разбиваем на четное количество частей м считаем, что нам Известны 3 точки: y0 f ( x0 ) y1 f ( x1 ) y 2 f ( x2 ) y1 y0 y 2 y1 y0 ( x x0 ) 2 ( x x0 )( x ( x0 h)) n 2h 2 Убедимся в том, что P( x2 ) f ( x2 ) : P( x) y 0 P( x ) y 0 y1 y0 y 2 y1 y0 ( x 2 x0 ) 2 ( x2 x0 )( x2 ( x0 h)) n 2h 2 x0 2 h f ( x)dx x0 x0 2 h 1 P( x)dx 3 ( y 0 4 y1 y 2 )h x0 Заметим, что x2 x0 2h P( x) y0 2 y1 2 y0 y 2 2 y1 y0 y 2 На отрезке [ x0 , x0 h / 2] интеграл вычисляется по формуле: ….. Таким образом, интеграл для метода Симпсона на отрезке [a, b] вычисляется по формуле: b f ( x)dx a ba ( y 0 y 2 n 4( y1 y3 ... y 2 n1 ) 2( y 2 y 4 ... y 2 n2 )) Rn 3n Где Rn - погрешность, вычисляемая по формуле: Rn (b a) 5 M3 180n . Где M 3 max f IV ( x) [ a ,b ] . Примеры. Рассмотрим пример вычисления интегралов на простой функции, для которой можно вычислит аналитическое значение: y x 3 ; h 0,2 ; [a, b] [0, 1,2]. Подсчитаем интеграл для этой функции: ( x 3)dx x2 3x 2 1, 2 ( x 3)dx 4,32 0 i xi yi 0 1 2 3 4 5 6 0 0,2 0,4 0,6 0,8 1,0 1,2 3 3,2 3,4 3,6 3,8 4,0 4,2 Метод прямоугольника слева: A1 0,2 * (3 3,2 3,4 3,6 3,8 4) 4,2 Метод прямоугольника справа: A2 0,2 * (3,2 3,4 3,6 3,8 4 4,2) 4,42 Погрешность для этих методов: Rn1 (1,2 0) * M 1 / 12 M1 1 Rn1 0,12 Метод трапеций: A1 0,2 * ((3 4,2) / 2 3,2 3,4 3,6 3,8 4) 4,32 Rn 2 0 , т.к. производная второго порядка равна нулю. Метод Симпсона: A4 (0,2 / 3) * (3 4,2 4 *10,8 2 * 7,2) 4,32 Rn3 0 , т.к. производная четвертого порядка равна нулю. Программа. Численные методы решения обыкновенных дифференциальных уравнений. Методы Эйлера и Рунге-Кутты (Выполнил ученик 11’ класса ЛПН Овчинников Александр). uses crt; var f2,x,y,ye,k1,k2,k3,k4,b,c,h:real; output:text; f1:text; function f(x,y:real):real; begin f:=2/(x+2)+x+1; end; begin clrscr; assign(output,'output.txt'); rewrite(output); x:=0; y:=1; b:=0.5; h:=0.1; ye:=1; writeln(output,'x':8, 'k1':8, 'k2':8, 'k3':8, 'k4':8, 'y':8, 'ye':12); while x<=0.8 do begin ye:=ye+h*f(x,ye); k1:=h*f(x,y); k2:=h*f(x+h/2,y+k1/2); k3:=h*f(x+h/2,y+k2/2); k4:=h*f(x+h/2,y+k3); c:=(k1+2*k2+2*k3+k4)/6; y:=y+c; x:=x+h; writeln(output, x:8:2, k1:8:4, k2:8:4, k3:8:4, k4:8:4, y:8:4, ye:12:4); end; close(output); end. Пример: y' 2 x 1 x2 . x 0.10 0.20 0.30 0.40 0.50 0.60 0.70 0.80 Пример: y ' x cos x 0.10 0.20 0.30 0.40 0.50 0.60 0.70 0.80 k1 0.2000 0.2052 0.2109 0.2170 0.2233 0.2300 0.2369 0.2441 k2 0.2026 0.2080 0.2139 0.2201 0.2266 0.2334 0.2405 0.2477 k3 0.2026 0.2080 0.2139 0.2201 0.2266 0.2334 0.2405 0.2477 k4 0.2026 0.2080 0.2139 0.2201 0.2266 0.2334 0.2405 0.2477 y 1.2021 1.4097 1.6231 1.8427 2.0687 2.3016 2.5415 2.7886 ye 1.2000 1.4052 1.6161 1.8331 2.0564 2.2864 2.5234 2.7674 k2 0.0917 0.0992 0.1064 0.1131 0.1194 0.1252 0.1305 0.1354 k3 0.0916 0.0992 0.1063 0.1130 0.1193 0.1251 0.1304 0.1353 k4 0.0905 0.0978 0.1047 0.1112 0.1173 0.1228 0.1279 0.1326 y 1.0908 1.1892 1.2947 1.4069 1.5253 1.6496 1.7792 1.9137 ye 1.0878 1.1833 1.2863 1.3964 1.5130 1.6357 1.7641 1.8976 y 2. k1 0.0878 0.0955 0.1028 0.1098 0.1163 0.1223 0.1279 0.1330 2 Пример: y' 4.1x y 0.6 . x k1 k2 0.10 -0.0400 -0.0155 0.20 0.0051 0.0251 0.30 0.0420 0.0583 0.40 0.0720 0.0848 0.50 0.0954 0.1048 0.60 0.1125 0.1188 0.70 0.1239 0.1273 0.80 0.1300 0.1310 3 2 Пример: y' xy x . x k1 0.10 0.0000 0.20 0.0091 0.30 0.0170 0.40 0.0244 0.50 0.0323 0.60 0.0418 k2 0.0048 0.0131 0.0207 0.0282 0.0366 0.0475 k3 -0.0180 0.0231 0.0566 0.0834 0.1037 0.1180 0.1268 0.1308 k3 0.0048 0.0132 0.0208 0.0284 0.0369 0.0481 k4 -0.0159 0.0210 0.0509 0.0742 0.0913 0.1025 0.1086 0.1103 k4 0.0048 0.0135 0.0217 0.0301 0.0399 0.0533 y 0.9795 0.9999 1.0537 1.1341 1.2347 1.3495 1.4729 1.6003 y 1.0040 1.0165 1.0368 1.0647 1.1013 1.1490 ye 0.9600 0.9688 1.0170 1.0966 1.2003 1.3212 1.4527 1.5886 ye 1.0000 1.0090 1.0255 1.0489 1.0791 1.1169 0.70 0.0550 0.0636 0.0648 0.0740 1.2132 0.80 0.0760 0.0907 0.0933 0.1110 1.3057 2 2 Пример: y' x xy y . x k1 0.10 0.1000 0.20 0.1367 0.30 0.1928 0.40 0.2824 0.50 0.4364 0.60 0.7345 0.70 1.4337 0.80 3.7938 Пример: y' k3 0.1174 0.1633 0.2349 0.3538 0.5712 1.0354 2.3362 8.9097 k4 y 0.1307 1.1162 0.1852 1.2777 0.2729 1.5101 0.4249 1.8602 0.7209 2.4254 1.4183 3.4506 3.7671 5.7794 22.7349 15.3456 ye 1.1000 1.2330 1.4137 1.6650 2.0248 2.5610 3.4065 4.8543 1 y x2 x . x 0.20 0.30 0.40 0.50 0.60 0.70 0.80 0.90 Пример: k2 0.1157 0.1603 0.2294 0.3427 0.5458 0.9638 2.0499 6.5246 1.1645 1.2260 y' y k1 11.0000 7.5916 6.9897 6.7911 6.7050 6.6615 6.6372 6.6227 k2 8.7778 7.1916 6.8536 6.7294 6.6720 6.6418 6.6245 6.6140 k3 8.0370 7.1116 6.8342 6.7226 6.6690 6.6402 6.6236 6.6135 k4 10.4691 8.5179 7.8077 7.4688 7.2750 7.1509 7.0651 7.0025 y 10.1831 17.6357 24.6646 31.5252 38.3022 45.0316 51.7314 58.4114 ye 12.0000 20.5000 28.4444 36.1806 43.8167 51.3972 58.9438 66.4680 2x y . x 0.10 0.20 0.30 0.40 0.50 0.60 0.70 0.80 0.90 k1 0.1000 0.0915 0.0849 0.0797 0.0755 0.0721 0.0692 0.0669 0.0650 k2 0.0955 0.0880 0.0822 0.0775 0.0737 0.0706 0.0680 0.0658 0.0641 k3 0.0952 0.0878 0.0820 0.0774 0.0736 0.0704 0.0679 0.0658 0.0641 k4 0.1004 0.0932 0.0874 0.0828 0.0789 0.0757 0.0731 0.0709 0.0692 y 1.0970 1.1863 1.2698 1.3485 1.4233 1.4950 1.5640 1.6308 1.6959 ye 1.1000 1.1918 1.2774 1.3582 1.4351 1.5090 1.5803 1.6498 1.7178 Методика проведения уроков по данной теме. При решении задач на масштабирование графика функции используются различные формы работы: - урок дискуссия; - самостоятельная работа; - проверка знаний учащихся по индивидуальным заданиям; - написание законченных продуктов и представление их на смотры и конференции. Сначала ребятам читается лекция по данной теме и предлагается для ознакомления готовый шаблон построения графика функции без масштабированию Затем демонстрируются результаты работы отлаженных алгоритмов, (метод опережающего обучения) и на простых примерах объясняется реализация алгоритма построения графика функций на весь экран. Для анализа работы алгоритма предлагаются задачи на построение графиков тригонометрических функций, таких как, sin(x) и cos(x). Анализируются результаты выполнения программы. Преподавателями вводятся коэффициенты масштабирования и предлагается учащимся вручную рассчитать их для разбиения экрана на любое количество частей. Проводим построение и оцифровку осей координат. Построение графиков функций на компьютере дают более наглядное представление, чем на уроке математики и поэтому их удобно демонстрировать при объяснении сложного материала, решать сложные задачи по информатике, математике и физике. Творческие задания-проекты. 1. Изучить презентацию «Метод бисекции». Выполнить программу вычисления корней с помощью метода половинного деления. Иллюстрировать метод бисекции с помощью построения графика функции и нанесения точек половинного деления. Провести аналогию, построив методом «золотого сечения» решение нелинейного уравнения. 2. Изучить Презентацию «Численные методы интегрирования». Построить программу для численного нахождения определенного интеграла способами: Прямоугольников, Трапеции, Методом Симпсона. Выполнить иллюстрацию метода, построить на экране 4 графика. 3. Решить Задачу Коши для обыкновенного дифференциального уравнения 1-го порядка методами Эйлера и Рунге-Кутты. Сравнить методы графическим способом. Состав учебно-методического комплекта. 1. Презентация «Метод бисекции». 2. Презентация «Численные методы интегрирования». 3. Лекция «Численные методы решения дифференциальных уравнений». 4. Листинги программ построения графиков и иллюстраций численных методов. Литература. 1. Семакин И.Г., Хеннер Е.К. Информационные системы и модели. Элективный курс: учебное пособие. – М.: БИНОМ. Лаборатории я знаний, 2005 – 303 с. 2. Андреева Е.В., Босова Л.Л., Фалина И.Н. Математические основы информатики. Элективный курс: учебное пособие. – М.: БИНОМ. Лаборатории я знаний, 2005 – 328 с. 3. Угринович Н.Д., Босова Л.Л., Михайлова Н.И. Практикум по информационным технологиям. Учебное пособие для общеобразовательных учреждений. – М. Лаборатория Базовых знаний, 2002. 400с. Приложение 1 Шаблон построения графика функции без масштабирования uses graph; var grDriver,grMode,ErrCode,xm,ym:integer; a,b,step,x,ymin,ymax:real; Function f(x:real):real; begin f:=sin(x)*x; end; begin writeln('Введите границы интервала'); read(a,b); grDriver:=Detect; InitGraph(grDriver,grMode,'h:\tp6\bgi'); ErrCode:=GraphResult; if ErrCode=grOk then begin step:=(b-a)/640; x:=a; ymin:=f(A); ymax:=f(A); while x<=b do begin if ymin>f(x) then ymin:=f(x); if ymax>f(x) then ymax:=f(x); x:=x+step; end; x:=a; while x<=b do begin xm:=round((x-a/b-a)*639); ym:=round((ymax-f(x))/(ymin-ymax)*479); putpixel(xm,ym,15); x:=x+step; end; readln; readln; closegraph; end else writeln('Graphics error:',GraphErrorMsg(Errcode)); end. Приложение 2 Построение графика функции x*cos(x) на весь экран program graphic_1; uses crt,graph; var gd,gm,i,x2,y2,aa,bb,a,b,p,q,n,m:integer; x,ymin,ymax:real; r:string; function f(x:real):real; begin f:=x*cos(x); end; (Процедура поиска min и max функции) procedure min_max(a,b:integer;var ymin,ymax:real); var x:real; begin (начало процедуры) x:=a; ymin:=f(a); ymax:=f(a); while x<=b do begin if f(x)<ymin then ymin:=(f(x)); if f(x)>ymax then ymax:=(f(x)); x:=x+0.01; end; end; (конец процедуры). BEGIN (начало основной программы) writeln('Введите границы интервала'); read(a,b); GD:=detect; initgraph(gd,gm,'c:\bp\bgi'); (Инициализация графики) if GraphResult <> grOk then Halt(1); (обнаружение ошибки графического режима) setcolor(15); (устанавливает цвет осей графика) setbkcolor(0); (устанавливает цвет фона) line(0,240,635,240); (рисование осей координат) line(320,0,320,480); line(620,235,640,240); (стрелка по оси х) line(620,245,640,240); line(317,20,320,0); (стрелка по оси y) line(323,20,320,0); outtextxy(310,5,'Y'); (обозначение оси y) outtextxy(630,245,'x'); (обозначение оси x) {-------------} aa:=-9; (нанесение делений и числовых отметок на ось OY) for i:=0 to 16 do begin aa:=aa+1; str(aa:1,r); outtextxy(40*i+0,250,r); end; bb:=-5; (нанесение делений и числовых отметок на ось OX) for i:=0 to 11 do begin if bb<>0 then begin str(bb:1,r); outtextxy(328,440-40*i,r); end; bb:=bb+1; end; {-------------} {Построение графика функций} min_max(a,b,ymin,ymax); (Вызов процедуры поиска min max функции) x:=a; (точка начала построения графика) while x<=b do (цикл «пока не достигнем конца выбранного отрезка») begin x2:=round((x-a)*639/(b-a)); (текущие координаты графика) y2:=round((ymax-f(x))*479/(ymax-ymin)); putpixel(x2,y2,yellow); (рисуем точками график функции) x:=x+0.005; end; readln; closegraph; (Закрытие графического режима) END. (конец основной программы). Результат выполнения программы Приложение 3 Построение графиков функции и их масштабирование. Деление экрана на две части. program graphic_2; uses crt,graph; var gd,gm,Errcode,i,x2,y2,aa,bb,a,b,p,q,c,d:integer; x,ymin,ymax:real; y1min,y1max: real; function f(x:real):real; begin f:=sin(x); end; (Процедура поиска min и max функции) procedure min_max(a,b:integer;var ymin,ymax:real); var x:real; begin (начало процедуры min_max) x:=a; ymin:=f(a); ymax:=f(a); while x<=b do begin if f(x)<ymin then ymin:=(f(x)); if f(x)>ymax then ymax:=(f(x)); x:=x+0.05; end; end; (конец процедуры min_max) function f1(x:real):real; begin f1:=cos(x/4); end; (Процедура поиска min и max функции cos(x/4)) procedure min1_max(a,b:integer;var ymin,ymax:real); var x:real; begin (начало процедуры min1_max) x:=a; ymin:=f1(a); ymax:=f1(a); while x<=b do begin if f1(x)<ymin then ymin:=(f1(x)); if f1(x)>ymax then ymax:=(f1(x)); x:=x+0.01; end; end; (конец процедуры min1_max) BEGIN (начало основной программы) writeln('Введите границы интервала'); read(a,b); GD:=detect; initgraph(gd,gm,'c:\bp\bgi'); (Инициализация графики) ErrCode:=GraphResult; if ErrCode=grOk then begin setcolor(15); setbkcolor(0); SettextStyle(DefaultFont, HorizDir,1); TextColor(6); outtextxy(80,10,'Построение графиков функций и графика'); outtextxy(200,25,'Деление экрана на две части'); масштабирование (Построение графиков функций) min_max(a,b,ymin,ymax); (Вызов процедуры поиска min_max функции) p:=20; q:=120; c:=250; d:=360; (Вывод текста) outtextxy(110,80,'y=sin(x)'); (Построение графика y=sin(х) с масштабированием) x:=a; while x<=b do (цикл «пока не конец отрезка ab» строить) begin x2:=round(p+(x-a)*(c-p)/(b-a)); y2:=round(q+(ymax-f(x))*(d-q)/(ymax-ymin)); putpixel(x2,y2,yellow); x:=x+0.005; (шаг) end; (конец цикла «пока») min1_max(a,b,y1min,y1max); функции y=cos(x/4)) p:=360; q:=120; c:=600; d:=360; (Вызов процедуры outtextxy(430,80,'y=cos(x/4)'); x:=a; while x<=b do begin x2:=round(p+(x-a)*(c-p)/(b-a)); y2:=round(q+(y1max-f1(x))*(d-q)/(y1max-y1min)); putpixel(x2,y2,yellow); x:=x+0.005; end; readln; closegraph; (Закрытие графического экрана) end else Writeln ('Graphics error:', GraphErrorMsg(ErrCode)); END. (Конец основной программы). поиска min1_max Результат выполнения программы Приложение 4 Деление экрана на три части program graphic_3; uses crt,graph; var gd,gm,Errcode,i,x2,y2,aa,bb,a,b,p,q,c,d:integer; x,ymin,ymax:real; y1min,y1max,y2min,y2max: real; function f(x:real):real; begin f:=sin(x); end; (Процедура поиска min и max функции y=sin(x)) procedure min_max(a,b:integer;var ymin,ymax:real); var x:real; begin (начало процедуры) x:=a; ymin:=f(a); ymax:=f(a); while x<=b do begin if f(x)<ymin then ymin:=(f(x)); if f(x)>ymax then ymax:=(f(x)); x:=x+0.05; end; end; (конец процедуры) function f1(x:real):real; begin f1:=cos(x/4); end; (Процедура поиска min и max функции y=cos(x/4)) procedure min1_max(a,b:integer;var ymin,ymax:real); var x:real; begin (начало процедуры) x:=a; ymin:=f1(a); ymax:=f1(a); while x<=b do begin if f1(x)<ymin then ymin:=(f1(x)); if f1(x)>ymax then ymax:=(f1(x)); x:=x+0.01; end; end; (конец процедуры) function f2(x:real):real; begin f2:=x*x*x; end; (Процедура поиска min и max функции y=x*x*x) procedure min2_max(a,b:integer;var ymin,ymax:real); var x:real; begin (начало процедуры) x:=a; ymin:=f2(a); ymax:=f2(a); while x<=b do begin if f2(x)<ymin then ymin:=(f2(x)); if f2(x)>ymax then ymax:=(f2(x)); x:=x+0.1; end; end; (конец процедуры) BEGIN (начало основной программы) Writeln ('Введите границы интервала'); Read (a,b); GD:=detect; initgraph(gd,gm,'c:\bp\bgi'); (Инициализация графики) ErrCode:=GraphResult; if ErrCode=grOk then begin setcolor(15); setbkcolor(0); (Вывод текстовой информации на экран) SettextStyle (DefaultFont, HorizDir,1); Outtextxy (80,10,'Построение графиков функций и масштабирование графика'); Outtextxy (200,25,'Деление экрана на три части'); (Построение графиков функций) min_max(a,b,ymin,ymax); (Вызов процедуры поиска min_max функции) p:=20; q:=120; c:=150; d:=360; (Вывод текста) outtextxy(50,80,'y=sin(x)'); (Построение графика y=sin(х) с масштабированием) x:=a; while x<=b do (цикл «пока не конец отрезка ab» строить) begin x2:=round(p+(x-a)*(c-p)/(b-a)); y2:=round(q+(ymax-f(x))*(d-q)/(ymax-ymin)); putpixel(x2,y2,yellow); x:=x+0.005; (шаг) end; (конец цикла «пока») min1_max(a,b,y1min,y1max); функции) y=cos(x/4)} p:=220; q:=120; c:=380; d:=360; (Вызов процедуры outtextxy(280,80,'y=cos(x/4)'); x:=a; while x<=b do begin x2:=round(p+(x-a)*(c-p)/(b-a)); y2:=round(q+(y1max-f1(x))*(d-q)/(y1max-y1min)); putpixel(x2,y2,yellow); x:=x+0.005; end; поиска min1_max min2_max(a,b,y2min,y2max); функции y=x*x*x) p:=440; q:=120; c:=600; d:=360; (Вызов процедуры outtextxy(500,80,'y=x*x*x'); x:=a; while x<=b do begin x2:=round(p+(x-a)*(c-p)/(b-a)); y2:=round(q+(y2max-f2(x))*(d-q)/(y2max-y2min)); putpixel(x2,y2,yellow); x:=x+0.01; end; readln; closegraph; (Закрытие графического экрана) end else Writeln('Graphics error:', GraphErrorMsg(ErrCode)); END. (Конец основной программы) Результат выполнения программы поиска min2_max Приложение 5 Деление экрана на 4 части program graphic_4; uses crt,graph; var gd,gm,ErrCode,i,x2,y2,aa,bb,a,b,p,q,c,d:integer; x,ymin,ymax:real; y1min,y1max,y2min,y2max,y3min,y3max:real; function f(x:real):real; (Функция, вычисляющая значение функции в точке х) begin f:=sin(x); end; (Процедура поиска min и max функции y=sin(x)) procedure min_max(a,b:integer;var ymin,ymax:real); var x:real; begin (начало процедуры min_max) x:=a; ymin:=f(a); ymax:=f(a); while x<=b do begin if f(x)<ymin then ymin:=(f(x)); if f(x)>ymax then ymax:=(f(x)); x:=x+0.05; end; end; (конец процедуры min_max) function f1(x:real):real; begin f1:=cos(x/4); end; (Процедура поиска min и max функции y=cos(x/4)) procedure min1_max(a,b:integer;var ymin,ymax:real); var x:real; begin (начало процедуры min1_max) x:=a; ymin:=f1(a); ymax:=f1(a); while x<=b do begin if f1(x)<ymin then ymin:=(f1(x)); if f1(x)>ymax then ymax:=(f1(x)); x:=x+0.01; end; end; (конец процедурыmin1_max) function f2(x:real):real; begin f2:=x*x*x; end; (Процедура поиска min и max функции y=x*x*x) procedure min2_max(a,b:integer;var ymin,ymax:real); var x:real; begin (начало процедуры min2_max) x:=a; ymin:=f2(a); ymax:=f2(a); while x<=b do begin if f2(x)<ymin then ymin:=(f2(x)); if f2(x)>ymax then ymax:=(f2(x)); x:=x+0.1; end; end; (конец процедуры min2_max) function f3(x:real):real; begin f3:=x+20; end; (Процедура поиска min и max функции f(x)=x+20) procedure min3_max(a,b:integer;var ymin,ymax:real); var x:real; begin (начало процедуры min3_max) x:=a; ymin:=f3(a); ymax:=f3(a); while x<=b do begin if f3(x)<ymin then ymin:=(f3(x)); f f3(x)>ymax then ymax:=(f3(x)); x:=x+0.01; end; end; (конец процедуры min3_max) BEGIN (начало основной программы) writeln('Введите границы интервала'); read(a,b); GD:=detect; initgraph(gd,gm,'c:\bp\bgi'); (Инициализация графики) ErrCode:=GraphResult; (Обнаружение ошибки в графике) if ErrCode=grOk then begin setcolor(15); setbkcolor(0); (Построение графиков функций) min_max(a,b,ymin,ymax); (Вызов процедуры поиска min_max функции) p:=10; q:=10; c:=300; d:=220; (Построение графика y=sin(х) с масштабированием) x:=a; while x<=b do (цикл «пока не конец отрезка ab» строить) begin x2:=round(p+(x-a)*(c-p)/(b-a)); y2:=round(q+(ymax-f(x))*(d-q)/(ymax-ymin)); putpixel(x2,y2,yellow); x:=x+0.005; (шаг) end; (конец цикла «пока») (Построение графика y=cos(х/4) с масштабированием) min1_max(a,b,y1min,y1max); (Вызов процедуры поиска min1_max функции y=cos(x/4)) p:=10; q:=270; c:=300; d:=400; x:=a; while x<=b do begin x2:=round(p+(x-a)*(c-p)/(b-a)); y2:=round(q+(y1max-f1(x))*(d-q)/(y1max-y1min)); putpixel(x2,y2,yellow); x:=x+0.005; end; (Построение графика y=x*x*x с масштабированием) min2_max(a,b,y2min,y2max); (Вызов процедуры функции y=x*x*x) p:=350; q:=10; c:=620; d:=220; x:=a; while x<=b do begin x2:=round(p+(x-a)*(c-p)/(b-a)); y2:=round(q+(y2max-f2(x))*(d-q)/(y2max-y2min)); putpixel(x2,y2,yellow); x:=x+0.01; end; поиска min2_max (Построение графика y=х+20 с масштабированием) min3_max(a,b,y3min,y3max); (Вызов процедуры поиска min3_max функции y=x+20) p:=350; q:=270; c:=620; d:=420; x:=a; while x<=b do begin x2:=round(p+(x-a)*(c-p)/(b-a)); y2:=round(q+(y3max-f3(x))*(d-q)/(y3max-y3min)); putpixel(x2,y2,yellow); x:=x+0.005; end; readln; closegraph; end (закрытие графического режима) else Writeln('Graphics error:', GraphErrorMsg(ErrCode)); (код ошибки) END. (конец основной программы) Результат выполнения программы Приложение 6 Построение графиков функции и их масштабирование на сетке (Программа выполнена учеником 11 класса Филатовым Андреем) uses graph; var x01,y01,x,y,h,ymin,ymax,a,b:real; ox,oy,gd,gm:integer; function f(x:real):real; begin f:=sin(x)*x; end; procedure min_max(var ymin,ymax:real); (Вычисляет максимальное и минимальное) begin (значения графика функции f(x) на отрезке [a,b]) x:=a; ymin:=f(a); ymax:=f(a); while x<=b do begin y:=f(x); if ymax<y then ymax:=y; if ymin>y then ymin:=y; x:=x+h; end; end; procedure graphic(p,q,n,m:integer; (Координаты окна на экране) x0,x1,ymin,ymax:real; (начальные и конечные значения по осям x и y) var x01,y01:real; var ox,oy:integer); var rasmx,rasmy,kx,ky,rx,ry:real; i:integer; sx,sy:string; begin x01:=m/(x1-x0); (Вычисляет длину единичного отрезка по оси X) y01:=n/(ymax-ymin); (Вычисляет длину единичного отрезка по оси Y) ox:=round(p-x0*x01); (Вычисляет положение начала координат по оси X) oy:=round(q+ymax*y01); (Вычисляет положение начала координат по оси Y) kx:=m/15;rasmx:=x0; ky:=n/15;rasmy:=ymin; rx:=(x1-x0)/15; ry:=(ymax-ymin)/15; setcolor(red); for i:=0 to 15 do begin line(p,q+round(i*ky),p+m,q+round(i*ky)); (Рисует сетку в прямоугольнике) line(p+round(i*kx),q,p+round(i*kx),q+n); (с координатами (p,q,p+m,q+n)) end; settextstyle(0,0,0); setcolor(white); if ox>=p then (Определяет попадает ли ось y в) if ox<=p+m then (прямоугольник с координатами (p,q,p+m,q+n)) begin line(ox,q,ox,q+n); (Рисует ось y) for i:=0 to 15 do begin str(rasmy:2:2,sy); outtextxy(ox+10,round(q+n-i*ky),sy); (Оцифровывает ось y) rasmy:=rasmy+ry; end; end; if ox>p+m then (Если ось y проходит справа от) for i:=0 to 15 do (прямоугольника с координатами (p,q,p+m,q+n)) begin (оцифровывает по оси y около) str(rasmy:2:2,sy); (правого края прямоугольника) outtextxy(p+m-10,round(q+n-i*ky),sy); rasmy:=rasmy+ry; end; if ox<p then (Если ось y проходит слева от) for i:=0 to 15 do (Прямоугольника с координатами (p,q,p+m,q+n)) begin (оцифровывает по оси y около) str(rasmy:2:2,sy); (левого края прямоугольника) outtextxy(p+10,round(q+n-i*ky),sy); rasmy:=rasmy+ry; end; settextstyle(0,1,0); if oy>=q then (Определяет попадает ли ось x в) if oy<=q+n then (прямоугольник с координатами (p,q,p+m,q+n)) begin line(p,round(oy),p+m,round(oy)); (Рисует ось y) for i:=0 to 15 do begin str(rasmx:2:2,sx); outtextxy (round(p+i*kx-5),oy-18,sx); (Оцифровывает ось x) rasmx:=rasmx+rx; end; end; if oy>q+n then (Если ось х проходит ниже) for i:=0 to 15 do (прямоугольника с координатами (p,q,p+m,q+n)) begin (оцифровывает по оси x около) str(rasmx:2:2,sx); (нижнего края прямоугольника) outtextxy(round(p+i*kx-5),q+n,sx); rasmx:=rasmx+rx; end; if oy<q then (Если ось у проходит выше) for i:=0 to 15 do (прямоугольника с координатами (p,q,p+m,q+n)) begin (оцифровывает по оси х около) str(rasmx:2:2,sx); (верхнего края прямоугольника) outtextxy(round(p+i*kx-5),q,sx); rasmx:=rasmx+rx; end; end; procedure postr(a,b,x01,y01,ox,oy,ymin,ymax:real); var xe,ye:integer; begin x:=a; while x<=b do begin y:=f(x); xe:=round(x*x01+ox); (Переводит координату x графика в xe на экране) ye:=round(oy-y01*y); (Переводит координату y графика в ye на экране) putpixel(xe,ye,blue); x:=x+h; end; begin h:=0.001; a:=1; b:=10; min_max(ymin,ymax); gd:=detect; initgraph(gd,gm, 'c:\bp\bgi'); graphic(50,50,350,550,a,b,ymin,ymax,x01,y01,o x,oy); postr(a,b,x01,y01,ox,oy,ymin,ymax); x:=-maxint; repeat x:=x+1; until x>maxint; readln; closegraph; end