Научная статья на тему 'Программа для иллюстрации аналитических преобразований в методах интегрирования по частям с обратными тригонометрическими функциями'

Программа для иллюстрации аналитических преобразований в методах интегрирования по частям с обратными тригонометрическими функциями Текст научной статьи по специальности «Компьютерные и информационные науки»

CC BY
194
29
i Надоели баннеры? Вы всегда можете отключить рекламу.
Ключевые слова
ИЛЛЮСТРИРУЮЩАЯ ПРОГРАММА / ИНТЕГРАЛ / ПОЛНОЕ АНАЛИТИЧЕСКОЕ РЕШЕНИЕ / ФОРМАЛИЗАЦИЯ РЕШЕНИЯ / ПОСИМВОЛЬНЫЙ ВЫВОД / ILLUSTRATING THE PROGRAM / THE INTEGRAL / COMMENTING SOLUTIONS / COMPLETE ANALYTICAL SOLUTION / SERIAL-BY-CHARACTER OUTPUT

Аннотация научной статьи по компьютерным и информационным наукам, автор научной работы — Яриков Вадим Вячеславович

Обсуждается программа для иллюстрации аналитических преобразований в методах интегрирования по частям. Программа генерирует полное аналитическое решение задачи с обратными тригонометрическими функциями. Аналитическое решение задачи выводится со всеми промежуточными действиями посимвольно. В каждом блоке аналитического решения задачи присутствует составной комментарий, который описывает текущий шаг аналитического решения.

i Надоели баннеры? Вы всегда можете отключить рекламу.
iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

We discuss the program to illustrate the analytical transformations in the methods of integration by parts. The program generates a complete analytical solution to the inverse trigonometric functions. The analytical solution of the problem with all the intermediate output actions, character by character. Each block of the analytical solution of the present compound a comment that describes the current step of the analytical solutions

Текст научной работы на тему «Программа для иллюстрации аналитических преобразований в методах интегрирования по частям с обратными тригонометрическими функциями»

Программа для иллюстрации аналитических преобразований в методах интегрирования по частям с обратными тригонометрическими функциями

Вадим Вячеславович Яриков аспирант специальности 05.13.18 Математическое моделирование, численные методы и комплексы программ Марийский государственный университет, пл. Ленина, 1, г. Йошкар-Ола, 424001, 8(987)7137923 ibadmod@gmail.com

Аннотация

Обсуждается программа для иллюстрации аналитических преобразований в методах интегрирования по частям. Программа генерирует полное аналитическое решение задачи с обратными тригонометрическими функциями. Аналитическое решение задачи выводится со всеми промежуточными действиями посимвольно. В каждом блоке аналитического решения задачи присутствует составной комментарий, который описывает текущий шаг аналитического решения.

We discuss the program to illustrate the analytical transformations in the methods of integration by parts. The program generates a complete analytical solution to the inverse trigonometric functions. The analytical solution of the problem with all the intermediate output actions, character by character. Each block of the analytical solution of the present compound a comment that describes the current step of the analytical solutions.

Ключевые слова

иллюстрирующая программа, интеграл, полное аналитическое решение, формализация решения, посимвольный вывод.

illustrating the program, the integral, commenting solutions, complete analytical solution, serial-by-character output.

Введение

В настоящее время информационные технологии (ИТ) развиваются гигантскими темпами. Применение ИТ в самых различных сферах деятельности человека определяет необходимость их внедрения в образовательный процесс. Приоритетным направлением развития, описанным в Стратегии инновационного развития Российской Федерации на период до 2020 года, является внедрение в учебный процесс новейших инновационных образовательных технологий.

Одной из таких образовательных технологий является программа для иллюстрации аналитических преобразований. Традиционные методы обучения не позволяют в сжатые сроки вузовской подготовки накопить достаточный опыт решения сложных математических задач.

В своей основе рассматриваемая программа имеет динамическую математическую модель определённой задачи. В данной статье рассмотрен процесс аналитического решения математических задач из раздела «Интегрирование» курса

математического анализа - задачи, решаемые методом интегрирования по частям с обратными тригонометрическими функциями. Интегральное исчисление является одним из наиболее сложных разделов математики, при решении задачи необходимо уметь преобразовывать подынтегральную функцию, сводя исходный интеграл к табличному или под определенный метод интегрирования.

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

