Mathcad 2000: первые впечатления

писал В.Очков http://twt.mpei.ac.ru/ochkov
подсказывали, что писать, В.Дьяконов и К.Орлов

Кому: info@mathsoft.com
От кого: ochkov@twt.mpei.ac.ru
Тема: Mathcad 2000

Dear Mathsoft,

I received your letter and at once realised that it was from you. My first thought was that it wasn't from you, but as soon as I opened it, I understood at once that it was, and that I had only thought it wasn't. I am glad that you've created a new program, because when the firm creates a new program, it has achieved what it wanted. And I'm very glad that you've created a new program, because when a firm creates a new program, then it has achieved what it wanted. Yesterday I received your letter and thought at first that it was from you, then began worrying, "What if it's not from you?" but when I opened it I saw that it was from you after all. You've made my day by writing to me. At first you didn't write, and then suddenly you did, even though I hadn't heard from you for some time. Immediately I received your letter I decided that it must be from you, and I'm so very glad that you've already created a new program. And, if the firm wants to create a new program, it should by all means create a new program. Therefore I'm so glad that you've at last created that program, exactly as required. And it made my day that you wrote to me. I was highly delighted on seeing the letter and thinking at once that it was from you. To tell the truth, as I opened it, the idea crossed my mind that it wasn't from you, but nevertheless I soon decided that it was. Thank you for writing. I'm very glad for you. Maybe you don't guess why, but I'll explain straight away that I'm glad for you because you've created a new program, which was wanted. And, believe me, it's good to create that program, exactly as required, because then you achieve what you wanted. For this reason, I am so glad for you. And I'm also glad, too, that you've written a letter to me. I've decided for certain now that the letter is from you, even though when I picked it up I had the sudden thought that it might not be from you. And then I thought, "Surely, it must certainly be from you." As I unsealed the package, I was thinking, "Is it from you or not?" Happily, as I unpacked it I saw that it was. I was very delighted and also decided to write a letter to you. I've a lot to tell you, but there's literally no time. I had time (and was in time) to write this much in a letter to you, and I'll write more when there is time; now there's absolutely none, as I'm writing a piece for a Journal. It's good, at least, that you've written a letter to me. Now, I know that you created a new program a while back. I knew from your earlier letters when you created new programs, and now again I see, completely correctly, that you have created a new program. And I am very glad, that you have created a new program and written a letter to me. Immediately I saw your letter I decided that you must have created a new program again. Well, I think, it is good that you've created a new program and written a letter to me about it. It is possible I shall tell the readers of a Journal about it.

Дорогая фирма MathSoft,

получил ваше письмо[1] и сразу понял, что оно от вас. Сначала подумал, что вдруг оно не от вас, но, как только распечатал, сразу понял, что оно от вас, а то было подумал, что оно не от вас. Я рад, что вы создали новую программу, потому что, когда фирма создает новую программу, это значит, что она добилась того, чего хотела. И я вот очень рад, что вы создали новую программу, потому что, когда фирма создает новую программу, значит, она добилась того, чего хотела. Вчера я получил письмо и сразу подумал, что это оно от вас, но потом подумал, что, кажется, что не от вас, но распечатал и вижу – точно от вас. Очень хорошо сделали, что написали мне. Сначала не писали, а потом вдруг написали, хотя еще раньше, до того как некоторое время не писали, – тоже писали. Я сразу, как получил ваше письмо, решил, что оно от вас, и потому я очень рад, что вы уже создали новую программу. А то, если фирма захочет создать новую программу, ей надо во что бы то ни стало создать новую программу. Поэтому я очень рад, что вы наконец создали именно ту программу, какую хотели. И очень хорошо сделали, что написали мне. Я очень обрадовался, когда увидел письмо, и сразу подумал, что оно от вас. Правда, когда распечатывал, то мелькнула мысль, что оно не от вас, но потом все-таки я решил, что оно от вас. Спасибо, что написали. Благодарю вас за это и очень рад за вас. Вы, может быть, не догадываетесь, почему я так за вас рад, но я вам скажу сразу, что рад я за вас потому, что вы создали новую программу, и именно ту, какую хотели. А это, знаете, очень хорошо – создать именно ту программу, какую хотел, потому что именно тогда и добиваешься того, чего хотел. Вот именно поэтому я так рад за вас. А также рад и тому, что вы написали мне письмо. Я еще издали решил, что письмо от вас, а как взял в руки, так подумал: а вдруг не от вас? А потом думаю: да нет, конечно, от вас. Сам распечатываю письмо и в то же время думаю: от вас или не от вас? Ну а как распечатал, то и вижу, что от вас. Я очень обрадовался и решил тоже написать вам письмо. О многом надо сказать, но буквально нет времени. Что успел, рассказал вам в этом письме, а остальное допишу потом, а то сейчас совсем нет времени – пишу статью для журнала. Хорошо по крайней мере, что вы написали мне письмо. Теперь я знаю, что вы уже давно создали новую программу. Я и из прежних писем знал, что вы создали новую программу, а теперь опять вижу – совершенно верно: вы создали новую программу. И я очень рад, что вы создали новую программу и написали мне письмо. Я сразу, как увидел ваше письмо, так и решил, что вы опять создали новую программу. Ну, думаю: это хорошо, что вы опять создали новую программу и написали мне об этом письмо. Можно я расскажу о вашей новой программе читателям журнала? Перевод R.Dirvin.

