Как построить график

advertisement
КАК ПОСТРОИТЬ ГРАФИК
Сумина Г.А., Сурчалова Л.В., МОУ
«Лицей
прикладных
наук»
г.
Саратова
Пояснительная записка.
название: «Построение и масштабирование
Творческое
графиков
функций».
Количество часов на курс: 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
ba
( y1 / 2  y3 / 2  ...  y( 2 n1) / n )  Rn
n
Интеграл слева вычисляется по формуле:
b
 f ( x)dx 
a
b
 f ( x)dx 
a
ba
( y 0  y1  ...  y n1 )  Rn
n
ba
( 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
ba
( y 0  y 2 n  4( y1  y3  ...  y 2 n1 )  2( y 2  y 4  ...  y 2 n2 ))  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
x2
.
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
Download