Важно частью иллюстрирующей программы является правильное решение задачи, составленное компьютером согласно алгоритму решения интеграла методом по частям с обратными тригонометрическими функциями.

Рассмотрим задачу, решаемую методом интегрирования по частям, вида |Рп (х) агс8Іп(х)йх, где Рп (х) - многочлен степени п. Причем, для определенности будем считать, что Рп (х) = ах ± Ь, где а, Ь - целые числа, соответственно п = 1.

Аналитическое решение интеграла находится следующим образом:

| (ах ± Ь) • агс8Іп(х)йх =

и = агс8Іп(х)йх йу = (ах ± Ь)

du =

йх

х

ах1

V =------± Ьх

2

2

(1)

эт(х) • (-----± Ьх) -1 (-----± Ьх)

йх

I

1 - х

Дальнейшие преобразования подынтегральной функции и нахождение аналитического решения задачи (1) будет найдено с помощью предварительных элементарных преобразований:

■ , ч ,ах , , ч ,,2 а а а , , ч

эт(х) • (-----± Ьх) - 1 (х----------1— ± Ьх)

2 1 2 2 2

йх

■Л— х 2

: агсэт(х) • (~~ і Ьх) + а | (1 - х2)

йх

і

1 - х

2 2

йх

І

-ц-

2хйх

1 - х

2^/1 - х2

■ , ^ах2 , , ч а , Г 2 а . , ч , , й(1 -х2)

: агс8іп(х) • (^— ± Ьх) + — 1 V1 - х йх - — агс8іп(х) + Ь\ -

2

2 '

2

2^1 - х

2

■ агс8Іп(х) • (± Ьх) + аІ - а агс8Іп(х) + Ь^ 1 - х2 + С

(2)

2

Интеграл I может быть определен методом интегрирования по частям.

1 - х йх =

йи = -

хйх

х 2 • х -

1-

х 2йх

2

2

V = х

: xV 1 - x2 - J . X ^ Д dx = xV 1 - x2 - J V 1 - x2 dx + J- dx

__________ C'f'./V - A у 1 ./V I у ± ./V C'f'./V I I j

i-x2 v^x2

= хл/ъ—Х2 -1 + агс8т(х)

Интеграл I сводится к сумме элементарных функций и интегралу I, который входит в формулу со знаком минус, таким образом, получается алгебраическое уравнение для определения интеграла I.

21 = хл/1 - х2 + агсзт(х)

/ = — V1 - x2 + — arcsin(x)

2 2

Подставляя найденное выражение для I в формулу (2), получаем:

j (ax ± b) • arcsin(x)dx == arcsin(x) • (± bx) + a I - a arcsin(x) + W1- x2 + С =

= arcsin(x) • (^- ± bx) + 1 - x2 - a arcsin(x) + bV1 - x2 + С

Интеграл вида jPn(x)arccos(x)dx, решается по аналогичному алгоритму, который был описан выше, существенным отличием в решении этого вида

dx

интегралов является принятие du = —. .

4\-x-

Интегралы вида j Pn (x)arctg(x)dx, j Pn (x)arcctgx)dx, j Pn (x)ln(x)dx берутся более простым способом. На шаге (2) получившийся интеграл I является табличным, поэтому нет необходимости использовать еще раз метод интегрирования по частям.

Таким образом, аналитическое решение вышеперечисленных видов интегралов можно объединить в одну иллюстрирующую программу, которая также может включать в себя виды интегралов. [1]

Реализация иллюстрирующей программы

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

Аналитическое решение задачи генерируется по специальным блокам решения, каждый блок решения является элементом одномерного массива block. Например, для записи полного аналитического решения задачи (1) необходимо 30 блоков. Полное решение хранится в переменной solution типа String. Длина полного аналитического решения хранится в переменной l.

Довольно часто при решении интеграла необходимо использовать специальные математические символы, например, знак радикала, знак интеграла, обыкновенную дробь или возведение в степень. При этом возникает проблема размещения специальных математических символов в строке solution. Для этого все математические символы были заменены специальными тэгами, которые при визуализации аналитического решения интерпретируются в соответствующие математические символы. [2]

Рассмотрим математические символы, которые были заменены. Обыкновенная дробь - число, состоящее из одной или нескольких частей (долей) единицы. Способ записи обыкновенной дроби:

m

n

где m - числитель обыкновенной дроби, n - знаменатель, n ф 0.

Для визуализации обыкновенной дроби в аналитическом решении необходимо ввести соответствующие обозначения. Числитель обыкновенной дроби обозначен {m}, знаменательно дроби [п]. В строку solution типа String помещается следующий тэг о каждой обыкновенной дроби:

±{m}[n]

Аналогичная ситуация складывается при записи натуральной степени числа. Число c называется n-й степенью числа a, если

c = a • a •... • a

Для обозначения натуральной степени в аналитическом решении задачи было введено специальное обозначение. Основание степени остается без изменений, а показатель степени обозначается тэгом Лп@. В строку solution типа String помещается следующий тэг о каждой степени:

± аЛп@

При визуализации аналитического решения каждый блок выводится на экран посимвольно. При инициализации решения задачи происходит объявление нескольких вспомогательных одномерных массивов. В одномерных массивах x, y, w, h хранятся соответственно горизонтальная и вертикальная координаты, ширина и высота каждого символа. В одномерных массивах bl, dr, st, ko для каждого символа хранятся идентификаторы принадлежности соответственно к блоку решения, числителю или знаменателю дроби, степени и радикала. В массивах drLeftUp, drRightUp, drLeftDown, drRightDown, stLeft, stRight, koLeft, koRight хранится информация о специальных тэгах обыкновенных дробей, степени и радикала.

Вертикальная координата обыкновенных дробей просчитывается в зависимости от значений дополнительного одномерного массива dr, в котором содержится индикатор дроби. Массив dr при первичной инициализации заполняется целыми числами по правилу:

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

• если символ в j метке является числителем i дроби, то в j элемент массива dr помещатся i;

• если символ в j метке является знаменателем i дроби, то в j элемент массива dr помещатся -i.

На практике это выглядит так:

for (int i = 0; i < countDr; i++) {

for (int j = drLeftUp[i]; j <= drRightUp[i]; j++) dr[j]=i+1;

for (int j = drLeftDown[i]; j <= drRightDown[i]; j++) dr[j]=-(i+1);

}

где в переменной countDr хранится общее количество дробей во всем аналитическом решении, drLeftUp[i], drLeftDown[i] - номера символов начала числителя и знаменателя, drRightUp[i], drRightDown[i] - номера символов конца числителя и знаменателя.

Вертикальная координата обыкновенной дроби увеличивается или уменьшается в зависимости от того положительное или отрицательное число находится в массиве dr.

Горизонтальная координата обыкновенной дроби рассчитывается отдельно для числителя и для знаменателя каждой дроби.

Для начала нужно определить длину числителя и знаменателя дроби и сравнить их. От результата сравнения зависит, какую переменную в дальнейшем необходимо использовать при расчете длины дробной черты.

П

an - называется степенью с основанием a и показателем n.

Для определения длины числителя дроби пробегаем цикл:

for (intj = drLeftUp[index]+1; j <=drRightUp[index]-1; j++) {

IMain. setText(" "+solution. charA t(j));

FontMetrics mcHR = IMain.getFontMetricsfontNormal); if (solution.charAt(j)!=’@’ && solution.charAt(j)!=’A’ &&

solution.charAt(j)!=’#’ && solution.charAt(j)!='%')

wwUp=ww Up+mcHR. string Width (lMain.getText());

}

В переменной index содержится порядковый номер дроби в решении.

После этого создаем элемент mcHR типа FontMetrics и устанавливаем в нем переменную шрифт fontNormal, который используется при выводе символов числителя и знаменателя дроби. На следующем шаге, пропуская специальные символы (@, Л, #, % и др.), используемые для создания специальных тэгов, просчитываем длину числителя с помощью метода stringWidth. Данный метод возвращает ширину указанного символа строки, используя шрифт, ранее инициализированный в программе.

Аналогичным образом определяем длину знаменателя дроби, однако, пробегаем цикл в пределах от drLeftDown[index]+1 до drRightDown[index]-1.

Наибольшая длина числителя (wwUp) или длина знаменателя (wwDown) будет являться основной длиной дроби. Опираясь на основную длину каждой дроби, в дальнейшем, будет рассчитана длина дробной черты.

ÜÜ

.......— I - .1

О

Рисунок 1. Отступы дробной черты

Если после сравнения числитель дроби оказался длиннее, чем знаменатель (wwUp>wwDown), то отступ первого символа числителя дроби, который обозначен на рисунке 1 цифрой 1, равен 0. При этом горизонтальная координата числителя дроби должна совпадать с горизонтальной координатой дробной черты. Остальные координаты символов числителя просчитываются по формуле:

х[)]=х[)-1]^м!Ц-1];