Эпиграф в стиле Даниила Хармса
(оригинал – http://lib.ru/HARMS/harms.txt)

 

 

Это третья статья автора, посвященная разбору новых версий этой популярнейшей математической программы (см. «Mathcad 7 Pro: что нового?», Компьютер Пресс[2], № 8’97 и «Mathcad 8: что нового?», № 10’98). Как видит читатель, «шаблон» названия статей этой серии изменился. Автор после стольких лет тесного знакомства с Mathcad осмеливается не просто перечислять новые команды, операторы и функции, но и давать их критический разбор. Тем более что многие замечания учитываются разработчиками Mathcad если в не данной, то в перспективных версиях: «Эту версию продаю, вторую отлаживаю, а о третьей думаю!»

Новинки Mathcad 2000 условно можно разделить на три группы: качественные изменения (не было – появилось), количественные изменения (больше – меньше, медленно – быстро и т.д.) и «прибамбасы». Эти три группы можно и нужно рассматривать как некие нечеткие пересекающиеся множества, о которых автор писал в статье «Mathcad и теория нечетких множеств» (№ 8’98).

Булевы операторы

Пользователи Mathcad, особенно те, кто составлял программы на его встроенном языке[3], с удивлением обнаруживали, что в среде Mathcad нет традиционных булевых операторов и функций[4]. Это тем более странно, если принять во внимание, что вся машинная математика – это «жонглирование» нулями и единицами, то есть простейшие булевы операции над булевыми переменными.

Проблему функций And, Or и др. пользователи Mathcad решали разными путями, заменяя, например, логическое И (And) на арифметическое умножение (1×1=1, 0×1=0, 1×0=0 и 0×0=0), а логическое ИЛИ (Or) – на сложение (1+1=2 (¹ 0), 1+0=1, 0+1=1 и 0+0=0). Другой выход из положения: ввод в расчет пользовательских функций Not(x) := if(x, 0, 1), And(x, y) := if(x ×  y, 1, 0) и Or(x, y) := if(x + y, 1 ,0) и т.д. Попытка анализа этой проблемы предпринята автором в статье «Mathcad и нечеткая булева алгебра» (№ 1'98). Одним словом, пользователи Mathcad худо-бедно научились строить булевы операторы и функции. Но тут разработчики спохватились и встроили их в Mathcad 2000: от панели (палитры) Evaluation «отпочковалась» новая панель Boolean (рис. 1), где к привычным кнопкам операторов сравнения числовых и текстовых констант («равно», «меньше», «больше», «меньше и равно», «больше и равно» и «не равно»[5]) добавились четыре новые кнопки булевых операторов: отрицание, логическое И (дизъюнкция), логическое ИЛИ (конъюнкция) и разделительная дизъюнкция.

Рис. 1

Эти новые операторы по идее должны иметь в качестве операндов булевы переменные, хранящие либо 1, либо 0. Возвращать эти операторы также должны булевы значения. Но разработчики Mathcad не учли тот факт, что пользователи могут «подсовывать» в качестве операндов и вещественные значения в диапазоне от нуля до единицы. Ведь ответ на альтернативный вопрос может быть не только четким («Да» или «Нет»), но и нечетким: «Скорее да, чем нет (0,75, к примеру)», «Скорее нет, чем да (0,25)» и т.д.

Рис. 2

 

Рис. 3

Пользовательские функции Not и And[6], формирование которых показано на рис. 2 и 3, «умеют» правильно работать не только с булевыми, но и с вещественными аргументами, реализуя нечеткую логику. Кроме того, наши пользовательские функции Not и And по отношению к встроенным аналогам имеют следующие преимущества:

  • Пользовательские функции And и Or можно вызывать в виде функции (And(1, 0)=0), в виде инфиксного или древовидного оператора. Встроенные операторы Ù ,Ú и Å в виде древовидного оператора вызывать нельзя[7].

·         Аргументы пользовательских многоместных функций могут группироваться в векторы и матрицы – And(x):=min(x), Or(x):=max(x).

Как мы уже отметили, встроенных операторов сравнения в среде Mathcad шесть (, , , , и ). Но здесь не хватает седьмого оператора – «примерно равно», который незаменим при численном решении задач[8].

Рис. 4

На рис. 4 этот пробел восполнен. Более того, оператор «примерно равно» позволяет нам построить оператор (функцию) «нечеткая разделительная дизъюнкция».

Автор здесь, мягко говоря, не совсем четко изложил азы нечеткой логики (fuzzy logic). Но дело тут не только в этой модной теории. «Если звезды зажигают, значит это кому-нибудь нужно!» – если операнды встроенных операторов Ø , Ù , Ú и Ä могут иметь не только булев, но и вещественный тип, то в этом должен быть какой-то смысл[9].

В начале статьи мы договорились, что три группы новинок Mathcad 2000 (качество, количество и «прибамбасы») мы будем считать нечеткими множествами (fuzzy sets – еще одна модная теория). Булевы операторы Mathcad на 30% – новинка, на 50% – улучшение и на 20% – «прибамбас». Читатель при желании здесь и далее может выставлять свои оценки.

Быстрый трехмерный график

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

Начиная с Mathcad 7 стало возможным строить двухмерный график по так называемой быстрой технологии (Quick 2D-Plot), когда задается только вид анализируемой функции одного аргумента и сразу отдается команда на построение графика. При этом значения аргумента выставляются в диапазоне от минус 10 до плюс 10. Если данное умолчание пользователя не устраивает, то он меняет эти числа прямо на графике, на оси аргумента.

В Mathcad 2000 дошла очередь (хорошего понемножку!) до быстрой технологии построения и трехмерных графиков – Quick Plot Data.

Рис. 5

В среде Mathcad 2000 достаточно иметь только анализируемую функцию двух аргументов, чтобы сразу отобразить ее графически (рис. 5) без формирования пользователем дополнительной матрицы[10]. По умолчанию «разброс» значений двух аргументов анализируемой функции (Range 1 и Range 2) задается в пределах от (start) минус 5 до (end) плюс 5, а число узлов разбиения сетки поверхности равно 20 по обеим координатам. Кроме того, в среде Mathcad 2000 стало возможным строить поверхность не только в прямоугольных координатах (Coordinate System – Cartesian – рис. 5), но и в сферических (Spherical) и цилиндрических (Cylindrical).

Надпись на графике и план выражения

Завершая рассказ о новых графических возможностях Mathcad, следует отметить, что в среде Mathcad 2000 на графиках допустимо делать надписи (правда, непрозрачные). Для этого на свободном месте Mathcad-документа пишется простой текст (надпись), который затем перетаскивается в нужное место графика на передний план. В среде Mathcad 2000 через контекстное меню можно менять у выражения статус прозрачности, перемещая выражение либо на передний (Bring to Front), либо на задний план (Send to Back). Это позволило нам сделать, например, рис. 7 более компактным за счет того, что выражение с функцией Find находится на втором плане и не загораживает своей прямоугольной областью соседей. Команды Bring to Front и Send to Back замыкают контекстное меню оператора в том случае, если его область пересекается с областью другого оператора.

Новые функции

В среде Mathcad 2000 появились следующие финансовые функции (Financial):

  1. cnper(rate, pv, fv) the number of compounding periods required for an investment to yield a specified future value given a present value and an interest rate per period.
  2. crate(nper, pv, fv) the fixed interest rate per period required for an investment at present value to yield a specified future value over a number of compounding periods.
  3. cumint(rate, nper, pv, start, end, [type]) the cumulative interest paid on a loan between a starting period and an ending period given a fixed interest rate, the total number of compounding periods, and the present value of the loan.
  4. cumprn(rate, nper, pv, stall, end, [lype]) the cumulative principal paid on a loan between a starting period and an ending period given a fixed interest rate, the total number of compounding periods, and the present value of the loan.
  5. eff(rate, nper) the effective annual interest rate (APR), given the nominal interest rate and the number of compounding periods per year.
  6. fv(rate, nper, pmt, [[pv], [type]] ) the future value of an investment or loan over a specified number of compounding periods given a periodic, constant payment and a fixed interest rate.
  7. fvadj(prin, v) the future value of an initial principal after applying a series of compound interest rates stored in vector v.
  8. fvc(rate, v) the future value of a list of cash flows occuring at regular intervals earning a specified interest rate.
  9. ipmt(rate, per, nper, pv, [[fv], [type]] ) the interest payment of an investment or loan for a given period based on periodic, constant payments over a given number of compounding periods using a fixed interest rate and a specified present value.
  10. irr(v, [guess] ) the internal rate of return for a series cash flows occurring at regular intervals.
  11. mirr(v, fin_rate, rein_rate) the modified internal rate of return for cash flows occuring at regular intervals given a finance rate payable on the cash flows you borrow and a reinvestment rate earned on the cash flows as you reinvest them.
  12. nom(rate, nper) the nominal interest rate, given the effective annual interest rate (APR) and the number of compounding periods per year.
  13. nper(rate, pmt, pv, [[fv], [type]] ) the number of compounding periods for an investment or loan based on periodic, constant payments using a fixed interest rate and a specified present value.
  14. npv(rate, v) – net present value of an Investment by using a discount rate and series of cash flows.
  15. pmt(rate, nper, pv, [[fv], [type]] ) – the payment for an investment or loan based on periodic, constant payments over a given number of compounding periods using a fixed interest rate and a specified present value.
  16. ppmt(rate, per, nper, pv, [[fv], [type]] ) the payment on the principal of an investment or loan for a given period based on periodic, constant payments over a given number of compounding periods using a fixed interest rate and a specified present value.
  17. pv(rate, nper, pmt, [[fv], [type]] ) the present value of an investment or loan based on periodic, constant payments over a given number of compounding periods using a fixed interest rate and a specified payment.
  18. rate(nper, pmt, pv, [[fv] , [type], [guess]] ) the interest rate per period of an investment or loan over a specified number of compounding periods given a periodic, constant payment and a specified present value.

Автор не стал переводить суть финансовых функций[11], так как не считает себя специалистом в этой области. Вот типичная задача, решаемая с помощью финансовых функций: «Иуда за свое предательство получил 30 серебряников и положил их на депозит под три процента годовых с ежемесячным (ежеквартальным или ежегодным) начислением процентов. Спрашивается, сколько денег у Иуды окажется в банке сегодня?»[12].

Mathcad по праву называют не просто математическим, а физико-математическим пакетом. Решая физическую задачу (школьную или институтскую задачу по физике, например), мы часто путаемся не в формулах (все формулы, лежащие в основе мироздания, просты – F = a× m, E = m× c2, 1 Кбайт = 1024 байт и т.д.) и не в расчетах (под рукой персональный компьютер или, на худой конец, калькулятор), а в размерностях. Мало того что существуют различные системы измерений (футы-метры) ¾ в рамках одной системы тоже нет полного единообразия (метры-миллиметры, футы-дюймы).

Переменной в среде Mathcad можно присвоить не просто числовое значение, а значение с размерностью физической величины – встроенной или пользовательской:

G := 1 kg d := 1 см и т.д.

Но вот что интересно: ученый-физик спокойно скажет, что у него в кабинете лежит книга массой в один килограмм, толщиной в один сантиметр (см. выше) и стоимостью в один рубль, но допустить размерность валюты в систему измерений он (физик) никак не может.

Автор, тестируя уже третью бета-версию Mathcad (7, 8 и 2000), не устает напоминать разработчикам, что в список встроенных размерностей (длина, время, масса, температура, сила тока, освещенность и количества вещества, если иметь в виду международную систему) необходимо включать и стоимость. Было бы прекрасно, если встроенная финансовая функция возвращала не безразмерное число, а сумму с припечаткой названия нужной валюты (доллары, рубли, марки, франки и т.д.). Сейчас автор, производя технико-экономические расчеты на Mathcad, выходит из этого положения, руководствуясь принципом «Время – деньги!» На рис. 6 показано формирование и работа одной из «главных» финансовых функций – функции, возвращающей сумму подоходного налога.

Рис. 6

В расчете налога единицы измерения времени не задействованы, и этим можно воспользоваться («Время – деньги!»). Функция Налог по умолчанию возвращает величину налога, припечатывая к ней единицу времени[13]:

Налог(300000 Руб) = 90400 sec ■

Но в placeholder () можно заносить другие размерности, встроенные или пользовательские, что мы и делаем, получая ответ либо в рублях, либо в долларах США, либо в немецких марках (рис. 6).

Наши парламентарии считают, что в России налоги не собираются из-за плохой налоговой системы, в частности, из-за неправильных коэффициентов функции Налог. Но это иллюзия – невольная или специально провоцируемая. Налоги у нас не платят в первую очередь из-за того, что люди не хотят отдавать свои деньги неизвестно на что[14]. На больницы, школы денег не хватает, а губернатор N-ской области, где эти бедные больницы и школы расположены, еженедельно на личном самолете со всей своей многочисленной свитой летает в Москву. Когда ему говорят, что так делать нельзя, что бюджетные средства в первую очередь должны идти в социальную сферу, то он эти законные требования относит к разряду «дешевого популизма». Президент страны, где задерживают даже нищенские пенсии, пособия и стипендии, содержит десяток загородных резиденций[15] и тратит на евроремонт Кремлевского Дворца[16] сотни миллионов долларов. Сами же налогоплательщики не желают иметь в качестве посредников таких нечестных людей и стараются отдавать деньги бюджетникам напрямую – собирают деньги на уборку класса, передают конверт с «благодарностью» врачу и т.д. Конечно, это порочная практика, но что делать, если люди, призванные распоряжаться нашими деньгами, не могут или не хотят сделать это умно и честно. Но мы немного отвлеклись от основной темы... Хотя как сказать. Автор, работая в вузе, не имеет средств на приобретение легальных копий программ. К этой проблеме мы еще вернемся.

(5 ноября 1999 г. Госдума приняла в третьем чтении законопроект «О внесении изменений и дополнений в закон Российской Федерации «О подоходном налоге с физических лиц». Вводится трехуровневая шкала подоходного налога. Согласно документу, при годовом доходе до 50 тыс. руб. ставка налога составит 12%, от 50 тыс. 001 руб. до 150 тыс. руб. – 6 тыс. руб. плюс 20% с суммы, превышающей 50 тыс. руб., от 150 тыс. 001 руб. и выше - 26 тыс. руб. плюс 30% с суммы, превышающей 150 тыс. руб.)

Интересные возможности при решении задач с размерностью валюты (и не только) предоставляет символьная математика Mathcad[17]. Так, при чтении романа Ф.М.Достоевского[18] «Игрок[i]» (http://www.online.ru/sp/eel/russian/Dostoevsky.Fedor/igrok.rhtml.) все время натыкаешься на рубли, флорины, гульдены, фридрихсдоры, франки, фунты, которыми оперируют герои романа[ii]. Возникают законные вопросы: много ли они выигрывали или проигрывали на рулетке, и какой курс валют имел место во второй половине XIX века. Несложно из электронной версии романа выудить семь цитат, в которых зашифровано решение задачи:

Цитата 1

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

¾ Как же мы сосчитаемся, ¾ заговорил он, ¾ надо переводить на талеры. Да вот возьмите сто талеров, круглым счетом, ¾ остальное, конечно, не пропадет.

и далее

Вам следует дополучить с меня эти четыре фридрихсдора и три флорина на здешний расчет.

Цитата 2

Полина просто рассердилась, когда я передал ей всего только семьсот гульденов.

и далее

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

Цитата 3

Я начал с того, что вынул пять фридрихсдоров, то есть пятьдесят гульденов, и поставил их на четку.

Цитата 4

¾ Да-с, вот взяла да и выиграла двенадцать тысяч флоринов! Какое двенадцать, а золото-то? С золотом почти что тринадцать выйдет. Это сколько по-нашему? Тысяч шесть, что ли, будет?

Я доложил, что и за семь перевалило, а по теперешнему курсу, пожалуй, и до восьми дойдет.

Цитата 5

¾ Oui, madame, ¾ вежливо подтвердил крупер, – равно как всякая единичная ставка не должна превышать разом четырех тысяч флоринов, по уставу, ¾ прибавил он в пояснение.

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

Цитата 6

Ей проходилось получить ровно четыреста двадцать фридрихсдоров, то есть четыре тысячи флоринов и двадцать фридрихсдоров.

Цитата 7

– Полина, вот двадцать пять тысяч флоринов – это пятьдесят тысяч франков, даже больше.

Если эти цитаты перевести на язык математики Mathcad, то вот что получится:

Рис. 7

Из решения на рис. 7 видно, что во второй половине XIX века гульден стоил 61 копейку, талер – полтора гульдена (флорина – см. сноску 19), а фридрихсдор был в 10 раз дороже гульдена. При таком раскладе генерал заплатил учителю (Алексею Ивановичу) 117 рублей 73 копейки[19]около 120 рублей» – см. цитату 1), а «бабуленька[20]» выиграла на рулетке 7930 рублей («до восьми тысяч дойдет» – см. цитату 4)[iii].

Автор еще раз напоминает, что в этой статье не просто перечисляются новые возможности Mathcad 2000, но и производится их критический разбор, а также высказываются пожелания разработчикам и просто даются комментарии, непосредственно не относящиеся к Mathcad. Если в Mathcad введены финансовые функции, то было бы неплохо предоставить пользователям возможность без хитростей («Время – деньги!») вводить дополнительные единицы измерения: рубли, штуки, человеко-часы и т.д. Можно, конечно, просто писать в Mathcad-документе Руб := 1 шт := 1 и т.д., но единицы измерения должны не только сопровождать исходные данные и ответ, но и участвовать в контроле размерностей.

В разделе нашей статьи о финансах оказалась функция пользователя Note(Sum) – см. рис. 8. Она возвращает расклад суммы денег (аргумент Sum) на российские банкноты и монеты[21]. Эта функция оказалась здесь не только потому, что является «финансовой», но и по другой важной причине.

Рис. 8

Очень часто, ставя на компьютер новую версию программы, пользователь сталкивается с проблемой, которая хорошо определяется поговоркой «Лучшее – враг хорошего!». В старой версии задача решается, а в новой возникают непонятные сбои. Такая история случилась и с нашей функцией Note(Sum). Она прекрасно работает в среде Mathcad 7 Pro, в среде Mathcad 8 Pro при некоторых дробных значениях аргумента дает сбои, а в среде Mathcad 2000 всегда аварийно прерывается, если сумма денег – величина нецелая (с копейками)[22]. Но «нет худа без добра» – ошибка в программе на рис. 8 дает нам прекрасную возможность рассказать о ключевой[23] новинке Mathcad 2000 – об инструменте трассировки (локализации) ошибки.

Вот типичная Mathcad-ситуация – пользователь пытается вывести значение пользовательской функции, в которую вложена другая функция, а в ту – после третья и т.д. Другой сценарий: пользователь выводит на дисплей значение функции, созданной средствами программирования (см. рис. 8). При возникновении ошибки «краснеет» только «крайний» оператор, что очень затрудняет отладку Mathcad-документа. В среде Mathcad 2000 контекстное меню аварийного («покрасневшего от стыда» за ошибку) оператора начинается с команды Trace Error, выполнение которой вызывает на дисплей одноименное диалоговое окно с пятью кнопками: First – переход к «истоку» ошибки, Previous – переход к предыдущему аварийному оператору, Next – переход к следующему аварийному оператору, Last – переход к «устью» ошибки (не к виновнику сбоя, а так сказать, к «козлу отпущения»), и Close – закрытие окна трассировки.

На рис. 8 при попытке узнать, на какие банкноты и монеты раскладываются семьсот семьдесят семь рублей и семьдесят семь копеек, произошел сбой с таким сообщением об ошибке: «Значение индекса вышло за дозволенные рамки». С помощью инструмента Trace Error этот индекс был локализован – он в теле программы покраснел и стал охвачен синим «крючком» редактора. Правда, очень жаль, что Mathcad 2000 не показывает конкретное значение аварийного индекса и приходится догадываться самому, чему он равен[24].

Контроль размерностей физических величин

В восьмой (предыдущей по отношению к Mathcad 2000) версии Mathcad появились функции контроля типа переменной: IsArray, IsScalar и IsString, возвращающие единицу, если аргумент функций – массив (вектор или матрица), скаляр или текст соответственно. В среду Mathcad 2000 введена еще одна подобная функция UnitsOf, переводящая контроль переменных из области математики в область физики: функция UnitsOf возвращает размерность переменной-аргумента.

Рис. 9

Опытные пользователи Mathcad еще до появления функций IsArray, IsScalar, IsString и UnitsOf научились решать данную проблему. Во-первых, считается плохим тоном, когда переменная «гуляет сама по себе» – то есть имеет в разных местах программы разный тип и разную размерность. Программист должен держать переменные «на коротком поводке» – должен четко знать, что она хранит сейчас и может хранить в будущем. Во-вторых, с контролем типа переменной и ее размерности прекрасно справляется оператор обработки ошибки on error.

Основная работа функции UnitsOf видится в решении следующей проблемы. Пользователя, например, просят с помощью оператора d := g ввести не просто величину, а величину с размерностью длины, например. Функция UnitsOf здесь будет полезна. Но с ней фирма MathSoft несколько опоздала – «голь на выдумки хитра»: на рис. 9 показано, как можно организовать контроль размерностей и без функции UnitsOf.

Новая методика решения дифференциальных уравнений

Разработчики Mathcad, вводя в него новый инструмент решения задачи, думают не только о точности и быстродействии новой функции, оператора или команды меню, но и о наглядности, открытости алгоритма для изучения. Научно-техническая задача очень часто сводится к дилемме «дано – найти». Решение системы алгебраических уравнений «втискивается» в шаблон Given – Find – см. рис 7.

Инструменты решения обыкновенных дифференциальных уравнений (ОДУ) и их систем появились в пятой версии Mathcad:

  • 9 функций решения задачи Коши (метод Рунге-Кутта, шаг фиксированный и переменный (подстраивающийся), жесткая система и др.);
  • 2 функции решения краевой задачи;
  • 2 функции решения уравнений в частных производных (уравнение Лапласа и уравнение Пуассона – на данном диске читатель может найти статью А.Солодова, где рассказано о решении такой задачи применительно к проблеме температурного режима платы компьютера).

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

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

Для устранения этого недостатка разработчики вставили в Mathcad 2000 новую функцию odesolve (ordinary differential equation solve), работающую, как и функции Find, MinErr, Minimize и Maximize[25], в паре с ключевым словом Given.

Теперь запись решения задачи Коши и краевой задачи вполне естественна: пишется ключевое слово Given (дано), затем дифференциальное уравнение[26] и начальные условия (см. рис. 10). Функция odesolve, завершающая эту конструкцию, возвращает функцию – решение задачи. У этой функции нельзя просмотреть ее аналитический вид[27], но тем не менее это полноценная Mathcad-функция пользователя, которую можно протабулировать, построить график[28], найти у нее особые точки – корни, минимум, максимум…

Рис. 10

У функции odesolve две опции:

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

Но следует помнить, что пользовательская функция, которая генерируется встроенной функцией odesolve, – это не совсем «правильная» функция. По ней можно, например, построить график, но ни в коем случае ее нельзя численно дифференцировать – см. рис. 10а. Численное дифференцирование – это вообще не совсем корректная операция, а в нашем случае тем более.

Рисунок 1

Поиск корня в интервале

В среде Mathcad 2000 изменилась работа встроенной функции root. Теперь эта функция может иметь либо два, либо четыре аргумента. Два аргумента означает прежнее содержание этой функции – поиск корня уравнения с опорой на начальное приближение, а четыре – поиск корня в заданном интервале.

Рис. 11

На рис. 11 «двухаргументная» функция root дает сбои, а «четырехаргументная» – нет.

Изменения коснулись и некоторых других встроенных функций. Пример – функция mean. Она возвращает среднее арифметическое значение элементов вектора или матрицы. В среде Mathcad 2000 функция mean может иметь переменное число аргументов. Так, конструкция mean(A, B, C, 1.24) предназначена для поиска среднего арифметического трех массивов (A, B, C) и одной константы (1.24). Раньше для этого следовало писать mean(mean (A) mean(B) mean(C) 1.24).

С самой ранней версии Mathcad в эту математическую программу были встроены две функции (solve и intercept), предназначенные для сглаживания точек прямой линией методом наименьших квадратов. В Mathcad 6.0 были добавлены две функции с окончанием fit (fitting – сглаживание) – linfit и genfit, решающие более сложные задачи: сглаживающая функция теперь могла иметь не только линейный (a+bx), но и другой вид. В среде Mathcad 2000 набор функций с окончанием fit увеличился:

  1. expfit(vx, vy, vg) – возвращает вектор, содержащий коэффициенты (a, b и c) сглаживающего выражения вида a*e^(b*x)+c, наилучшим образом приближающееся к точкам, координаты которых – векторы vx и vy. Вектор vg содержит первое приближение к решению.
  2. lgsfit(vx, vy, vg) – то же для выражения a/(1+b*e^(-c*x)).
  3. logfit(vx, vy) – то же для выражения a*ln(x+b)+c. Начального приближения не требуется.
  4. medfit(vx, vy) – то же для выражения a+bx. Начального приближения не требуется.
  5. pwrfit(vx, vy, vg) – то же для выражения a*x^b+c. Вектор vg содержит первое приближение к решению.
  6. sinfit(vx, vy, vg) – то же для выражения a*sin(x+b)+c.

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

Основные операторы интерфейса

В среде Mathcad оператор «:=» является основным, поддерживающим интерфейс пользователя с этой математической программой. С его помощью переменным присваиваются числовые значения и определяются функции пользователя: А := 20, y(x) := х2 и т.д. Этот же оператор имеет аналогичное написание и действие в среде языка Pascal[29]. В других языках программирования (BASIC, например) пользовательские переменные и функции «рождаются» и обновляются с помощью оператора «=»: А = 20, y(x) = x^2 и т.д. Но в среде Mathcad оператор «=» является как бы антонимом оператора «:=» – оператор «=» предназначен не для ввода, а для вывода численного значения переменной, выражения, функции.

Язык Pascal все более и более теряет свои позиции, уступая лидерство языкам С и BASIC[30]. Вследствие этого оператор «:=» становился неким анахронизмом, и его нужно было заменить на более привычный оператор «=». Но в среде Mathcad, как уже отмечалось выше, он с самого начала был «мобилизован» на выполнение противоположной операции не на ввод, а на вывод численного значения переменной.

Фирма MathSoft пытается разрешить это противоречие. Так, начиная с Mathcad 7, операторы «:=» и «=» несколько «перемешались» благодаря так называемой технологии SmartOperator («сообразительный» оператор). При вводе значения переменной теперь следует набирать на клавиатуре не «А:» (символ «=» система припечатывает сама), а «А=». Если переменная А что-то уже хранит, то это «что-то» (встроенное или пользовательское значение) выводится на дисплей: А=20[31]. Если же переменная А свободна, то на дисплее появляется заготовка оператора «загрузки» переменной: А:=<. Черный квадрат (placeholder – «держатель места») пользователь заполняет выражением, содержащим константы, а также переменные и функции, видимые в данном месте Mathcad-документа.

Кроме оператора «:=» в среде Mathcad есть и два других оператора, аналогичных по действию, но различающихся, если так можно выразиться, по радиусу действия. Оператор «º » (Triple equal – тройное «равно») делает пользовательскую переменную или функцию видимой во всем Mathcad-документе (оператор «:=» делает переменную и функцию видимой только ниже и правее места ее создания), а операто𠫬 » (Left Arrow – левая стрелка) – внутри программного блока (это переменные S, PS, i и Note, если вернуться к рис. 8) ниже данного оператора. Эти три оператора ввода позволяют создавать глобальные «º », полуглобальные (или полулокальные) «:=» и локальные «¬ » переменные. У оператора «=» тоже есть «помощник» – оператор вывода аналитического (символьного) значения переменной или функции «® » (Right Arrow – правая стрелка). С появлением 2000-й версии «все смешалось в доме Mathcad». Теперь пользователь вправе менять в выражениях написание основных интерфейсных операторов по следующей схеме:

Оператор

Варианты написания

Глобальное присваивание

º

=

Полуглобальное (полулокальное) присваивание

:=

=

Локальное присваивание

¬

=

«равно»

= (жирное равно)

= (бледное равно)

Подобную замену написания операторов можно произвести локально (только у одного оператора) либо глобально – во всех операторах. Локальная замена ведется через контекстное меню (нажатие правой кнопкой мыши на выражении), где появилась новая команда View Definition As: было Аº 3 стало А=3, было B:=1+2 стало B=1+2, было C¬ A+B стало C =A+B, было if C =A стало if C =A.

Глобальная же замена написаний операторов ведется через дополнительный ярлык Display диалогового окна Math Options, вызываемого командой Options… меню Math:

Рис. 12

еперь пользователь Mathcad имеет прекрасную возможность писать следующие «ребусы»:

А = 1 A = 1 A = 1

где первый оператор – это оператор присваивания (локального, полуглобального или глобального – догадайся сам!), второй – вывод численного значения переменной, а третий – оператор сравнения переменной с единицей. How is how можно понять, только подведя курсор к выражению, – см. рис.11, где фрагмент Mathcad-документа продублирован. В первом дубле все операторы прописаны как «бледное равно». Если ко второму дублю подвести курсор (для редактирования, например), то это действие заставит операторы принять их «первородный» вид.

Фирма MathSoft данную особенность называет главной новинкой 2000-й версии. По крайней мере эта позиция стоит первой в списке новых возможностей Mathcad 2000. Автор же считает ввод операторов-трансформеров чистым «прибамбасом». Было бы намного логичнее, не обижая языка Pascal – прародителя Mathcad, вести замену символов по следующей схеме:

Оператор

Варианты написания

Глобальное присваивание

º

:=

Полуглобальное присваивание

:=

:=

Локальное присваивание

¬

:=

Вывод численного значения

=

®

Вывод аналитического значения

®

=

Равно

=

= = (как в языке C)

Форматирование результата

Говоря об операторе «=» –операторе вывода численного значения переменной, выражения или функции, следует отметить, что в среде Mathcad 2000 появились новые возможности для форматирования ответа:

Рис. 13

Теперь мантисса и порядок числа могут разделятся и «андреевским крестом»; добавилась «фортрановская» форма записи вещественного числа с двойной точностью 1.111+E111, например.

Три английских языка

В «письме» на фирму MathSoft («на деревню дедушке»), которое автор использовал в качестве эпиграфа, текстовый процессор Word, на котором писалась статья, узрел одну ошибку: надо писать realized вместо realised. В то время как английские и американские филологи спорят, что правильнее и красивее, фирма MathSoft позволила пользователям решать эту проблему самостоятельно. По умолчанию Spell Check ориентирован на американский диалект английского языка – см. диалоговое окно Preferences, вызываемое из меню Edit (рис. 14).

Рис. 14

При желании диалект, на котором «говорит» Mathcad 2000, допустимо заменить на два поддиалекта «британского» английского – можно писать optimize, а можно optimise. Российского пользователя это нововведение должно мало волновать. От отечественного же пользователя можно услышать примерно такие суждения: «Зачем MathSoft вводит в Mathcad проверку орфографии?! Намного лучше скопировать текст комментария[32]  в среду текстового процессора Word и уже там проверять русскую или английскую не только орфографию, но и грамматику; там же можно подобрать новые термины-синонимы и др.». Другое высказывание: «Зачем улучшать в Mathcad средства ввода и вывода матриц?! Лучше и проще внедрять в Mathcad-документ таблицу Excel?!». И далее: «Зачем вводить в Mathcad новые функции и совершенствовать уже существующие, когда числовые данные можно перекачать в среду MatLab и уже там работать с ними?!». При этом как-то упускается из виду, что западный пользователь покупает и ставит на свой компьютер программу, а отечественный, как правило, ставит не покупая (вернее, покупая на «Горбушке» «черный» диск). Мы не будем выяснять сейчас, беда ли это или вина наших пользователей, а отметим лишь вот что. Часто можно услышать, что Mathcad намного слабее, чем MatLab, и непонятно почему «глупые людишки» работают с первым пакетом, а не со вторым. Да, «мерседес» намного лучше «фольксвагена», «форда» и тем более «жигулей», но люди разъезжают в основном не на лимузинах, а на «рабочих лошадках». Понять «границы ареала» Mathcad, MatLab и других подобных пакетов можно, вспомнив, что первый на порядок дешевле второго. Многое зависит еще и оттого, в каких руках – умелых или неумелых – находится автомобиль или математическая программа.

Линейка форматирования документа

Пакет Mathcad, как подчеркивают его разработчики, ведет свою родословную от табличного процессора. Одно из отличий Mathcad-документа от электронной таблицы состоит в том, что информация в таблице расположена строго по столбцам и строкам, операторы же Mathcad – в произвольном порядке[33]. Это максимально приближает стиль записи в среде Mathcad к записи на обычном листе бумаги, что, в свою очередь, определяет одну из главных причин популярности Mathcad в сфере образования. Дело в том, что Mathcad-документ можно спокойно отдавать на проверку преподавателю, совершенно незнакомому с компьютерными технологиями решения задачи. Чего не скажешь о протоколах, созданных в среде MatLab или с помощью традиционных языков программирования.

Но подобная «произвольность» нередко мешает аккуратному оформлению Mathcad-документа. В среде Mathcad 2000 выстроить операторы столбиком, соблюдая нужные отступы, и даже сгруппировать их в таблицу поможет так называемая линейка (Ruler), вызываемая из меню View. Она схожа с линейкой Word’a и не требует особых объяснений.

Новые символы умножения и деления

Стремление к схожести Mathcad-документов с математическими выкладками на обычном листе бумаги заставляет разработчиков Mathcad экспериментировать с оператором умножения. Вернее, с символом оператора умножения. Если в среде Mathcad константа перемножается на переменную, то знак умножения «× » между ними можно не ставить: p , 30 кг[34] и т.д. В среде Mathcad символов умножения стало еще больше. В произведении теперь допустимо локально или глобально (рис. 15) ставить любой символ умножения из шести встроенных. А можно использовать и седьмой – см. ниже рис. 16.

Рис. 15

Двойник появился и у символа оператора деления. В среде Mathcad числитель и знаменатель располагаются друг под другом, разделяясь горизонтальной чертой. Так мы научены писать простые дроби еще со школьной скамьи. Но если дробь многоэтажная, то человеку в ней несложно и запутаться, отыскивая числители и знаменатели. В среде Mathcad 2000 пользователь может теперь аккордом «Ctrl+/» ввести в расчет новый символ оператора деления «¸ », размещая числитель и знаменатель на одном уровне и заключая их при необходимости в скобки – (рис. 16).

Рис. 16

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

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

Автор благодарит Стива Финча (Steven Finch) и Роба Дули (Rob Dooly) – сотрудников MathSoft, Inc. за помощь в подготовке статьи.

Сам Mathcad 2000 можно приобрести на фирме СофтЛайн – у официального представителя MathSoft в России: (095) 232-00-23, www.softline.ru.


[1] В нем оказался CD-ROM-диск c прогреммой Mathcad 2000.Возврат

[2] Здесь и далее ссылки на журнал КомпьютерПресс. По адресу http://twt.mpei.ac.ru/ochkov/work2.htm читатель может найти и другие открытые статьи автора.Возврат

[3] Инструменты программирования (локальные переменные, структурные управляющие конструкции и программные блоки) появились в шестой версии Mathcad (семь операторов – см. статью «Язык программирования Mathcad: взгляд со стороны», № 6’96). В седьмой версии операторов программирования стало десять. В версиях 8 и 2000 в инструментах программирования ничего нового не появилось, если не считать возможность замены написания оператора «←» на «=» и возможности локализации ошибок (см. ниже).Возврат

[4] Под булевой функцией (оператором) мы будем понимать функцию, возвращающую нуль (НЕТ) или единицу (ДА). Аргументы этих функций также имеют булевый тип. До 2000-й версии в среде Mathcad было два встроенных булевых оператора – эквиваленция («равно»: 1 = 1=1, 1 = 0=0, 0 = 1=0 и 0 = 0=1) и разделительная дизъюнкция («не равно»: ¹  1=0, ¹  0=1, ¹  1=1 и ¹  0=0).Возврат

[5] Это двухместные операторы, возвращающие булево значение, но имеющие вещественные операнды: e > p =1 и т.д.Возврат

[6] Нечеткую функцию Or можно построить с опорой на встроенную функцию max.Возврат

[7] Этот недостаток (недоработка, ограничение) касается всех встроенных операторов Mathcad. Чтобы, например, вызвать древовидно оператор сложения, его также нужно переопределить (см. далее рис. 16).Возврат

[8] В DOS-версиях Mathcad, кстати, левые и правые части алгебраических уравнений, входящих в решаемую систему, связывались не знаком «равно», а знаком «примерно равно», что более соответствует логике решения: ищутся не корни, а точки, где отклонения меньше TOL (встроенная точность Mathcad).Возврат

[9] Булева математика насчитывает четыре (41) одноименных булевых оператора (функции) и шестнадцать (42) двухместных. Практическое применение имеет только одна одноместная функция (логическое отрицание) и семь двухместных (логическое И, логическое ИЛИ, эквиваленция, импликация, разделительная дизъюнкция, штрих Шеффера и стрелка Пирса). Если считать, что булева функция – это функция, имеющая булевы аргументы и возвращающая булевы величины, а не то, что предложил Джорж Буль (1815-64), создавая математическую логику, то можно считать, что даже одноместных булевых функций может быть бесчисленное множество. Как вам, например, понравится такая «булева» функция: y(x) := if(rnd(x) >  0.7, 0, 1)?Возврат

[10] Ее все же придется формировать самому пользователю, если он захочет, например, анимировать трехмерный график.Возврат

[11] В пакете Excel перевели на русский язык не только подсказки по финансовым функциям, но и имена самих функций и их аргументов: PMT – ПЛТ (плата), RATE – НОРМА и т.д. В пакете Excel есть файл (funcs.xls), содержащий английские и русские имена этих функций и их аргументов.Возврат

[12] Ответ одного из студентов автора: «Если это был российский банк, то ни копейки. 17 августа 1998 года Иуда потерял все свои деньги и еще раз повесился. Если же ему удалось сохранить вклад или хотя бы часть вклада, то неизвестно, что с ним (и с вкладом и с банком) станется после 1 января 2000 года.».Возврат

[13] Деньги лучше привязывать не к единице времени, а к другой, намного реже используемой единице, – к, например, к силе света (cd – кандела).Возврат

[14] По телевидению крутят рекламные ролики: «Нашим школам не хватает учебников. Наши детские дома требуют ремонта. Пожалуйста, заплатите налоги!» Здесь уместно будет добавить: «Пожалуйста, не воруйте бюджетные средства!»Возврат

[15] У президента богатейшей страны мира (США) всего лишь одна загородная резиденция – Кемп Дэвид. Мы же в этих Горках просто запутались и нумеруем их.Возврат

[16] Про оформление этого дворца «народ» говорит – «лепота», а искусствоведы – «кич».Возврат

[17] Вернее, символьная математика, интегрированная в Mathcad из пакета Maple V. В Mathcad 2000 многие ошибки, недоработки символьной математики исправлены.Возврат

[18] «Dostoevsky gives me more than any scientist, more than Gauss! » (Альберт Эйнштейн).Возврат

[19] Из текста «Игрока» можно также узнать, что годовой оклад учителя составлял 700 рублей. Из Internet по ключевому слову «талер» «выуживается» такая информация: «Годовой оклад учителя в Кенигсберге в 1850 году составляло 400 флоринов (600 талеров), а в 1870 году – 600 флоринов (900 талеров)». Талер, как мы выяснили, в те времена стоил 61 копейку. Отсылаем читателя к нашим «спекуляциям» по поводу расходования бюджетных средств и приобретения для учебных заведений программных средств.Возврат

[20] «Бабуленька» – это название одной инсценировки «Игрока».Возврат

[21] Эта функция – основа «математического обеспечения» банкомата. Она также может быть использована для перевода арабского числа в римское: сумма денег – это арабское число, а ее расклад на банкноты и монеты – римское число. Автор рекомендовал разработчикам Mathcad дать новой версии не приставку 2000 (она уже приелась – Windows 2000, AutoCAD 2000, Office 2000 и т.д.), а приставку MM, что можно рассматривать не только как римское написание 2000-го года, но и как аббревиатуру таких таких, например, фраз: «More Mathematics» или «Modern Mathematics» etc.Возврат

[22] Эта ошибка связана с арифметикой вещественных чисел: если от девяти рублей отнять рубль, то получается восемь рублей; если же от девяти копеек отнять одну копейку (0,.09 - 0.,01), то остается не восемь копеек, а 7,.999… копеек (0.,07999...).Возврат

[23] Можно попытаться перечислить ключевые новинки предыдущих версий Mathcad, с которыми автор имел дело: Mathcad 5 – команды символьной математики, Mathcad PLUS 6.0 – программирование, Mathcad 7 Pro – операторы символьных преобразований, Mathcad 8 Pro – оптимизация.Возврат

[24] В алгоритме задумано так, что при вычитании из суммы Sum номинала банкнот и монет должен остаться нуль. Но этого не происходит из-за арифметической погрешности, описанной в предыдущей сноске. Из-за этого значение локальной переменной i становится равным 11, что недопустимо, т.к.ак как номер максимального элемента вектора S равен 10.Возврат

[25] Первые две функции (Find и MinErr) обязаны работать вместе с Given, последние две (Minimize и Maximize) – могут это делать.Возврат

[26] Увы, пока лишь одно. Систему уравнений нужно сводить к одному уравнению высшего порядка. В среде Mathcad 2000 можно писать не только , но и y¢ (x), y¢ ¢ (x) и .т.д.Возврат

[27] В среде Mathcad 2000 пользователь может выбрать, писать ли ему или (частная производная).Возврат

[28] На рис. 10 мы строим через реку висячий мост: сообщаем машине координаты крепления троса (цепи) и тот факт, что у цепной функции вторая производная равна самой функции.Возврат

[29] Отсюда можно сделать вполне закономерный вывод, что первые версии Mathcad создавались на языке Pascal.Возврат

[30] Это является прямым следствием политики фирмы Microsoft, которая перестала поддерживать линию языка Pascal, полностью переключившись на Visual C и Visual Basic как на основные инструменты создания Windows-приложений. Операционная система Windows также, кстати, как и Mathcad, начинала писаться на языке Pascal. Но затем разработки перешли на С.Возврат

[31] Этим пользователь страхует себя от случайного переопределения встроенной или пользовательской переменной.Возврат

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

[33] Второе отличие – в электронных таблицах знак равно ставится до выражения, а в Mathcad- документе – после. Третье отличие – в Mathcad-документе мы одновременно и в одном месте видим и формулу и результат ее работы.Возврат

[34] Автор рекомендует всегда ставить символ умножения между сомножителями. Выражение a b несет в себе не просто двусмысленность, а «многосмысленность». Это и произведение a на b, и префиксный оператор, и постфиксный оператор, и переменная, где второй символ – пробел.Возврат

[i] Тема игры очень близка работающему на компьютере. Возьмем того же «Сапера». Эта игра задумана как быстрое и простое средство освоения «мыши». Но сколько «денег» (а время, как мы знаем, – деньги) отняла эта игра у человека. Нервно щелкаешь мышью, раскрывая мины на поле, и даешь себе честное слово, что это последняя игра, что при проигрыше не только бросишь ее и займешься наконец-то делом, но и сотрешь ее из компьютера. Но... Работа стоит, зрение портишь, а играешь и снова играешь... И главное, что новый выигрыш (разминирование минного поля) с новым рекордным временем не приносит какого-то особого удовольствия. Удовольствие (страсть) в чем-то другом, что мастерски описано Достоевским в «Игроке».Возврат

[ii] Тема денежных расчетов очень часто звучит в художественной литературе. При этом авторы нередко оставляют читателю загадки, решение которых все более усложняется по мере удаления во времени и в пространстве от описываемых событий: старый Форсайт сделал приписку к завещанию и оставил своей племяннице Ирэн пятнадцать тысяч фунтов стерлингов, а один раз дал по ошибке кэбмену соверен вместо шиллинга. А вот диалог Ноздрева, зятя Мижуева, и трактирщицы из «Мертвых душ» Гоголя:

«– За водочку, барин, не заплатили... – сказала старуха.

– А, хорошо, хорошо, матушка, послушай, зятек! заплати, пожалуйста. У меня ни копейки в кармане.

– Сколько тебе? – сказал зятек.

– Да что, батюшка, двугривенник (курсив автора) всего, – сказала старуха.

– Врешь, врешь. Дай ей полтину, предовольно с нее.

– Маловато, барин, – сказала старуха, однако ж взяла деньги с благодарностью и еще побежала впопыхах отворять дверь. Она была не в убытке, потому что запросила вчетверо против того, что стоила водка.»

Ситуация на первый взгляд непонятная – 50 копеек, ведь, больше, чем 20. Но в примечаниях к поэме читаем: «Полтина – полрубля ассигнациями. Старуха требует двугривенник серебром, который тогда равнялся восьмидесяти копейкам ассигнациями.». Отсюда легко понять, что водка стоила пять копеек серебром, или двадцать копеек ассигнациями, и за нее заплатили не в четыре, а в два с половиной раза больше. Можно также предположить, что под «двугривенником», а под, например, «полтинником» подразумевалось серебро, под «полтиной» и, например, «двугривенным» – ассигнации. Другая гипотеза – хитрая старуха-трактирщица, страхуясь от упреков в нечестности, называет правильную сумму, но не уточняет номинал, надеясь, что ей заплатят не ассигнациями, а серебром. Подобные ситуации нередки и в наши дни. Один знакомый автора рассказал такую историю. Дело происходило на родительском собрании в школе. Обсуждался вопрос об уборке класса: уборщица ушла на пенсию, и теперь класс нужно либо убирать самим, либо собирать деньги (три тысячи) и нанимать кого-то. Больше всего против сбора денег возражал один довольно прилично одетый папа, бурные протесты которого привели к тому, что, в конце концов, решили убирать класс самим. С собрания этот папа ушел вместе со знакомым автора и предложил подвести подвезти его до дому дома на джипе – папа оказался «новым русским». По дороге «папа» продолжат продолжал кипятиться, очень возмущался собранием (тряс пальцами) и говорил обескураженному попутчику, что «три тысячи» он сам не каждый месяц зарабатывает. Папа думал, что нужно нанимать уборщицу и платить ей три тысячи долларов в месяц, а учительница просила собирать в месяц с каждого на уборку по три тысячи рублей (старых рублей, что-то около полдоллара, – дело было в 1997 году).Возврат

[iii] В романе «Игрок» три линиилюбовная, финансовая и игорная, которые тесно переплетены друг с другом.

Линия любовная.

Алексей Иванович («un outchitel» – учитель в доме генерала, «молодой человек» от лица которого ведется повествование) и Полина любят друг друга несколько «странною любовью». Отчим Полины (генерал) увлекся авантюристкой m-ll Blanch, которая, в свою очередь и в свое время, окрутила Алексея Ивановича. Мистер Астлей (племянник лорда, «сахаровар» и «Аполлон Бельведерский») любит Полину и т.д.

Линия финансовая.

У генерала при отставке всплыла растрата – что-то около 30 тысячи рублей. От позора генерала спасает «французик» – Де-Грие, дав нужную сумму под заклад имущества не только генерала, но и его малолетних детей и падчерицы Полины, опекуном которых он является. Несмотря на это, генерал вместе со всем семейством (сестра, Полина, сын Миша, дочь Надя и их учитель Алексей Иванович) едет за границу (модный и дорогой немецкий курорт Рулетенбург), где продолжает делать долги, надеясь на наследство богатой московской вдовы, бабушки Полины. На это наследство имеют виды и m-ll Blanch (женитьба на генерале), и Де-Грие (возврат долгов генерала). Мистер Астлей помогает семейству своими фунтами и т.д.

Линия игорная.

Вместо телеграммы, извещающей о смерти бабушки («la baboulinka»), в Рулетенбург прибывает сама бабушка, сначала выигрывает 7930 рублей (см. выше), а потом проигрывает («профершпилила») на рулетке («проклятый зеришка») что-то около ста тысячи рублей – половину своего состояния, занимает у мистера Астлея три тысячи франков и уезжает домой в Москву. На рулетке (не сама, а через Алексея Ивановича) играет и Полина, заложив свои брильянты за семьсот гульденов (семьсот, но не гульденов, рублей – это, кстати, и годовой оклад Алексея Ивановича), мечтая выиграть пятьдесят тысяч франков и выкупить у Де-Грие свое имущество. На рулетке прежде играла и m-ll Blanch. Играла несчастливо: – теперь она, по слухам, сужает под проценты деньгами других игроков, что более надежно. Наконец-то, в рулетку играет сам Алексей Иванович – выигрывает восемьдесят тысяч франков, которые уплывают в руки m-ll Blanch (см. выше любовную линию).Возврат