- Ко Дню Святого Валентина
- ТЮЗ остается в Макеевке
- С Новым годом
- Гуманитарная помощь
- Театральные встречи
- Открылся 44 театральный сезон!!!
- Для льготников!
- Положення про фестиваль
- ТЮЗ - 2007
- ТЮЗ - 2009
- Сведения об участниках фестиваля ТЮЗ-2009
- ТЮЗ-2011
- ПРОГРАМА Третього відкритого фестивалю театрів для дітей та юнацтва «ТЮГ-2011»
- Итоги Третьего открытого фестиваля театров для детей и юношества ТЮЗ-2011
- Пресс-релиз IV Открытого фестиваля театров для детей июношества «ТЮЗ – 2013».
- Итоги IV открытого фестиваля театров для детей и юношества «ТЮЗ – 2013»
Наш бизнес-сообщник artMisto.net
Обмовимося відразу, що матеріал цієї глави призначений для користувачів Mathcad, що мають певний досвід роботи з пакетом
Недокументовані символьної математики Mathcad / Maple
(Коробов В., Сясев А. - додаток 2 до п'ятого тому довідника >>>>>>> )
П2.1. Вуздечка і кінь. 1
П2.2. Відкриваємо ящик Пандори .. 2
П2.3. Недокументированная матрична алгебра в Mathcad. 13
П2.4. Інтерпретатор команд Maple. 15
П 2.1. Вуздечка і кінь
Обмовимося відразу, що матеріал цієї глави призначений для користувачів, які вже мають певний досвід роботи з пакетом. Решту просять не турбуватися, у всякому разі, не слід починати працювати з книгою саме з цієї глави. Йтиметься про недокументованих можливостях пакета Mathcad.
Як вже говорилося, символьні обчислення в середовищі Mathcad стали можливими після того, як розробники впровадили в неї символьне ядро системи Maple і цивілізовано узаконили це впровадження, про що можна дізнатися з закладки командного меню Help | About Mathcad (рис. П 2.1). Крім цього, на рис. П 2.1 приведена кілька незвичайна символьний конструкція kernelopts (version), яка повертає повідомлення про те, з якої саме версії пакету Maple був запозичений символьний процесор. Ніяких відомостей про функції kernelopts в керівництві користувача не міститься, проте, як бачимо, вона з успіхом працює в середовищі Mathcad. Природна цікавість підказує, чи не спробувати в середовищі Mathcad застосувати інші «чисто мейпловскіе» команди і функції. Сучасні версії Maple налічують, як відомо, більше трьох тисяч вбудованих функцій, в той час як кількість вбудованих функцій Mathcad не перевищує півтори сотні. Ось і виникає спокуса розширити діапазон застосовності системи Mathcad.
Мал. П 2.1. Інформація про вбудований в Mathcad символьному ядрі Maple
Потрібно сказати, що питання про допустимість використання недокументованих прийомів вельми спірне. Прихильники концепції так званого «культурного програмування» вважають, що недокументованими прийомами користуватися не можна категорично - ні в будь-яких пакетах, ні в програмуванні взагалі. Наприклад, такої думки дотримуються багато авторів книг комп'ютерної тематики. Інші займають кілька більш м'яку позицію. До них відносяться, в тому числі і розробники системи Mathcad. Користуватися недокументованими прийомами вони не забороняють, але і не рекомендують їх, пояснюючи відсутність рекомендацій тим, що гарантій належного функціонування тієї чи іншої недокументованою команди, процедури або функції вони не дають, оскільки їх робота не тестувалася. Деякі функції, які народилися в системі Maple, при переході до нових версій стають документально оформлених. Наприклад, в Mathcad 12 знайшла офіційний статус функція time (), яка перебувала до цього на напівлегальному становищі. Між іншим, прийом використання тандему операторів `: =` і `→` досі залишається недокументованим, незважаючи на те, що він придбав значну популярність у користувачів. Цей «тандем» операторів в 13-й версії Mathcad став давати збої. Багато недокументовані функції, успішно працювали в попередніх версіях, частково «заглушуються» розробниками в версіях наступних. Можливо, це робиться з міркувань оптимізації обсягу ядра, але не виключені і якісь інші причини: «Фірма Mathsoft купила у фірми Waterloo Maple ( http://www.waterloomaple.com ) Вуздечку. Прийшла додому, глядь - а до вуздечки прив'язана кінь ». У 12-й і 13-й версіях кінь повернули господареві з вибаченнями. А ось версія Mathcad 11 залишилася таким собі симбіозом коні у вигляді символьного ядра Maple з трепетною ланню в особі Mathcad. І хоча відома приказка говорить, що заперечує цих представників фауни в одну упряжку вельми проблематично, проте, Mathcad 11 можна назвати на сьогоднішній день версією з потенційно найбільш великим арсеналом для проведення аналітичних обчислень серед всіх інших версій.
Недокументовані прийоми не рекомендується застосовувати і тому, що наслідки такого застосування можуть бути непередбачуваними. Перш за все, це відноситься до правильності отриманих результатів розрахунку. Можливо також і «зависання» комп'ютера, і раптове без жодного попередження закриття програми без збереження інформації.
Отже, слід пам'ятати, що спроба застосувати недокументовану функцію або прийом може бути чревата неприємностями. Звичайно, ці неприємності не такі вже серйозні, як ті, що згідно з міфологією принесла світу колись Пандора, що відкрила ящик (за іншими джерелами - посудина), який відкривати не слід, але певні аналогії напрошуються.
П 2.2. Відкриваємо ящик Пандори
Ті, хто працював з системою Maple, добре знають, що вона призначена головним чином для проведення аналітичних (символьних, символічних) обчислень. Якщо користувачеві необхідні виключно обчислення цього роду, то йому, природно, краще працювати з цією системою. На сьогоднішній день Maple вважається однією з кращих систем комп'ютерної алгебри. Але як бути користувачеві Mathcad, якщо в його роботі поряд з чисельними розрахунками все ж значне місце займають символьні перетворення? Особливо це стосується випадків, коли створюються документи Mathcad освітнього характеру. Одна справа, коли ведеться розрахунок з якоїсь готової формулою. Зовсім інша - коли потрібно показати, яким чином це рівняння виводиться, виходячи з фізичної картини досліджуваного процесу або явища. Ясно, що мати на комп'ютері дві системи - розкіш, яка більшості користувачів, м'яко кажучи, не по кишені. Це одна з причин, що пробуджує інтерес до розширеного використання символьного ядра Maple в середовищі пакету Mathcad.
До речі, проявляти цікавість до недокументованим прийомам підштовхують користувача самі розробники. На рис. П 2.1 a наведені деякі приклади символьних обчислень, проведених в середовищі Mathcad 11. Вихідні конструкції для всіх прикладів на ріс.П 2.2 задані цілком коректно, в повній відповідності з прийнятими в Mathcad правилами. Результат же обчислень є в достатній мірі несподіваним для користувача: як бачимо, у відповідях містяться конструкції Beta, EllipticF, EllipticPi, StruveL, Sum, RootOf, & where, про сенс яких можна тільки здогадуватися, оскільки ніяких відомостей на цей рахунок довідкова система Mathcad НЕ дає. Зате вичерпну відповідь щодо походження цих конструкцій знаходиться в help 'е пакета Maple.
Найпростіші недокументовані прийоми роботи в режимі символьних обчислень показані на рис. П 2.3. Як бачимо, до операцій диференціювання і взяття невизначеного інтеграла цілком можна застосувати синтаксис, прийнятий в Maple. Крім того, на рис. П 2.3 можна побачити і деякі абсолютно чужі в Mathcad команди, проте, успішно працюють в середовищі пакета. Виявляється, можна працювати окремо з чисельником і знаменником вираження (команди denom, numer), звертатися до конкретного операнду вираження (команда op), дізнатися число операндів у виразі (nops).
До речі, на рис. П 2.3 прихована перша неприємність, яку навіть досвідчений користувач помітить не відразу. Звернемо увагу, що в результаті роботи команди op (f '(x)) був згенерований вектор з трьох елементів, отже, верхня двійка в цьому векторі з позицій мови Mathcad є нульовим елементом, оскільки за замовчуванням встановлено нульове значення системної змінної ORIGIN. Чужорідна ж команда op (1, f '(x)) вважає цю двійку не нульовий, а першим операндом вихідного вираження, адже в Maple за замовчуванням нумерація елементів масивів починається з одиниці, а не з нуля. Ця обставина обов'язково слід враховувати, якщо з яких-небудь причин потрібно недокументированная обробка масивів.
Популярна серед користувачів символьний команда simplify далеко не завжди видає результат в бажаної користувачеві формі. Здавалося б, логарифм твори на екрані виглядав би більш компактно, ніж сума логарифмів, проте, символьний редактор Mathcad / Maple саме останній варіант запису розглядає як максимально спрощений. З якихось причин розробники символьного ядра зробили так (а, може бути, щось зробили не так), що застосування команди simplify далеко не у всіх випадках призводить до найбільш короткою і лаконічною формою вираження. Іноді доводиться штучно підправляти результат, виробляючи «ручні» спрощення так, як це підказують навички, набуті на шкільних уроках алгебри. Особливо явно це проявляється при створенні різних документів освітнього характеру: хочеш отримати рівняння, яке за формою збігається з наведеним у підручнику, але не тут-то було. Виявляється, дуже хорошим помічником в цій справі може виступити недокументированная функція combine. На рис. П 2.4 проведено порівняння результатів роботи цієї функції з документованим прийомом спрощення через simplify. Потрібно визнати, що таке порівняння явно не на користь simplify: одержувані за допомогою combine конструкції мають більш компактний і закінчений вигляд. При роботі з combine користувачеві необхідно вказувати додаткові опції в залежності від типу вихідного вираження: опції atan, trig дозволяють символьному ядру в повній мірі проявити свої знання тригонометрії, опція power дозволяє швидко розібратися з показниками ступенів для однієї змінної. А ось для того, щоб «зібрати» всі логарифми вираження під єдиний логарифм, необхідно вказати разом з опцією ln додаткову характеристику symbolic.
Мал. П 2.2. Приклади незвичайних результатів роботи символьного редактора Mathcad
Мал. П 2.3. Найпростіші приклади недокументованих прийомів роботи в режимі символьних обчислень
Мал. П 2.4. Недокументированная команда combine
Конкретна користь команди combine видно з рис. П 2.5, який містить рішення двох завдань з області хімічної кінетики. У першій частині документа засобами символьного редактора виводиться кінетичне рівняння для автокаталитической реакції на основі її математичної моделі, представленої у вигляді досить простого диференціального рівняння із перемінними при заданих початкових умовах. Традиційне рішення дає правильний, але дуже вже громіздкий результат. Дворазове застосування команди combine дозволяє істотно «причесати» інтегральну форму кінетичного рівняння. Другий фрагмент документа на рис. П 2.5 взагалі може здатися дивним. З точки зору синтаксису Mathcad таке безладне застосування операторів локального привласнення неприпустимо, і система реагує на таке свавілля користувача тим, що «запалює» червоний колір в відповідних конструкціях. Але мета такого підходу полягає в тому, що, як не дивно, саме оператори присвоювання чисельного значення допомагають «запам'ятати» результати проміжних символьних розрахунків і використовувати їх в наступних конструкціях. В даному випадку недокументований Mathcad дозволяє зрозуміти, що узагальнене кінетичне рівняння для реакції порядку n справедливо і для реакції першого порядку. Для цього необхідно розкрити невизначеність за правилом Лопіталя. Розкриття невизначеності також проведено недокументованим прийомом, заснованому на зверненні до чисельника і знаменника дробу. До сих пір залишається незрозумілим, чому функцій denom і numer розробники не надали статус документованих.
Мабуть, в найбільшому розмаїтті проявляє себе Maple -функція convert, призначена для конвертації символьних виразів в ту чи іншу форму, обрану користувачем. До речі, англо-російський політехнічний словник переводить слово convert як: а) перетворювати; перетворювати; переводити (одиниці, заходи); 2) переобладнати, переробляти. У «традиційному» Mathcad функція ця начебто знаходиться на цілком легальному положенні, про що говорить, наприклад, ріс.П 2.6. Насправді в Mathcad узаконено тільки застосування цієї функції лише з єдиною опцією - parfrac. Maple, проте, надає цілий сонм опцій для функції convert, і недокументоване використання цієї функції повною мірою дає уявлення про її мощі.
Почнемо з розмірностей. Користувач системи M а thcad навіть не підозрює про те, що крім вбудованих одиниць виміру вона має і приховані розмірності, що проявляють себе тільки в тому випадку, якщо намагатися достукатися до символьного ядра недокументованими засобами. Однією з багатьох опцій функції convert є опція metric, що дозволяє перетворювати багато одиниці вимірювань в точній відповідності з перекладом, який дає англо-російський словник (рис. П 2.7). У метричну систему функція convert переводить більше 50 одиниць вимірювання, серед яких, в основному, одиниці маси, довжини та об'єму. Користувач Mathcad, не вдаючись до послуг Maple, може, зокрема, отримати уявлення про те, що собою являє бушель (bu, bushel, bushels) і ніж, наприклад, американська (US) пінта (pint, pints) відрізняється від пінти британської ( imp). Також можна з'ясувати, яку відстань проходить світло за рік (light _ year) і т.д. Звернемо увагу, що всі наведені імена одиниць розмірності, зазначені в тілі функції convert першими, які не зарезервовані в Mathcad. При чисельних розрахунках система Mathcad діагностує їх як змінні, які не визначені.
У версіях Mathcad 2000, 2001, 2001i, 11 цілком доступні операції уявлення вираження expr в формі form за допомогою символьного конструкції (option - додаткові опції)
convert (expr, form, option) →
Мал. П 2.8 в повній мірі дає уявлення про можливості символьного функції convert: користувач може заздалегідь для себе вибрати саме ту форму подання символьної конструкції, яка для нього більш зручна і звична, а не покладатися цілком тільки на дозволені документацією можливості редактора символьних перетворень. Тут і різні форми подання одних спеціальних функцій через інші, і уявлення чисел в різних системах числення, а також безліч інших способів конвертації виразів, недоступних в традиційному документированном Mathcad.
На форумі користувачів Mathcad ( http://forum.exponenta.ru/viewforum.php?f=1 ) Один раз було поставлено питання про те, яким чином можна перетворити матрицю в вектор. Було запропоновано кілька варіантів відповіді, кожен з яких передбачав формування програмного блоку. Подібний приклад можна знайти і в центрі ресурсів пакета Mathcad (відповідна програма наведена на рис. П 2.9), хоча операцію перетворення матриці М в вектор-стовпець набагато простіше провести за допомогою недокументовані функції convert (M, vector).
Вважається, що Mathcad не має коштів символьного рішення диференціальних рівнянь і систем диференціальних рівнянь. Це дійсно так, якщо не брати до уваги можливість аналітичного рішення рівнянь із перемінними (тільки користувач зобов'язаний попередньо розділити ці змінні). Крім того, можна вирішувати лінійні диференціальні рівняння, а також системи лінійних ОДУ за допомогою документованих символьних функцій laplace, invlaplace. Ці функції реалізують спеціальний математичний апарат перетворення Лапласа, що дозволяє із застосуванням певних прийомів звести диференціальне рівняння або систему ОДУ до рівнянню алгебри або системи алгебраїчних рівнянь. Далі модифіковане рівняння або система вирішується традиційними засобами (функція solve або за допомогою вирішального блоку GIVEN ... FIND). При цьому приходять до так званого операторному рішенням. Операторний рішення грає суто допоміжну роль і підлягає подальшому конвертації в рішення сьогодення, остаточне, згідно з правилами зворотної Лаплас-трансформації. Саме ці положення реалізує документ, наведений на рис. П 2.10. За великим рахунком, його вже важко назвати документом Mathcad, оскільки в ньому поряд з традиційними прийомами реалізовані і недокументовані можливості інтегральних перетворень. Завдання, наведена на рис П 2.10, також відноситься до галузі хімічної кінетики і присвячена аналітичному рішенню системи звичайних диференціальних рівнянь, яка є математичною моделлю послідовності двох необоротних реакцій першого порядку. Звернемо увагу, що в наведеному документі функція laplace, на перший погляд, застосована взагалі поза відповідності синтаксису Mathcad. Проте, документ цілком працездатний в версії Mathcad 11.
Мал. П 2.5. Недокументоване рішення двох завдань хімічної кінетики
Ріс.П 2.6. Ключове слово parfrac як одна з опцій функції convert
Мал. П 2.7. Робота функції convert з опцією metric
Мал. П 2.П2. Недокументоване використання функції convert
Мал. П 2.8а (продовження)
Мал. П 2.8. (Продовження)
Мал. П 2.9. Недокументоване конвертування матриці в вектор
Мал. П 2.10. Недокументоване символьний розв'язок системи диференціальних рівнянь
Противники недокументованіх прійомів будут активно заперечуваті проти такого варварськи в Певної СЕНСІ документа, Який поміщеній на рис. П 2.10. Много в чому смороду будут праві, хоча б тому, что наведень в такому варіанті документ якійсь мірі Втрата свою універсальність: Він буде коректно працювати только в версіях Mathcad 2000 - 11. З цієї причини не зайве подібні документи супроводжуваті остерігатіся Коментар типу «Міністерство охорони здоров 'я попереджає, что зловжівання недокументованімі засоби ... і т.д. ». Звичайно, правильніше було б шукати в будь-якій задачі документовані шляхи вирішення. Немає відповідної вбудованої функції - пишемо відповідний програмний блок. Але в тому-то і справа, що основним привабливим ознакою системи Mathcad є її демократичність в тому сенсі, що Mathcad спочатку не вимагає від користувача будь-яких глибоких знань в області програмування. Багато користувачів не мають таких знань і навичок і, строго кажучи, не зобов'язані їх мати в силу своєї основної професійної діяльності. Не секрет, що основна маса користувачів - це не програмісти. Професійні програмісти навряд чи будуть використовувати в своїй діяльності Mathcad, коли є куди більш потужні програмні середовища. Ті ж, хто використовує пакет Mathcad на проміжному етапі вирішення конкретної прикладної задачі, можуть зіткнутися з ситуацією, коли саме на цій стадії вихідна задача переходить з площини конкретної галузі знань в область програмування, та так, що користувач на досить довгий час відволікається від кінцевої мети . Зрештою, призначення будь-якого математичного пакета - полегшити життя користувачу. Нехай, наприклад, в ході рішення будь-якої задачі, будь то з області фізики, хімії, геології або іншої дисципліни виникла епізодична проблема - а чи є число, ну, скажімо, 12371, простим? Підкреслимо, що проблема саме епізодична, але без її дозволу неможливі подальші міркування. Як бути? Почати займатися написанням спеціальної допоміжної програми, метою якої буде з'ясування дрібної деталі в ланцюзі рішення більш глобального завдання? Можна, звичайно, витратити деякий час на складання такої програми, а потім шкодувати про те, що цей час було витрачено даремно, дізнавшись, що в символьному ядрі вже давно дрімає готова процедура, призначена для діагностики простих чисел. Наступний недокументований прийом показує, що число 12371 не є простим:
isprime (12371) → false
До речі, багато недокументовані функції успішно працюють і на Mathcad Application Server. На рис. П 2.11 показаний WebSheet (http://twt.mpei.ac.ru/MAS/Worksheets/prime.mcd), що демонструє роботу недокументованих функцій isprime, prevprime, nextprime.
Мал. П 2.11. Недокументовані функції на сервері MAS
П 2.3. Недокументированная матрична алгебра в Mathcad
Система Maple має потужний арсенал процедур і функцій для роботи з векторами і матрицями, Можливість використання цих функцій з'являється при завантаженні бібліотеки linalg (рис. П 2.12). Користувач легко може переконатися в тому, що переважна більшість з наведеного на рис. П 2.12 списку функцій цілком комфортно почувають себе в середовищі Mathcad 11. Але одночасно він повинен вирішити для себе, чи потрібні вони йому в такій кількості. Деякі з них вже мають законну прописку в Mathcad (augment, cholesky, diag, rank, eigenvals, rref, matrix і т.д.), деякі мають своїх Mathcad-аналог і оформлені у вигляді спеціальних елементів інтерфейсу (det, inverse, transpose) . Деякі функції мають різні імена в обох середовищах, але працюють при символьних обчисленнях абсолютно однаково (наприклад, навряд чи є необхідність при вирішенні систем лінійних рівнянь функцію lsolve замінювати недокументованою linsolve). Понад півсотні функцій не мають аналогів в Mathcad, але працюють в цьому середовищі, близько двох десятків - начебто на перший погляд непрацездатні, але додатковими хитрощами їм можна надати працездатність (див. Розділ П 2.5).
Не будемо втомлювати читача повним списком прикладів роботи недокументованих «векторно-матричних» функцій. Такий список можна подивитися на сайті http://twt.mpei.ac.ru/ochkov/Sovet_MC/086/Tip_86_eng.htm . Зауважимо при цьому, що багато хто з цих функцій можуть бути дуже корисними при буденній роботі з масивами (рис. П 2.13). Припустимо, що є матриця A, в якій всі елементи першого стовпчика (з 1) потрібно помножити на деяке число m, потім поелементно підсумувати стовпці c 1 і c 2 і, нарешті, в стовпець c 2 помістити отримані суми. Звичайно, все сказане можна без особливих зусиль реалізувати дозволеним, документованим інструментарієм, але виявляється, що всі ці операції одним махом може виконати недокументированная функція addcol (A, c 1, c 2, m). Приблизно таку ж модифікацію матриці А, але вже щодо рядків, виконує функцію addrow (A, c 1, c 2, m). Іноді користувачеві може знадобитися створення різних типів блокових матриць (BlockMatrix, JordanBlock), різного роду вставки однієї матриці в іншу (copyinto), зміна основної матриці шляхом одночасного додавання у неї певної кількості нових рядків і стовпців (extend), генерування матриць і векторів, елементами в яких є випадкові цілі числа (randmatrix, randvector) і т.д. Дійсно, чи варто відволікатися кожен раз на формування спеціальних матричних конструкцій документально оформлених засобами, якщо такі вже «дрімають» в надрах символьного ядра, і їх можна змусити працювати? Простіше мати окремий документ з прикладами роботи недокументованих функцій і звертатися до тих чи інших з них у міру потреби. Тут, правда, може проявити себе вже згадуваний ефект пандорина ящика: з символьного ядра-ящика вилазять всі нові і нові функції, від них уже рябить в очах. Більш того, одна і та ж функція може застосовуватися з різними додатковими опціями - згадаємо, хоча б вже розглянуту функцію convert. «Функції починають розповзатися, як таргани», якщо перефразувати відомого літературного героя, активно ганяти за стільцями вороб'яніновського тещі.
Мал. П 2.12. Команди функції Maple -бібліотеки linalg
Мал. П 2.13. Недокументированная робота з векторами і матрицями
П 2.4. Інтерпретатор команд Maple
Так які ж функції символьного ядра Maple «працюють» в середовищі Mathcad 11? Навряд чи можна відповісти на це питання. Відповіді на нього, напевно, не дадуть і самі розробники Mathcad. Одне можна сказати точно: якщо в Mathcad вбудовано ядро Maple V Release 4, то марно намагатися звертатися до тих функцій, які з'явилися в більш пізніх версіях пакета Maple. Але навіть ядро Maple V містить сотні функцій і команд. В основному це команди і функції стандартної бібліотеки, а також бібліотек лінійної алгебри (linalg) і інтегральних перетворень (inttrans).
Команда addressof (ім'я функції) дозволяє дізнатися, відведено чи в пам'яті комп'ютера певне місце для конкретної функції. Якщо в результаті виконання цієї команди повертається якесь чисельне значення, то дана функція присутня в символьному ядрі. В іншому випадку видається помилка «No symbolic result found», тобто шуканої функції в символьному ядрі просто-напросто немає, а, значить, намагатися її застосовувати не має сенсу. Користувача, який відчув смак до недокументованим прийомам, чекає велике розчарування, коли він дізнається про відсутність в надрах Mathcad / Maple найпотужнішого інструментарію для аналітичного рішення диференціальних рівнянь і систем в особі функції dsolve (рис. П 2.14). Треба визнати, що наявність саме цієї функції вельми істотно розширило б можливості пакета Mathcad 11. Втім, якщо команда addressof і повертає якесь число, то це аж ніяк не означає, що зазначена в її тілі функція буде виконуватися (див., Наприклад, безуспішну спробу застосування недокументованою функції piecewise на рис. П 2.14). Причин цьому дві: або функція «заглушена» розробниками, або доступ до неї суперечить синтаксису Mathcad. Так, при формуванні обчислювальних конструкцій Mathcad можна користуватися клавішею пробілу, оскільки така конструкція тут же перетвориться в текстовий коментар. Не можна також при недокументованою роботі вводити символи точки, «звичайного одно», квадратних і фігурних дужок і т.п. Всі ці символи, які є невід'ємним елементом багатьох конструкцій мови Maple, в Mathcad виконують зовсім іншу роль. З цієї причини, наприклад, недокументованими засобами не можна провести аналітичні обчислення певних інтегралів, меж, тобто не можна застосувати функції, завдання параметрів в тілі яких знаходиться в протиріччі з синтаксисом системи Mathcad. Цю проблему частково вирішує програмний блок, запропонований В.Н.Мезенцевим (рис. П 2.15). Ця допоміжна програма, по суті, є інтерпретатором команд Maple. Якщо її завантажити на початку документа Mathcad, то діапазон застосовності недокументованих функцій істотно розширюється. Головний «фокус» програми в тому, що символьна обчислювальна система є в вигляді змінної типу string, чим забезпечується відносне «примирення» синтаксисів Mathcad і Maple. Далі завдяки функції parse (також недокументованою) така конструкція стає «зрозумілою» для виконання символьних редактором.
Мал. П 2.14. команда addressof
Мал. П 2.15. Програмний блок - інтерпретатор команд Maple
Вже говорилося про те, що документи Mathcad можуть з успіхом використовуватися сферою освіти. Подивимося, наприклад, як за допомогою допоміжної програми, показаної на рис. П 2.15, можна наочно продемонструвати, що з собою являє сплайн-функція як сукупність спеціальним чином побудованих многочленів. У документі на рис. П 2.16 використані можливості недокументованою функції spline c різними можливими опціями (linear, quadratic, cubic, quartic), що вказують на обрану ступінь многочленів при інтерполяції сплайном. Результатом символьних обчислень є конкретні вирази для різних поліномів для всіх інтервалів між вузлами інтерполяції.
Ріс.П 2.16. Проведення сплайн-апроксимації через недокументовану функцію spline
У наборі вбудованих засобів Mathcad для чисельного розв'язання жорстких диференціальних рівнянь і систем є функції Stiffb, Stiffr (див. Розділ 5). Певні незручності, а то і серйозні труднощі при роботі з цими функціями виникають через необхідність формування матриці Якобі J (t, x) для функції-вектора f (t, x) правої частини (частин) диференціального рівняння (системи диференціальних рівнянь). Причина в тому, що аргументи t і x нерівнозначні, якщо так можна висловитися, за своїм змістом і синтаксису: t - ім'я незалежної змінної, а x - це ім'я вектора шуканих функцій, кожна з яких позначається відповідним індексом цього вектора. Символьне або чисельне обчислення матриці Якобі (якобіана) супроводжується операцією диференціювання як по незалежній змінній t, так і по змінним x0, x1 ... xn в залежності від загального числа інтегрованих функцій. Пакет Mathcad ж дуже болісно реагує на спробу користувача застосувати цю операцію до індексної змінної. Недосвідчений користувач дуже часто наштовхується на діагностичну помилку «The expression to the left on the equal sign can not be defined» і ... припиняє возитися з незрозумілим інтегратором типу Stiffb. Можливо, саме через це або в тому числі з-за цього версія Mathcad 2001i була поповнена новою функцією для вирішення жорстких систем Radau, відмінною рисою якої стало те, що в списку її параметрів був відсутній якобіан. Все ж колишні інтегратори були залишені, оскільки в деяких випадках вони дають більш точні результати розрахунку, ніж Radau (плата за простоту).
На рис. П 2.17 показаний спосіб формування якобіана для функції вектора правих частин жорсткої системи дистанційного керування. Документоване визначення, як бачимо, супроводжується необхідністю проміжної модифікації цього вектора, хоча він визначений в повній відповідності з синтаксисом системи Mathcad. Для цього ранжирування індекси у змінних прибираються. Далі пакету фактично доводиться розтлумачувати, що саме являє собою якобіан системи дистанційного керування та тільки після цього шуканим змінним знову даються їх споконвічно рідні імена. Такий порядок дій громіздкий і неуніверсален, оскільки стоїть змінити число елементів вихідного вектора правих частин СДУ, як знову доводиться починати все спочатку. З цієї точки зору більш лаконічним і виграшним виглядає недокументований прийом і використанням Maple -Функції jacobian з бібліотеки linalg. Символьний процесор в даному випадку абсолютно спокійно реагує на спробу диференціювання функції по змінній, що є елементом масиву. Єдиний елемент дискомфорту доставляє необхідність контролю числа відкритих і закритих дужок, оскільки в цій ситуації Mathcad відреагує на Дужковий дисбаланс не своїм звичайним «This expression hase a" ( "without") "», а просто відмахнеться від користувача повідомленням «No symbolic result was found », мовляв, всі питання до Maple і його символьному ядру.
Ріс.П 2.17. Розрахунок матриці Якобі для жорсткої системи ОДУ: порівняння Недокументовані і документованого прийомів
На закінчення наведемо ще один приклад ефективності застосування недокументованих прийомів. У задачі про гусей (див. Розділ 2.4) вже застосовувалася недокументированная функція isolve для пошуку цілочисельних коренів (нулів) рівняння. У той же час існують завдання, що вимагають цілочисельного рішення систем алгебраїчних рівнянь. Значну частину таких завдань складають завдання підбору коефіцієнтів в рівняннях хімічних реакцій. Кожен вивчав хімію в школі чи вузі стикався з такою ситуацією. Хіміки-професіонали, звичайно, ніколи не вдаються до послуг комп'ютера для того, щоб «зрівняти» реакцію. Вважається, що кожен поважаючий себе хімік повинен вміти це робити і без ПК. Для цього існує маса прийомів, які базуються на складанні електронного або електронно-іонного балансу. Більш того, важливим показником «хімічної» кваліфікації є вміння писати реакційну схему, виходячи тільки з сукупності реагуючих речовин, тобто вміння визначити, які саме продукти можуть утворюватися в ході того чи іншого взаємодії. Проте, існують схеми перетворень, підбір коефіцієнтів для яких перетворюється в дуже рутинне захід з великою ймовірністю помилки при ручних обчисленнях. Одним з найбільш екзотичних прикладів є окислення комплексної сполуки хрому перманганатом калію, яке в кислому середовищі протікає за схемою:
Дамо спокій уявлення про баланс іонів і електронів і спробуємо підібрати коефіцієнти до цієї реакції, виходячи лише з балансових співвідношень хімічних елементів, що входять до складу речовин-учасників процесу. Неважко побачити (рис. П 2.18), що такі балансові співвідношення утворюють систему рівнянь, кількість невідомих в якій в даному випадку рівно на одиницю більше, ніж кількість самих рівнянь. Отже, система має безліч рішень. Хімічним змістом відповідає набір ненульових цілочисельних значень a, b, c, d, e, f, g, k, і при цьому їх сума повинна бути мінімальною. Як бачимо, традиційне документоване застосування символьних обчислень з використанням блоку GIVEN / FIND, в общем-то, вирішує завдання, але потрібне рішення отримано кілька штучно: результат множиться на 10 і ділиться на a. Спроба ж чисельного рішення взагалі терпить фіаско: Mathcad намагається або підсунути нульові значення коефіцієнтів (що, між іншим, не позбавлене сенсу: якщо вихідних речовин не брати, то ніяких продуктів, зрозуміло, не отримаємо), або видає нецілочисельне рішення, та й то тільки після того, як у вирішальний блок вставлені відповідні нерівності-обмеження. Зате недокументований прийом з використанням функції isolve проявляє себе з найкращого боку. Ситуація значно ускладнюється, якщо намагатися вирішувати документовано систему рівнянь, в якій кількість невідомих перевищує кількість рівнянь на 2. У цьому випадку маємо «нескінченне число нескінченних наборів» цілочисельних коефіцієнтів і розібратися з потрібними рішеннями стає проблематично. Тим часом в хімії і така ситуація аж ніяк не рідкість. Прикладом може бути окислення перекису водню тим же перманганатом. Зацікавився читачеві пропонується самому переконатися в тому, що для цієї реакції справедливі, наприклад, такі набори коефіцієнтів:
2 KMnO4 + H2O2 + 3 H2SO4 → 2 MnSO4 + 3 O2 + K2SO4 + 4 H2O,
2 KMnO4 + 1443 H2O2 + 3 H2SO4 → 2 MnSO4 + 724 O2 + K2SO4 + 1 446 H2O;
2 KMnO4 + 200003 H2O2 + 3 H2SO4 → 2 MnSO4 + 100004 O2 + K2SO4 + 200006 H2O і т. д.
Мал. П 2.18. Застосування недокументованих се дств дл я розстановки коефіцієнтів
в рівнянні окисно-відновної реакції
Але як бути користувачеві Mathcad, якщо в його роботі поряд з чисельними розрахунками все ж значне місце займають символьні перетворення?Php?
Нехай, наприклад, в ході рішення будь-якої задачі, будь то з області фізики, хімії, геології або іншої дисципліни виникла епізодична проблема - а чи є число, ну, скажімо, 12371, простим?
Як бути?
Почати займатися написанням спеціальної допоміжної програми, метою якої буде з'ясування дрібної деталі в ланцюзі рішення більш глобального завдання?
Уважаемые зрители!
Коллектив Донецкого академического русского театра юного зрителя приглашает Вас каждую субботу в 15.00 на спектакли для взрослых зрителей, каждое воскресенье в 11.00 на музыкальные сказки для детей!
ВНИМАНИЕ! Лучшие спектакли нашего репертуара, доступные цены (15 - 20 грн. на представления для детей, 30-45 грн. – для взрослых), удобное время, комфорт и радушная театральная атмосфера!
Заказ билетов и справки по тел.: 6-46-01, 6-46-51
Касса работает ежедневно с 9:00 до 15:00