где j - текущий символ, в одномерном массиве х хранятся горизонтальные координаты, в одномерном массиве w хранится ширина каждого символа.

Дробная черта представляет из себя определенное количество меток (в зависимости от ширины каждой дроби) с символом «-», расположенных в двумерном массиве Ьт типа JLabel. Расстояние между элементами массива равно 0 из-за этого достигается эффект сплошной дробной черты.

Тэгом для визуализации радикала является тэг «^...#». Символ «V» доступен в стандартном наборе шрифта, и для его отображения не нужно создавать специальные методы визуализации. Однако, решая подобные задачи на бумаге, обычно применяют расширенную символику (рисунок 2) - знак корня с длинной чертой, которая продолжается до конца подкоренного выражения.

//ЬхМх

Рисунок 2. Расширенная символика корня

Для реализации расширенной символики радикала применяются аналогичные методы, которые использовались при создании дробной черты обыкновенной дроби.

Используя данные из массива ko, koLeft, koRight, в которых хранятся индикатор радикала и порядковые номера специальных тэгов радикала в аналитическом решении задачи, инициализируем метки, с помощью которых будет построен корень с длинной чертой.

Однако, при расчете длины черты корня может возникнуть ситуация, когда под корнем будут находиться другие тэги. Например, выражение на рисунке 2 в строке solution хранится в следующем виде:

Vl^2@#dx

При расчете длины черты корня необходимо исключать тэги математических символов. Выполнив необходимые вычисления, создаем метки для черты корня с помощью цикла:

for (int k=0; k<=countkoHr[num]; к++){ kohr[num][k] = new JLabel(); kohr[num][k]. setFont(fontNormal); kohr[num][k].setVerticalAlignment(JLabel.TOP); kohr[num] [k]. setText("- "); kohr[num][k].setVisible(false); kohr[num][k].setBounds(xx, yy, ww, hh); pMain.add(kohr[num][k]);

}

Выделяем память для k-метки в двухмерном массиве kohr[num][k], устанавливаем необходимый шрифт в этой метке fontNormal, вертикальное выравнивание по верхнему краю метки JLabel.TOP, помещаем символ «-», задаем координаты (xx,yy) и размеры (ww,hh) метки, задаем параметр, отвечающий за отображение метки - false и добавляем метку kohr[num][k] на основную панель. Данная процедура аналогична созданию меток дробной черты, единственное различие в смещении по вертикали черты корня, которое необходимо для того, чтобы верхний правый край знака радикала («V») совпадал с началом черты, тем самым создавая единый символ.

При визуализации аналитического решения задачи (1) возникает необходимость создания длинной вертикальной полосы замены (рисунок 3).

и=16х+18 dv=sin(15x)dx

du=16dx =

cos(15x) v=---------

Рисунок 3. Вертикальные полосы замены

В строке solution полоса замены хранятся в виде символа «|», который в процессе инициализации решения интерпретируется, как и остальные специальные тэги математических символов, в полноценную вертикальную полосу замены. При этом процессе применяется алгоритм похожий на инициализацию дробной черты.

J(16x+18)sin(15x)dx=

Перед инициализацией меток для каждой полосы замены необходимо просчитать их горизонтальные координаты расположения. Для левой полосы замены, очевидно, горизонтальная координата вычисляется по формуле

x[j]=x[j-1]+w[j-1];

С вычисление горизонтальных координат правой полосы замены все сложнее. При вычислении необходимо учитывать максимальную длину выражений, которые находятся внутри блока замены в решении задачи. Фактически, алгоритм вычисления сводится, к задаче нахождения наибольшей длинны из четырех блоков решения. На рисунке 3 наибольшая длина получилась у блока dv = sin(15x)dx.

