Урок 13. Полезные функции
Полезные функции
Пакет расширения Miscellaneous
Слово Miscellaneous в переводе на русский язык означает «всякая всячина». Большинство функций этого пакета, на первый взгляд, не имеет прямого отношения к математическим расчетам. Однако как сказать! Этот пакет представляет систему Mathematica в особом свете — как систему, имеющую далеко не стандартные средства синтеза звука и графического представления информации самого общего вида. Физики, химики, географы и даже музыканты могут найти в этом пакете средства, полезные им при обработке на компьютере информации произвольного вида.
Подпакет Audio служит для генерации стандартных звуковых сигналов разной формы, частоты и длительности, модуляции сигналов по амплитуде и по частоте и считывания звуковых файлов с дисков. Для создания звуковых объектов служит функция Waveform:
Приведенный на рис. 13.1 пример дает генерацию прямоугольного сигнала частотой 1000 Гц и длительностью 0.5 с. Следует обратить внимание.на то, что созданный звуковой объект проигрывается и показывается после команды Show.
Звуковой объект, как отмечалось, ассоциируется с графическим объектом. К сожалению, явной связи между осциллограммой звукового сигнала и его графическим образом нет. Более того, вид графического объекта сильно зависит от компьютерной платформы, на которой установлена система Mathematica. Так что графический звуковой объект — это просто некий условный графический образ звукового сигнала.
Рисунок 13.2 показывает генерацию прямоугольного сигнала с двумя гармониками. Здесь используется опция Overtones->2. Ее нельзя применять к синусоидальному сигналу, поскольку он принципиально не имеет гармоник.
Рис. 13.1. Создание и просмотр звукового объекта — синусоидального сигнала
Рис. 13.2. Генерация прямоугольного сигнала с двумя гармониками
Когда указана опция Overtones, функция Waveform использует ряд Фурье для создания высших гармоник, обогащающих тембр звука. При этом возможно изменение числа гармоник. Возможно также создание сигнала с заданными номерами и амплитудами гармоник. Для этого служит функция ListWaveform:
На рис. 13.3 представлен пример создания звукового объекта сложного типа, содержащего ряд частотных составляющих. Данные представлены списком partial-List. С помощью функции Table подготовлен объект, содержащий шесть звуковых подобъектов.
Рис. 13.3. Генерация многочастотного сигнала
Для создания звуковых объектов, порождающих звук с амплитудной и частотной модуляцией, служат следующие функции:
Рисунок 13.4 демонстрирует создание звукового объекта с амплитудной и частотной модуляцией. Обратите внимание на то, что объект показывается сразу, поскольку в состав его выражения включена команда //Show.
Для создания сложных сигналов с частотной модуляцией функция Frequency-Modulation используется в следующем виде:
Рисунок 13.5 показывает создание и воспроизведение композитного звуковок сигнала. Он представлен списком объектов {s 1, s 2, s 3}.
Рис. 13.4. Генерация звуковых объектов с амплитудной (сверху) и частотной (снизу) модуляцией
Рис. 13.5. Генерация композитного звукового сигнала
Для считывания звуковых файлов с магнитного диска служит функция Read-Soundfile:
Разумеется, считываемый звуковой файл должен быть расположён в текущей директории или его имя должно точно указывать местоположение файла. Файлы отображаются соответствующим графическим образом (как описывалось выше).
Синтез музыкальных звуков — Music
Подпакет Music как бы продолжает рассмотренный ранее подпакет поддержки звуковых возможностей системы Mathematica. Он задает функцию последовательного воспроизведения списка, содержащего отдельные звуки:
Пример воспроизведения мажорной гаммы (поставляемая с системой мелодия JustMajor) представлен на рис. 13.6. Помимо фрагмента JustMajor имеется еще 11 фрагментов, которые поставляются с системой Mathematica (QuarterTone, Mean-Major, MeanMinor, SixthTone, JustMinor и т. д.). Все они могут воспроизводиться функцией Scale.
Рис. 13.6. Пример воспроизведения музыкального фрагмента
Кроме того, есть ряд функций преобразования:
Примеры преобразования даны ниже:
<<Miscellaneous`Music`
HertzToCents[{400, 450, 525}]
{203.91, 266.871}
alist = Tablet N[440 2^(i/12)], {i, 0, 12}]
{440,., 466.164, 493.883, 523.251, 554.365, 587.33, 622.254,
659.255, 698.456/739.989, 783.991, 830.609, 880.}
HertzToCents[alist]
{100., 100., 100., 100., 100., 100., 100., 100., 100., 100., 100., 100.}
CentsToHertz[{0, 600}]
{440., 622.254}
Описанные возможности синтеза музыки являются скорее данью моде на мультимедиа, чем нужными на практике. Так, время подготовки музыкального объекта довольно значительно (до десятка секунд на компьютере с процессором Pentium II 350). Так что они годятся только для создания простейших музыкальных звуков, которыми можно сопровождать некоторые учебные программы.
Функции времени и дат — Calendar
В пакете расширений Miscellaneous есть ряд подпакетов, содержащих функции времени и даты. Так, в подпакете Calendar сосредоточены вычисления, относящиеся к календарным датам:
Во всех этих функциях возможна опция Calendar->cal. Имеется также функция смены календаря:
Примеры вычислений с датами:
<<Miscellaneous` Calendar`
DayOfWeek{[1988, 6, 23}]
DaysBetween[{1900, 1, 1}, {1901, 1,1}]
365
DaysPlus[{1900, 1, 1}, 366]
{1901, 1, 2}
DaysBetween[{1900, 1, 1},{1901, 1, 1},Calendar -> Julian]
366
Calendar-Change[{1992, 2, 29}, Gregorian, Julian]
{1992, 2, 16}
CalendarChange[{1992, 2, 29}, Gregorian, Islamic]
{1412, 8, 25}
CalendarChange[{1,1,1}, Islamic, Julian]
{622, 7, 16}
Города и расстояния — CityData и Geodesy
В подпакете CityData можно найти функции, позволяющие найти координаты большинства крупных городов мира: CityData [city, datatype], CityData [city] иCityData[datatype]. Например:
<<Miscellaneous`CityData`
CityData["Montreal",
CityPosition]
{{45, 30}, {-73, -36}}
CityData["Washington"]
{{CityPosition, {{38, 53, 42}, {-77, -2, -12}}}}
Координаты (широта и долгота) выдаются в формате {градусы, минуты} или {градусы, минуты, секунды}.
В этом же подпакете есть функции для вычисления расстояний между городами:
Пример вычисления расстояния между городами дан ниже:
CityDistance["Washington", "Montreal"]//N
786.915
Базу данных можно расширять, добавляя в нее информацию о новых городах:
CityPosition[{"Champaign", "USA", "IL"}] = {{40, 7, 5},
{-88, -14, -48}};
Убедимся, что информация действительно добавлена:
CityData["Champaign", CityPosition]
{{40, 7, 5}, {-88, -14, -48}}
Для добавления новых полей в базу данных можно использовать функцию AppendTc (см. урок 9). Например, добавим поле для хранения информации о населении:
AppendTo[$CityFields, CityPopulation]
Теперь введем в базу данных информацию о населении Вашингтона:
CityPopulation[{"Washington", "USA", "DC"}] = 638000;
Проверим результат, запросив всю имеющуюся в базе информацию об этом городе:
CityData["Washington"]
{{CityPosition, {{38, 53, 42}, {-77, -2, -12}}},
{CityPopulation, 638000}}
Как видите, результат теперь включает новую информационную категорию —
CityPopulation.
В подпакете Geodesy есть функции, вычисляющие расстояние между двумя точками с учетом выпуклости Земли:
Примеры вычислений по этим функциям представлены ниже:
SphericalDistance[{0, 0}, {45,-45}] //N
6671.7
SpheroidalDistance[{0, 0}, {45, 45}] //N
6662.47 % - %%
-9.23014
Географические и картографические данные — WortdData, WorldNames и WorldPlot
В пакете Miscellaneous имеется база данных по странам мира. Доступ к ней открывает подпакет WorldData. Для этого имеется функция WorldData [ "Страна" ], возвращающая список координат конечных отрезков прямых, которые задают контурный график — карту заданной страны. Например, данные по Азербайджану можно получить следующим образом:
<<Miscellaneous` WorldData`
WorldData["Azerbaijan"]
{{{2378, 2689}, {2374, 2770}, {2344, 2806}, {2330, 2770}, {2378, 2689}}, {{2361, 2849}, {2419, 2781}, {2472, 2701}, {2445, 2823}, {2509, 2778}, {2473, 2871}, {2510, 2915}, {2414, 3024}, {2307, 2933}, {2376, 2888}, {2361, 2849}}}
Попробуйте сами найти данные по России (Russia) — мы их не приводим ввиду громоздкости списка, что вполне естественно, поскольку Россия — крупнейшая страна мира и имеет самую длинную границу (контурную линию) с многочисленными изломами.
В подпакете WorldNames имеется список стран, систематизированный по континентам: Africa, Asia, Europa, MiddleEa.st, NorthAmerica, Oceania, South-America и World (весь мир). Например, так можно узнать, какие страны расположены в Океании:
<<Miscellaneous`WorldNames`
Oceania // InputForm
{"Indonesia", "Papua New Guinea", "Fiji", "Australia", "New Zealand")
Наиболее эффектными являются возможности подпакета WorldPlot, функции которого позволяют строить карты любой страны или всего мира:
На рис. 13.7 показано построение контурной карты России (верхний рисунок) и цветной карты мира. Раскраска достигается применением директивы RandomColors.
Рис. 13.7. Контурная карта России и цветная карта мира
Следующий рисунок (рис. 13.8) показывает возможность композиционного изображения картографических изображений. На нем построена карта Америки и особо выделены (более темным цветом) территории Канады и Мексики. Здесь для цветовых выделений использована директива GrayLevel, позволяющая задавать степень густоты серого цвета.
Рис. 13.8. Карта Америки с выделенными Канадой и Мексикой
Карты могут строиться в различных проекциях: Albers, Equirectangular, LambertAzimuthal, LambertCylindrical, Mercator, Mollweide, Orthographic и Sinusoidal. Для этого используется опция WorldProjection-> Имя_проекции.
На рис. 13.9 представлена цветная карта всего мира, построенная в синусоидальной проекции. Такая проекция удобна для общего обозрения всей поверхности земного шара при взгляде с экватора (сравните рис. 13.9 с рис. 13.7).
Рис. 13.9. Вид на земной шар при синусоидальной проекции
Выбор вида проекции способен преобразовать вид изображения. Для иллюстрации этого на рис. 13.10 представлена карта мира в иной проекции — азимутальной проекции Ламберта (LambertAzimuthal). В таком виде получается прекрасный вид на Землю со стороны Северного полюса.
Рис. 13.10. Вид но земной шор со стороны Северного полюса при азимутальной проекции Ламберта
Еще один пример (с цилиндрической проекцией Ламберта) представлен на рис. 13.11. Здесь показана карта Африки. Цилиндрическая проекция в некоторых случаях позволяет визуально уменьшить геометрические искажения границ, обусловленные сферической поверхностью Земли. Обратите также внимание на технику окраски самого континента, фона и рамки.
Рис. 13.11. Контурная карта Африки в цилиндрической проекции
В подпакет World Plot включены функции преобразования углов:
Примеры преобразований представлены ниже:
ToMinutes [1]
60
ToMinutes [{1,20}]
80
ToMinutes [{1,20,10}]
481/6
N[%]
80.1667
Физические константы и размерные величины — PhysicalConstants
В подпакете PhysicalConstants определено несколько десятков наиболее употребительных физических констант. Они представлены как размерные величины, то есть помимо своего численного значения имеют единицы измерения. Физические константы вводятся своими полными символьными именами, например, как показано в следующей таблице.
Ввод и вывод |
Комментарий |
<<Miscellaneous " PhysicalConstants " SpeedOfLight 299792458 Meter/Second |
Загрузка подпакета Скорость света |
Second SpeedOfLight AgeOfUniverse 1. 40902 xl0 26 Meter |
Выражение с константами |
ElectronMass
9 . 10939 x 10- 31 Kilogram |
Масса электрона |
AccelerationDueToGravity 9. 80665 Meter/Second 2 |
Ускорение свободного падения |
Полные списки физических констант приведены в справочной базе данных по подпакету PhysicalConstants.
Для выполнения физических, химических и иных расчетов в Mathematica предусмотрена возможность работы с размерными переменными. Для этого база данных системы содержит символьные имена практически для всех единиц измерения (времени, массы, расстояния, температуры и т. д.). Данные о них можно найти в справочной базе данных подпакета Units. Там же имеются функции для перевода единиц измерении из одной системы размерных единиц в другую.
Начнем с функции Convert [old, newunits], которая осуществляет преобразование одних единиц в другие. Например:
<<Miscellaneous`Units`
Convert[12 Meter/Second, Mile/Hour]
26. 8432 Mile / Hour
Convert[3 Kilo Meter / Hour, Inch / Minute]
1968. 5 Inch / Minute
Для преобразования температуры служит функция ConvertTemperature [temp, oldutits, newunits], производящая преобразование температуры из одних единиц в другие. Возможные единицы измерения температуры следующие: Celsius (шкала Цельсия), Centigrade (то же самое), Fahrenheit (шкала Фаренгейта), Kelvin (шкала Кельвина) и Rankine (шкала Ренкина).
Пример преобразования температуры:
ConvertTemperature[20, Fahrenheit, Centigrade]
-6.66667
Наконец, имеются три широкопрофильные функции преобразования в различные системы единиц:
Пример преобразования дан ниже:
SI[3 Atmosphere]
303975. Pascal
?Pascal
Pascal is the derived SI unit of pressure.
Помимо возможности задания физических констант в пакете расширения Miscellaneous системы Mathematica 4 имеются три дополнительных подпакета: Standard-Atmosphere (данные об атмосфере), ResonanceAbsorptionLines (построение резонансных линий поглощения) и BlackBodyRadiation (излучение абсолютно черного тела).
Ввиду узкой направленности входящих в них функций эти подпакеты подробно не описываются. С ними несложно познакомиться по справочной базе данных системы Mathematica 4 (раздел Add-ons).
Данные о химических элементах — ChemicalElements
В подпакете ChemicalElements имеется ряд функций, позволяющих выявить свойства химических элементов. Начнем с функции без параметров Elements, выводящей список всех химических элементов (он полезен для знакомства с англоязычными наименованиями элементов):
<<Miscellaneous` ChemicalElements`
Elements
{Hydrogen, Helium, Lithium, Beryllium, Boron, Carbon, Nitrogen, Oxygen, Fluorine, Neon, Sodium, Magnesium, Aluminium, Silicon, Phosphorus, Sulfur, Chlorine, Argon, Potassium, Calcium, Scandium, Titanium, Vanadium, Chromium, Manganese, Iron, Cobalt, Nickel, Copper, Zinc, Gallium, Germanium, Arsenic, Selenium, Bromine, Krypton, Rubidium, Strontium, Yttrium, Zirconium, Niobium, Molybdenum', Technetium, Ruthenium, Rhodium, Palladium, Silver, Cadmium, Indium, Tin, Antimony, Tellurium, Iodine, Xenon, Caesium, Barium, Lanthanum, Cerium, Praseodymium, Neodymium, Promethium, Samarium, Europium, Gadolinium, Terbium, Dysprosium, Holmium, Erbium, Thulium, Ytterbium, Lutetium, Hafnium, Tantalum, Tungsten, Rhenium, Osmium, Iridium, Platinum, Gold, Mercury, Thallium, Lead, Bismuth, Polonium, Astatine, Radon, Francium, Radium, Actinium, Thorium, Protactinium, Uranium, Neptunium, Plutonium, Americium, Curium, Berkelium, Californium, Einsteinium, Fermium, Mendelevium, Nobelium, Lawrencium, Rutherfofdium, Dubnium, Seaborgium, Bohrium, Hassium, Meitnerium, Ununnilium, Unununium, Ununbium}
Для выявления свойств элементов служат следующие функции:
Stablelsotopes [element] — возвращает список стабильных изотопов элемента.
<<Miscellaneous`ChemicalElements`
Abbreviation[Wolfram]
W
AtomicNumber[Wolfram]
74
AtomicWeight[Wolfram]
183.85
Stablelsotopes[Wolfram]
{180, 182, 183, 184, 186}
Off[AtomicWeight::unstable]
Рисунок 13.12 графически показывает отношение атомного веса к атомному номеру для разных элементов.
Рис. 13.12. График отношения атомного веса к атомному номеру химических элементов
Полезны также функции, возвращающие значения величин, определяющих физические свойства элементов:
Используемая в размерных значениях этих функций величина «моль» является мерой количества вещества, численно равной 6.0221367х10 23 молекул вещества. Определим свойства элемента — вольфрама (чувствуете намек на фамилию создателя системы Mathematica?):
MeltingPoint[Wolfram]
3680. Kelvin
BoilingPoint[Wolfram]
5930.Kelvin
HeatOfFusion[Wolfram]
35.2 Joule Kilo/Mole
HeatOfVaporization[Wolfram]
824.2 Joule Kilo / Mole
Density[Wolfram]
19300. Kilogram / Meter3
ThermalConductivity[Wolfram]
174. Watt /Kelvin Meter
ElectronConfiguration[Wolfram]
{{2}, {2, 6}, {2, 6, 10}, {2, 6, 10, 14}, {2, 6, 4}, {2}}
ElectronConfigurationFormat[Wolfram]
1s2 2s22p6 3s23p63d10 4s24p64d104f14 5s25p65d4 6s2
Вольфрам — один из самых тугоплавких элементов в природе. Недаром из него делают нити для ламп накаливания.
Задание данных только вещественного типа — RealOnly
В ряде случаев (как при вычислениях, так и при построении графиков) Mathematica сообщает о наличии у функций особых значений. Это хорошо иллюстрирует рис. 13.13, на котором предпринята попытка построения графика, казалось бы, простой функции х^ (1/3). Нетрудно заметить, что график в отрицательной области значений х не построен и перед построением неполного графика выдан целый букет предупреждающих сообщений.
Причина этой частичной неудачи в том, что в некоторых точках данная функция дает комплексные значения. Например:
(-8.0) ^ (1/3)
1. + 1.732051
Подпакет ReaLOnly не вводит никаких новых функций. Он просто превращает данные последующих вычислений в чисто вещественные. Так что после его загрузки построение графика указанной функции проходит без каких-либо проблем (рис. 13.14).
Рис. 13.13. Попытка построения графика функции х^(1/3)
Рис. 13.14. Построение графика функции х^(1/3) после загрузки подпа.кета RealOnly
Разумеется, подобное свойство нужно далеко не всегда и при неумелом его применении способно привести к ошибочным результатам. Тем не менее, есть случаи (см. приведенный пример), когда оно полезно.
Пакет расширения с утилитами— Utilities
Утилитами принято называть небольшие программы, в основном вспомогательного назначения. Они предназначены чаще всего для работы с файлами и памятью компьютера. Ряд таких утилит включен в пакет расширения Utilities, знакомству с которым и посвящен данный небольшой раздел.
Работа с бинарными файлами — BinaryFiles
В подпакете BinaryFiles имеются типовые функции для работы с бинарными файлами:
Функции
ReadListBinary[filename,type]
ReadListBinary[stream,type, n]
ReadListBinary[stream,type]
оперируют с данными в виде списков, а функция WriteBinary [stream, data] записывает данные в поток в бинарной форме. Примеры применения этих функций представлены ниже:
<< Utilities`BinaryFiles`
data = N[Table[10^n, {n, -10, 10}]]
{l.x l10-10, 1.x 10-9, 1.x 10-8, 1.x 10-7, 1.x 10-6, 0.00001, 0.0001, 0.001, 0.01, 0.1, 1., 10., 100.-, 1000., 10000., 100000., 1.x 106, 1.x 107, 1.x 108, 1.x 109, 1.x 1010}
stream = OpenWriteBinary["binarytest"]
OutputStream["binarytest" , 4]
WriteBinary[stream, data]
Close[stream]
binarytest
ReadListBinary["binarytest", Double]
{1.х10-10, 1. xlO-9, 1. x10-8, 1.x 10-7, 1.x 10-6, 0.00001, 0.0001, 0.001, 0.01, 0.1, 1., 10., 100., 1000., 10000., 100000., 1.x 106, 1.x 107, l.xl08, 1.x 109, 1.x 1010}
ReadListBinary["binarytest", Signedlntl6, 5]
{15835, 31967,-9769, -16965, 15889}
Для конвертирования выражений ехрг в байтовый формат служат функции ТоBytes[expr] и ToBytes[expr, type].
Например:
ToBytes[-34.3421435]
{192, 65, 43, 203, 91, 128, 0, 0}
ToBytes[-34.3421435, CString]
{45, 51, 52, 46, 51, 52, 50, 49, 52, 51, 53, 0}
Запись графических объектов в файл формата DXF
В широко распространенных графических системах AutoCAD используется формат файлов DXF. Подпакет DXF позволяет записывать графические объекты Mathematica в этом формате с помощью функции WriteDXF["filename", graphics].
Здесь filename — имя файла, a graphics — имя предварительно созданного графического объекта. Применение данной функции вполне очевидно.
Фильтрация опций — FilterOptions
В ряде случаев возникает необходимость в передаче опций из одной функции в другую. При этом передавать нужно не- все опции, а только те из них, которые имеют смысл для вызываемой функции. В подпакете FilterOptions имеется функция, позволяющая фильтровать опции:
Риc. 13.15. Пример применения подпакета FilterOptions
Рисунок 13.15 поясняет применение опции фильтрации для создания графической функции Plotlntegrate, строящей график интеграла от заданной функции. Показан также пример построения графика интеграла от функции Cos [x] в интервале от 0 до 2п. Как и следовало ожидать, график функции очень близок к синусоиде.
Вы можете опробовать действие этой графической функции и на других примерах (желательно, чтобы интегрируемая функция не имела особенностей в пределах области построения графика).
Уплотнение памяти — MemoryConserve
Подпакет MemoryConserve в дополнение к имеющейся в ядре функции освобождения памяти Share [ ] содержит две директивы управления памятью:
<<Utilities 'MemoryConserve' $MemoryIncrement
100000
ТаЫе[ ToString[0], {2^15} ] ;
Length[ % ]
MemoryConserve::start : Running Share[] to conserve memory. MemoryConserve::end : Finished running Share[];
929200 bytes of memory freed.
32768
Off[ MemoryConserve ]
On[ MemoryConserve ]
Данная утилита полезна лишь при использовании системы Mathematica на компьютерах с малым объемом оперативной памяти.
Работа с пакетами расширений — Package
В подпакете Package имеется несколько функций, полезных при работе с пакетами расширения:
Примеры работы с этими функциями:
<<Utilities' Package'
FindPackages[$Path, "*ca"]
{{}, {}, {}, {DiscreteMath'Combinatorica'}, {}}
FindPackages[$Path, "*ca",
FullPath -> True]
{{},(},{},
{/usr/local/mathematica/AddOns/StandardPackages/ DiscreteMath/Combinatorica.m}, {}}
Annotation["Utilities' Package'"]
{Title, Context, Author, Summary, Package Version, Mathematica Version, Copyright, History, Keywords, Limitations, Discussion}
Annotation["Utilities'Package'", "Mathematica Version"]
{(* :Mathematica Version: 4.0 *)}
Показ времени операций — ShowTime
В подпакете ShowTime собраны средства для осуществления контроля за временем выполнения различных операций:
Следующие примеры иллюстрируют применение этих средств:
<<Utilities'ShowTime'
NIntegrate[x Exp[-x] Sin[x], {x, 0, Infinity}]
0.05 Second
0.5
Off[ShowTime]
0. Second
ShowTime[Sum[1/n, {n, I, 999}]];
0.11 Second
Контроль за временем исполнения операций — важная часть отладки высокоэффективных программ и программных модулей.
Обратите внимание на то, что время исполнения использованных в примерах выражений относится к компьютеру, на котором примеры выполнялись (Pentium II 350 МГц). Для других компьютеров результаты хронометража будут другими.
В этом уроке мы научились: