Построение семейства кривых в Mathcad

В.Очков

Функции двух независимых аргументов (переменных) f(x, y) в среде математических пакетов и, в частности, в среде Mathcad можно отображать средствами трехмерной графики – поверхностями. Но в справочной литературе трехмерные графики используются редко. С трехмерными графиками, спроецированными на плоскость страницы справочника, трудно работать – наблюдать зависимости, оценивать значения и т.д. Кроме того, отображаемые функциональные зависимости могут иметь более двух аргументов. Функции же двух аргументов в справочной литературе, как правило, отображаются семейством кривых, на которых четко видимы те или иные зависимости (наклон кривых, например, минимумы и максимумы и др.) и по которым при необходимости можно провести оценку значения самой функции в той или иной точке – по оси ординат отложить значение первого аргумента, мысленно или даже карандашом провести недостающую кривую (второй аргумент) и считать ответ у оси У.

В среде Mathcad на одном декартовом графике (X-Y Plot) можно построить до 16 (Mathcad 11 и ниже) или до 32 (Mathcad 12[1] и выше) кривых. На рис. 1 показано, как строятся такие кривые: один (первый) аргумент – функции y является формальным параметром (x) и продублирован на оси ординат, а второй аргумент – это константа либо явно прописанная (0.1, 0.5 и 10), либо заданная через переменную (e). Можно отметить следующие недостатки данного способа построения семейства кривых:

1. Число выводимых на график кривых задается явно через форматирование самого графика – изменение списка функций оси абсцисс. Но это действие заблокировано при открытии Mathcad-документа через MAS.

2. Число кривых на графике не может быть больше 16 (32 – см. выше).

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

Другая (альтернативная) технология построения семейства кривых, которая будет описана ниже, основана на генерации двух векторов y(x)[2] и x, хранящих координаты кривых.

На рис. 2 показано, как пользователь вводит в текстовое окошко функцию двух аргументов[3], далее в другом текстовом окошке списком через запятую указывает, при каких значениях переменной а должны быть построены кривые семейства в диапазоне изменения первого аргумента х от х1 до х2. Тут могут быть и не текстовые окошки, а простые операторы присваивания (задания) функции у(х, а), вектора а и констант х1 и х2. Если же задействованы текстовые окошки (документ готовится к публикации в Сети по технологии Mathcad Application Server) то в ход идет функция типа Str2Math, переводящая текст (Str) в математическую (Math) конструкцию – функцию пользователя, вектор, скаляр…

На рис. 3 показаны операторы, скрытые на рис. 2. Они формируют с помощью двух циклов с параметром два вектора х и у(х), описанные выше. В первом (внешнем) цикле ведется перебор вектора а, а во втором (вложенном в первый) – значений х, заданных диапазоном х12 и числом точек в нем (n). При этом перебор значений х во вложенном цикле ведется по разному в зависимости от номера кривой в семействе: от х1 к х2 при четных значениях номера кривой и в обратном направлении (от х2 к х1) – при нечетных значениях. Эта «маленькая хитрость» позволяет соединить точки на графиках линиями так, чтобы сам график не перечеркивался диагональными прямыми линиями, соединяющими последнюю точку предыдущей кривой с первой точкой последующей (см. рис. 3a). На нашем графике (рис. 2) эти линии стали горизонтальными и невидимыми за счет наложения на рамку графика. Другой (традиционный) способ делать невидимыми соединительные диагональные линии – это увеличение числа точек (переменная n на рис. 3) и форматирование графика не линиями, как это сделано на рис. 2, а точками, сливающимися в линию, если сама функция у(х, а) меняется от х не слишком резко (см. рис. 3b). Чего не скажешь о нашем случае (рис. 2), когда строится зависимость энтальпии воды и водяного пара от давления при разных значениях температуры (семейство изотерм), где в докритической области функция wspHPT скачком меняется от области пара на линии насыщения к области воды на линии насыщения через область влажного пара.

Еще одна особенность программы, показанной на рис. 3. Векторы у(х) и х заполняются в отдельных циклах forfor , хотя, казалось бы, в целях ускорения работы программы эту операцию нужно делать в одном цикле. Но дело тут в том, что эти два вектора могут быть и размерными (наш случай – см. рис. 2, где аргумент х имеет размерность давления, а сама функция у(х, а) – удельной энтальпии). Mathcad-программа не может возвратить два вектора или два скаляра с разной размерностью. Поэтому-то эти два вектора приходится формировать сепаратно.

Кстати о размерности. На рис. 2 значение удельной энтальпии в заданной (введенной) точке (р=200 atm и t=800 K) выдано не в kJ/kg, а … m2/s2, т.е. упрощено до предела – отформатировано соответствующим образом. Это связано с тем, что тут могут выдаваться различные значения с разными единицами измерения в зависимости от вида введенной функции в первом текстовом окне на рис. 2. Из-за этого нельзя заранее подставить нужные («жесткие) единицы измерения в последний операнд оператора вывода численного значения = , предназначенного для корректировки единиц измерения выводимой величины. Кстати, подобное не вполне законное (логичное) упрощение единиц мы и сами часто делаем, не замечая этого. Пример, единицей теплопроводности должна быть вот такая единица – W m/(m2 K), а не W/(m K). Метры тут сокращать нельзя, так как ими измеряются разные величины – длина (m) и площадь (m2). Если единицу удельной энтальпии не упрощать, то пакет Mathcad выдаст… Sv (см. рис. 3c) – единицу эффективной дозы зиверт), что тоже «мимо цели». Решением тут может быть такое – выдавать числа без единиц, а сами единицы вводить в отдельных текстовых окошках (см. рис. 3d).

На рис. 4 показано, как можно у семейства кривых поменять переменную у оси x и построить уже не семейство изотерм, а семейство изобар.

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

Описанная технология была применена в проекте http://twt.mpei.ac.ru/ochkov/WSPHB/index.html.

Возвращаясь к началу статьи – к сопоставлению поверхности и семейства кривых, можно отметить, что в среде Mathcad несложно построить и поверхности – см. рис. 5, наложив на нее «семейство кривых». Но, повторяем, поверхности хороши для образовательных или рекламных целей, а не для практической работы. Так поверхность изменения изобарной теплоемкости воды и водяного пара от давления и температуры (см. рис. 6) послужила… эмблемой пакета WaterSteamPro (см. www.wsp.ru).



[1] В среде Mathcad 12 и выше появилась вторая ось Х, с помощью которой при необходимости можно удвоить число кривых на графике.

[2] Это не функция у от х, а переменная с именем у(х), которая в среде Mathcad создается через аккорд Ctrl-Shift-k, глушащего ввод спецсимволов ”(“ , “)”  и др. Можно, конечно, данному вектору дать и более традиционное (простое) имя – y, например. Но имя у(х) более информативно.

[3] У нас тут задействована функция wspHPT из пакета WaterSteamPro (www.wsp.ru), возвращающая энтальпию (H) воды или водяного пара в зависимости от давления (Р) и температуры (Т – см. комментарий, который можно ввести в текстовое окошко после точки с запятой). Но тут может быть любая другая функция или выражение с переменными х и а.