Соответственно, горизонтальная координата правой полосы замены должна равняться сумме горизонтальной координаты последнего символа наибольшего блока решения, ширины этого символа и дополнительно разрыва между символами.

Однако, процесс вычисления наибольшей длины не так тривиален. Это связанно с использованием специальные тэгов (@, Л, #, %, [, ], {, }), которые помогают корректно визуализировать математические символы. В строке solution cos(15x)

блок решения V = -

15

■ представлен следующим образом:

v = -{cos15x}[15].

При вычислении длины стандартными методами результат получится

неверным и окажется, что блок решения

- cos(15x) больше, чем dv = sin(15x)dx . 15

Из-за этого произойдет некорректная визуализация правой полосы замены (Рисунок 4). ' '

и=16х+18 dv=sin(15x) du=16dx cos(15x)

v=

15

Ix

Рисунок 4. некорректная визуализация правой полосы замены

Поэтому при вычислении максимальной длины необходимо использовать данные из вспомогательных одномерных массивов drLeftUp, drRightUp, drLeítDown, drRightDown, в которых хранится информация о специальных тэгах обыкновенных дробей.

Перед вычислением длины каждой строки необходимо проанализировать ее содержание, если в строке находятся специальные тэги для визуализации математических символов, то при подсчете их необходимо исключить. Если при анализе выясняется, что в данной строке находится дробь, то за ее длину необходимо принять основную длину дроби (наибольшую длину числителя или знаменателя).

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

х=х[Ывск[1]]+Ывск[1]. length() +шаш^;

V

где i - номер самого длинного блока символов, x[block[i]] - горизонтальная координата блока, block[i].length() - длина блока, maxww - погрешность расстояния между символами в блоке.

После необходимых вычислений создаем метки для полосы замены с помощью цикла:

for (int k=0; k<numCHR; к++){ chr[n][k] = new JLabel(); chr[n][k]. setFont(fontNormal); chr[n][k].setVerticalAlignment(JLabel.TOP); chr[n][k].setText("\"); chr[n][k]. setVisible(false); chr[n][k].setBounds(xx, yy, ww, hh); pMain. add(chr[n][k]);

}

Выделяем память для k метки в двухмерном массиве chr[n][k], устанавливаем шрифт в этой метке fontNormal, вертикальное выравнивание по верхнему краю метки JLabel.TOP, помещает символ «|», задаем координаты (xx,yy) и размеры (ww, hh) метки и задаем параметр, отвечающий за отображение метки -false, таким образом, после инициализации метка не будет показана. В конце добавляем метку chr[n][k] на основную панель. После прохождения всего цикла полоса замены будет полностью сформирована, ее длина равна numCHR. Для того, чтобы показать n-полосу замены необходимо вызвать следующий метод:

for (int j = 0; j <=numCHR; j++) chr[n][j].setVisible(true);

При демонстрировании аналитического решения задачи пользователю необходима теоритическая база для полноценного усваивания навыков практического решения задач. Поэтому в процессе решения на каждом шаге пользователю выдается составной комментарий описывающий методику решения и аналитические преобразования, выполняемые в текущем блоке.

Данный механизм комментирования реализован в программе с помощью метода information(). Анализируя текущую позицию в аналитическом решении (переменная view), стадию, в которой находится приложение во время работы (переменная status) и текущий блок решения задачи, данный метод выводит соответствующий составной комментарий о решении, а также об аналитических преобразованиях, выполняемых в текущем блоке решения. if (status==1&&view<l)

if (bl[view]==0) llnfo.setText ("Комментарий");

Во время первичной инициализация компонентов оболочки графического интерфейса происходит объявление и выделение памяти для метки llnfo типа JLabel, устанавливается шрифт fontlnfo, горизонтальное выравнивание по центру и задаются размеры метки:

JLabel lInfo = new JLabel(); lInfo.setFont (fontlnfo);

lInfo.setHorizontalAlignment (JLabel. CENTER); lInfo.setPreferredSize(new Dimension(widthWorkspace, 100));

Данная метка lInfo будет располагаться на вспомогательном

информационном контейнере, она добавляется туда во время инициализации графического интерфейса с помощью стандартной метода add: pInfo. add(lInfo);

После добавления на вспомогательную панель, ей задается макет размещения BorderLayout - PAGE_START, который автоматически располагает ее в верхней части окна (рисунок 5).

Щ Учебно-практическая программа "Интеграл" (10.2) [ *=>

Имеем интеграл вида /ах+Ь$т(кх)сЬс, где к - натурально число, к є [2,20]; а,Ь - натуральные числа, а,Ь є [2,20]. В данном примере к=3, а=10, Ъ=19, интеграл такого вида будем брать по частям. Интегрированием то частям называется нахождение интеграла то формуле /ч сіу-и- у-[ус!и, где и~ф(х) и у-і[>(х) - непрерывно диффиринцируемые функции ОТ X.

J (1 Ох-19)sin(3x)dx=

Рисунок 5. Составной комментарий

В итоге при работе иллюстрирующей программы происходит необходимая визуализация полного аналитического решения задачи (1) со всеми промежуточными

действиями (рисунок 6).

|1>| Учебно-практическая программа "Интеграл" (I

Рисунок 6. Иллюстрирующая программа

Для построения интерфейса иллюстрирующей программы используется стандартная библиотека языка Java - Swing, которая представляет из себя готовый набор библиотек javax.swing. Библиотека Swing предоставляет гибкие интерфейсные компоненты, которые служат основой для одинаковой кроссплатформенной работы приложения. Она поддерживает специфические динамически подключаемые виды и поведения, благодаря которым возможна адаптация графического интерфейса программы к GUI (Graphical user interface - графический интерфейс пользователя) операционной системы. Таким образом, данный иллюстрирующая программа может одинаково корректно работать в любой операционной системе (семейства Windows,

Linux, Unix) с поддержкой Java и выглядеть как «родное приложение» для данной операционной системы.

Заключение

Совершенствование образования становится все более очевидным приоритетом в стратегии развития стран мира. Поэтому особое внимание в настоящий момент уделяется эффективности материально-технического и информационного обеспечения отечественной сферы образования, внедрению в учебный процесс новейших инновационных образовательных технологий.

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

Одной из основных задач при внедрении информационных комплексов программ учебного назначения является повышение доступности образовательных услуг без снижения качества профессиональной подготовки студентов. Однако, как свидетельствуют факты, существенных успехов в этом направлении удается достичь далеко не всегда. В первую очередь это относится к сфере инженерного и естественнонаучного образования, где важную роль в процессе обучения играют практические занятия.

Обучение естественнонаучным (инженерным) специальностям включает в себя ряд особенностей, которые сильно затрудняют использование информационных технологий. Одной из таких особенностей является необходимость повседневной практической деятельности в виде регулярно выполняемых лабораторных работ и практических занятий по решению математических задач.

Таким образом, использование информационных технологий в системе образования должно осуществляться в формах, максимально приближенных к формам традиционного обучения. Наиболее подходящими средствами для осуществления такого обучения являются иллюстрирующие программы и компьютерные тренажеры, которые выявляют компетентность обучаемого на уровне применения теоретических знаний на практике.

Программа, иллюстрирующая аналитические преобразования в методе интегрирования по частям зарегистрирована в Фонде алгоритмов и программ СО РАН (ФАП СО РАН), регистрационный номер PR12007 от 9 июня 2012 года и доступна для ознакомления в открытом доступе на сайте ФАП СО РАН.

Литература

1. Яриков В.В. Иллюстрирующая программа по нахождению первообразной функции для интеграла вида произведения двух непрерывных гладких функций // Международный журнал «Образовательные технологии и общество (Educational Technology & Society)» - 2011. - V.14. - 1. - С. 337-346 - ISSN: 1436-4522.

URL: http://ifets.ieee.org/russian/depository/v14 i1/html/7.htm

2. Яриков В.В. Образовательная система иллюстрации аналитических преобразований в методах интегрирования // Вестник Марийского государственного университета: сборник трудов по материалам Всероссийской научно-практической конференции «ИТО-Марий Эл 2012» (Йошкар-Ола, 21 - 22 мая 2012 г.) - 2012. - 9. -С. 82 - 84.

i Надоели баннеры? Вы всегда можете отключить рекламу.