Я засомневался в своей точке зрения, см. подробнее в одном из UPD.

Хочу поговорить о Wolfram Language (далее WL). Прошу прощения за сумбурность изложения, пост вырос из попытки ответить на этот коммент от Nilis.

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

Лет 6-10 назад, когда я учился в школе, я знал лишь BASIC, Pascal/Delphi, C/C++ и WL. Из ОС имел дело лишь с Windows. Не знал, что такое скриптовые языки (perl, python, bash), не знал самого понятия «скрипт». Думал, что командный интерфейс — это устаревший интерфейс и что единственный правильный интерфейс программы — это графический. Программировал я на Delphi и WL. Программы на Delphi всегда были графическими. За исключением олимпиадного программирования, там в требованиях к программам было, что они должны быть текстовыми, я их писал на Delphi и C++. Когда я узнал о WL, я был им очарован, также как и вы. Потому что код на WL был гораздо короче, чем на Delphi/C++. И вообще, потому что WL был совершенно не похож на Delphi и C++. Потому что там была возможность программировать функционально. Я познакомился с функциональным программированием на примере WL, я не знал, что существуют «стандартные» функциональные языки — Haskell, Lisp и ML.

Когда мне нужно было написать программу для каких-нибудь манипуляций с файлами, я писал её на Delphi. Причём с гуём. Писал окошки, кнопочки. Поля «введите папку, с которой будете работать» и т. д. Я не понимал, что это можно было сделать однострочником на баше.

Например, меня попросили написать программу для конвертации имён файлов в папке с латиницы на кириллицу. Я написал программу с гуём на Delphi. «Введите папку, где нужно сконвертировать». Код, наверное, был на 100 строк как минимум, если не тысячу. Сейчас я понимаю, что это делается одной командой в GNU/Linux типа такой: prename 'y/abc.../абц.../' *.avi.

У меня появилась идея написать файловый менеджер для Windows (разумеется, для Windows, других ОС я не знал), в котором была бы возможность скриптинга на WL (при этом слова «скриптинг» я не знал). Чтобы там, скажем, была функция Flatten из WL, которая бы делала Flatten для папок, т. е. уничтожала всю иерархию папок внутри данной папки и просто сваливала бы все файлы в кучу.

Потом, 6 лет назад я поступил в университет, познакомился с GNU/Linux, начал программировать на C/C++ и bash под GNU/Linux. Я понял, что всё моё программирование на Delphi и WL (кроме математики) — ерунда. Что все мои программы на Delphi можно было реализовать однострочниками на баше. А WL нужно использовать только для математических задач. Я понял, что командный интерфейс — не устаревший. И понял, что та идея файлового менеджера — ерунда. Потому что весь GNU/Linux в целом представляет собой такой файловый менеджер (а заодно и IDE) с возможностью скриптинга на всех скриптовых языках.

Там у нас началось программирование, преподавателя зовут Богачёв. От него (и от других людей) я узнал, что WL — это просто игрушка, причём даже для математических задач. WL нужно использовать, когда нужно по-быстрому построить график какой-нибудь функции или найти производную. Для задач посложнее его использовать нельзя. Потому что:
  • Mathematica и её язык — это просто сборная солянка. Если нравится WL, используйте языки, от которых он произошёл, например, Lisp. Сам пакет Mathematica содержит кучу математических функций, но никакая из них не развита так, как она развита в узкоспециализированных математических пакетах. Например, если вам нужно быстро и точно обратить большую матрицу (например, 1000 x 1000), то WL использовать нельзя (т. к. могут быть ошибки, неоптимизировано, низкая точность, не предназначено для реальных применений). Пишите свою реализацию или используйте узкоспециализированные пакеты, скажем, для C, C++ или Fortran
  • В WL могут быть ошибки. Вероятность ошибок, скажем, в компиляторе C гораздо ниже, т. к., во-первых, есть полно свободных компиляторов C, во-вторых, эти компиляторы по-настоящему широко используются для реальных задач, и ошибки в них сразу становятся заметны
  • WL имеет куда меньшее быстродействие, чем, скажем, C++
  • WL не является математически правильным. Например:
    In[9]:= Simplify[(x^2 + x) / x /. x -> 0]
                                     1
    Power::infy: Infinite expression - encountered.
                                     0
    Infinity::indet: Indeterminate expression 0 ComplexInfinity encountered.
    Out[9]= Indeterminate
    In[10]:= Simplify[(x^2 + x) / x] /. x -> 0
    Out[10]= 1
    

    С математической точки зрения невозможно объяснить, почему в одном случае мы имеем Indeterminate, а в другом — 1. Simplify вообще не должен менять математический смысл выражения. Правильным поведением было бы вообще не упрощать (x^2 + x) / x, и упрощать его только если есть условие, что x не равен нулю. Solve не учитывает всякие частные случаи. Скажем, Solve[x a == b, x] просто выдаёт b/a, не учитывая, что a может быть равно нулю.
  • WL — это не свободное ПО


Богачёв помимо своей преподавательской деятельности работает в одной фирме техническим директором, и я там у него работал. Мы там делали симулятор месторождения нефти, я думаю, не нужно пояснять, что деньги в этой области крутятся огромные. Так вот, симулятор написан на C++, в том числе код, выполняющий расчёты (решение диффуров и систем линейных уравнений). И разумеется, не на WL, потому что нет нужного быстродействия, нет должного доверия к этому WL, и вообще WL здесь было бы использовать несерьёзно.

Затем я познакомился с формальной математикой, в том числе с системой Isabelle. Так вот, я вам скажу, что формальная математика — это единственный способ проводить математические манипуляции на компьютере так, чтобы быть уверенным в их математической правильности. И всех этих косяков с Simplify, Solve и т. д. в формальной математике нет.

Но такие системы (т. е. системы для работы с формальной математикой) не похожи на WL. Работа с ними происходит так: вы вводите в систему формальное доказательство, а она вам говорит, правильное оно, или нет. Возникает вопрос: можно ли смешать способ работы WL с правильностью формальной математики? Да, можно.

Mathematica, Maple и т. д. относятся к так называемым системам компьютерной алгебры. Так вот, все такие системы грешат отсутствием математической строгости. В связи с этим существует идея написания по-настоящему правильной системы компьютерной алгебры, основанной на формальной математике. Вот здесь специалисты в формальной математике показывают результаты первых экспериментов в этом направлении: www.cs.ru.nl/~freek/pubs/holcas.pdf, прочитайте, пожалуйста, хотя бы первые две страницы.

Итак, по поводу математики на WL: если нужно по-быстрому построить график, вычислить производную и т. д. — юзайте WL. Если серьёзные математические вычисления — пишите код сами на языках общего назначения (типа C++), как это делает Богачёв, либо используйте профессиональные библиотеки, опять-таки для языков общего назначения. Если нужно проводить математические манипуляции, которые не являются вычислением, т. е. не являются численными — то делайте ваши манипуляции вручную, либо с использованием формальной математики (например, Isabelle), либо с использованием формальных систем компьютерной алгебры, например, представленной в статье выше (правда, такие системы на данный момент находятся на начальной стадии развития).

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

Итог. WL — это просто игрушка. Это инструмент студента, но не учёного. Вряд ли, скажем, данные с Большого андронного коллайдера обсчитываются на WL. WL как 1С: плохой, узкоспециализированный, коммерческий, несвободный язык.

Если что-то заинтересовало в этом посте (формальная математика, функциональное программирование, и т. д.), спрашивайте, я отвечу.

UPD от 20 июля 2015 г. Почему WL похож на Lisp: habrahabr.ru/post/263015/#comment_8506383.

UPD от 22 июля 2015 г. Ещё немного про схожесть WL и Lisp, а именно про принцип «программа — это данные»: habrahabr.ru/post/263015/#comment_8506389.

Немного про области, где можно применять WL и про заголовок этого поста. Мне не нравится, что есть много людей, которые серьёзно воспринимают WL. Т. е. которые воспринимают его как инструмент, который может играть главную роль в научном исследовании, или, того хуже, как язык общего назначения. Людей, которые очарованы достоинствами WL (как я в своё время), и не знают, что, скажем, WL — это далеко не единственный функциональный язык программирования. Которые не знают, что вообще-то есть скриптовые языки программирования (Perl, Python, Bash) и что есть функциональные, с которых этот WL содран (Lisp, Haskell, ML). Так вот, чтобы раскрыть этим людям глаза, я и написал свой пост. И чтобы быть максимально убедительным, я использовал кричащий заголовок («WL — игрушка»). Я, конечно, понимаю, что WL всё-таки имеет свою область применения. Он нужен для создания прототипов, для того чтобы по-быстрому найти производную и т. д., для того, чтобы провести некие расчёты там, где ошибки не критичны (скажем, при выполнении домашних заданий в вузе и написании курсовых), для того, чтобы провести некие расчёты, которые будут потом проверены другим, более надёжным способом. Мой коммент на эту тему: habrahabr.ru/post/263015/#comment_8506387.

Мой коммент про численные и аналитические задачи: habrahabr.ru/post/263015/#comment_8507849.

Про кучу подробностей из моей жизни и Windows vs GNU/Linux. Я написал про GNU/Linux и т. д. не потому, что я хотел сказать, что GNU/Linux лучше Windows, а гуй лучше текстового интерфейса. И про Богачёва я написал не для того, чтобы его пропиарить. Просто я хотел немного рассказать о своей жизни, чтобы сделать мой рассказ более убедительным, чтобы было понятно, как менялись мои представления. И я не считаю, что GNU/Linux сильно превосходит Windows в техническом плане. И я понимаю, что GUI и CLI — это просто два разных интерфейса со своими применениями.

Про свободное ПО. Конкретно в случае WL его несвободность является существенным минусом, т. к. понижает доверие к полученным результатам.

UPD от 26 июля 2015 г. Пример с Simplify и другие примеры. Я немного неудачно рассказал тот пример с Simplify. Я имел в виду следующее: Simplify[(x^2 + x) / x] — это x + 1, и это неправильно, т. к. не учитывается случай, когда x равен нулю. Далее, x/x схлопывается просто в 1, хотя, опять-таки не учитывается, что x может быть равен нулю. Далее, очень показательный, на мой взгляд, пример прямо из документации WL ( reference.wolfram.com/language/ref/Simplify.html ):
In[5]:= hiddenzero = x^2 + 2 x + 1 - (x + 1)^2; anotherhiddenzero = Sin[x]^2 + Cos[x]^2 - 1; betterhiddenzero = Gamma[x + 1] - x Gamma[x];
In[6]:= {hiddenzero/anotherhiddenzero, anotherhiddenzero/hiddenzero,
        hiddenzero/betterhiddenzero, betterhiddenzero/hiddenzero}
Syntax::sntxf: "hiddenzero/anotherhiddenzero" cannot be followed by ", anotherhiddenzero/hiddenzero, ".
Syntax::sntxf: "" cannot be followed by "hiddenzero/anotherhiddenzero, anotherhiddenzero/hiddenzero, ".
In[8]:= Map[Simplify, {hiddenzero/anotherhiddenzero, anotherhiddenzero/hiddenzero, hiddenzero/betterhiddenzero, betterhiddenzero/hiddenzero}]
                                      2         2
                           -1 + Cos[x]  + Sin[x]
Simplify::infd: Expression ----------------------- simplified to Indeterminate.
                                      2          2
                           1 + 2 x + x  - (1 + x)
                           -(x Gamma[x]) + Gamma[1 + x]
Simplify::infd: Expression ---------------------------- simplified to ComplexInfinity.
                                        2          2
                             1 + 2 x + x  - (1 + x)
Out[8]= {0, Indeterminate, 0, ComplexInfinity}
In[9]:= Map[FullSimplify, {hiddenzero/anotherhiddenzero, anotherhiddenzero/hiddenzero, hiddenzero/betterhiddenzero, betterhiddenzero/hiddenzero}]
                                          2         2
                               -1 + Cos[x]  + Sin[x]
FullSimplify::infd: Expression ----------------------- simplified to Indeterminate.
                                          2          2
                               1 + 2 x + x  - (1 + x)
                               -(x Gamma[x]) + Gamma[1 + x]
FullSimplify::infd: Expression ---------------------------- simplified to ComplexInfinity.
                                            2          2
                                 1 + 2 x + x  - (1 + x)
Out[9]= {0, Indeterminate, 0, ComplexInfinity}

Пример был приведён в разделе Possible Issues, вообще, я вам скажу, это отличное место, где можно искать всякие нелогичности WL. Далее, берём пример из статьи выше (про формальную математику) и переносим его из Maple в WL, немного изменив:
In[11]:= N[Integrate[E^(-(x-1)^2)/Sqrt[x], {x, 0, Infinity}]]
Out[11]= 0. + 0.411862 I
In[12]:= NIntegrate[E^(-(x-1)^2)/Sqrt[x], {x, 0, Infinity}]
Out[12]= 1.97373

У меня сильное подозрение, что ответ, полученный NIntegrate[...], правильный, а N[Integrate[...]] — нет. Т. к. NIntegrate выполнил внутри себя простой тупой алгоритм численного дифференцирования. В отличие от Integrate, который представляет собой неведомого монстра алгебраических манипуляций без формальной строгости, подверженного ошибкам. Окончательно я поверю, что один из этих результатов правильный, только если самостоятельно напишу программу на C/C++, которая будет численно интегрировать. Либо если найду (или, как минимум, проверю) этот интеграл на бумажке. (А ещё этот интеграл, очевидно, должен быть действительным.)

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

И всё же добавлю: если вы хотите получать достоверные результаты на WL, вам нужно уметь его использовать (впрочем, то же самое относится к любой другой технологии). Например, понимать, как на WL происходит работа со всякими частными случаями вроде нулевого знаменателя (см. примеры в этом посте выше). Далее, важно понимать, что WL — это высокоуровневый язык, что работать с математикой на компьютере можно и с помощью низкоуровневых языков (вроде C++) тоже. И наконец, важно знать, что WL — это не единственный язык, позволяющий писать относительно сжатый код, что существуют скриптовые языки (Perl, Python, Bash). И что WL — не единственный язык, поддерживающий функциональное программирование, что существуют Lisp, ML и Haskell.

Я люблю Хабр, Хабр покажет тебе, насколько ты не прав! :)

Приведённые примеры были на Mathematica 10.0.2.

UPD от 26 июля 2015 г. Как правильно заметили тут, «почти вся ценность этого поста в комментариях». :)

UPD от 26 июля 2015 г. Баг с Integrate исправлен.

Комментарии (109)


  1. vanxant
    19.07.2015 23:56
    +6

    Автор не в курсе, что результат того же Simplify можно экспортировать в код на C?
    Математика — офигенный инструмент для своих задач. Так же как и Си, Баш и т.п. — для своих.


    1. BaRoN
      20.07.2015 00:04
      +9

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


      1. vanxant
        20.07.2015 00:32
        +9

        Знаю очень серьезных дядек, которые гоняют в математике символьные расчеты. Внешне компактная система дифур после учета граничных условий и натягивания на сетку вполне может разложиться в десятки листов А4 зубодробительных формул. Причем баги класса «потеряли двойку» или «зевнули минус» диагностируются очень и очень плохо. Делать это руками — это реально месяцы кропотливого труда. Против пары дней в математике.
        Собственно это и есть задача символьной алгебры. Более чем серьезная.
        Потом, да это выгружается в плюсы и дальше считается уже численно.


        1. ZloAlien
          20.07.2015 23:57

          Я когда пробовал использовать системы компьютерной алгебры для своих расчётов, у меня тоже получалось «Внешне компактная система дифур после учета граничных условий и натягивания на сетку вполне может разложиться в десятки листов А4 зубодробительных формул.». А если делать мозгом и ручками, то куда короче формулы получаются. Хотя конечно «потерянный минус» отлавливается очень плохо. Пробовал в IPython notebook с формулами работать (любые операции выполнять как замены в тексте исходной формулы), но это извращение. Нормального математического пакета так и не нашел. :(


    1. safinaskar Автор
      20.07.2015 00:25
      +2

      В курсе. Для таких задач WL отлично подходит. Моя мысль в том, что на WL нельзя писать сколько-нибудь крупные программы


      1. qw1
        20.07.2015 00:58
        +8

        Такие языки не для написания программ, а для написания прототипов.
        Например, если я не уверен, подойдёт ли какой-то метод для моей задачи, я по-быстрому пишу прототип в matlab, гоняю его на десятке тестовых примеров, подбираю алгоритмы и параметры. Если всё устраивает — можно переписать на C++


        1. monah_tuk
          20.07.2015 08:52
          +3

          Всякие аппаратные (читать — реализованные в ПЛИС) алгоритмы обычно делаются так (CSR/ex Zoran — SoC для фотоаппаратов): умные дядьки делают алгоритм в Matlab, экспортируют в C, несут FPGAшникам, те курят, потому ругаются про себя, потом ругаются с умными дядьками, потом приходят к конценсусу и реализуют логику в FPGA. Некоторые алгоритмы остаются в софте на C или C++, но тут палка о двух концах: сгенерированный код мозгодробителен, часто не оптимален и сопровождать его трудно. Беда в том, что умный дядька умеет только Матлаб и если что-то заоптимиздит, мёржить новосгенерённый код — то ещё удовольствие. Когда писали код для работы с буями, там научники тоже код на Си давали, правда из какого пакета было сделано — неизвестно. Но косяки были. Как минимум две утечки и один коррапт я там исправил.

          ЗЫ пост-подтверждение с, хоть и абстрактными, но примерами из жизни :)


          1. nerudo
            20.07.2015 09:51
            +1

            C в данной процедуре — этап зачастую весьма излишний и вредный. Читать код/модель матлаба проще, чем с-исходник. И переносить dataflow алгоритм на FPGA намного проще без ухода к процедурному представлению.


            1. monah_tuk
              20.07.2015 11:09

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


          1. ffriend
            21.07.2015 01:35
            +1

            Некоторые алгоритмы остаются в софте на C или C++, но тут палка о двух концах: сгенерированный код мозгодробителен, часто не оптимален и сопровождать его трудно. Беда в том, что умный дядька умеет только Матлаб и если что-то заоптимиздит, мёржить новосгенерённый код — то ещё удовольствие.

            Если задача ещё актуальна, посоветуйте умным дядькам посмотреть на Julia — язык как раз и создавался для того, чтобы писать как в Матлабе, но при этом было быстро как на C или C++.


      1. SirEdvin
        20.07.2015 01:24

        Зато можно писать крупные программы с использованием WL, если того позволяет платформа.


      1. ComodoHacker
        20.07.2015 09:25
        +4

        Но выразили вы эту мысль совсем иначе. «Для таких задач WL отлично подходит» и «WL это просто игрушка» — есть разница?

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


    1. dbanet
      20.07.2015 15:11
      +5

      Просто автор /так ничего и не понял/.

      Сначала автору дали винду и рассказали (в школе? неквалифицированные учителя информатики?) про дельфи и про то, что GUI — хорошо, а CLI/TUI устарело и не круто. Он поверил и начал самоуверенно формошлёпить на дельфях под винду, считая крутым всё, что делает, не осознавая, что есть другие точки зрения (кроме своей^Wнавязанной), другие понятия, области знания, другие технологии.

      А теперь поступил в институт, где ему умные дядечки показали GNU/Linux и сказали (например, «WL — игрушка», «GNU/Linux рулес фарева»), что и как нужно делать — автор даже не пытался анализировать, абсолютно так же слепо поверил и принял их точку зрения, вляпавшись в то же самое.

      Автор, твоя проблема не в выбранной технологии.

      Есть такое понятие: рефле?ксия. ru.wikipedia.org/wiki/%D0%A0%D0%B5%D1%84%D0%BB%D0%B5%D0%BA%D1%81%D0%B8%D1%8F


      1. dbanet
        20.07.2015 15:21
        +3

        > Solve не учитывает всякие частные случаи.
        > Скажем, Solve[x a == b, x] просто выдаёт b/a, не учитывая, что a может быть равно нулю.

        Видимо, автору пока не сказали, что читать документацию — это круто (тогда бы видели статью про RTFM):
        reference.wolfram.com/language/ref/Reduce.html


        1. safinaskar Автор
          20.07.2015 20:19
          -2

          Я знаю про Reduce. Проблема в том, что нужно отгородить «безопасные» функции, т. е. математически правильные функции, такие как Reduce, от всех остальных, типа Solve. В документации для каждой «опасной» функции должно быть написано, что она «опасная». И даже если вы пишите код, используя только «безопасные» функции, всё равно остальные недостатки WL никуда не деваются. Во-первых, отсутствие математической правильности даже без «опасных» функций, например, x/x сразу же схлопывается в 1 без всяких Simplify, т. е. не учитывается, что x может быть равно нулю (при этом 0/0 — это Indeterminate). Во-вторых, отсутствие доверия к системе в целом


          1. OsipovRoman
            20.07.2015 20:28
            -1

            «Опасные функции».
            Это что-то новенькое. По поводу ваших, уже излюбленных примеров, прочтите комментарии: мой и Леонида Шифрина.
            Вы по-прежнему не понимаете суть того, о чем говорите.


      1. dbanet
        20.07.2015 15:56
        +5

        > Integrate не выдаёт «плюс константа» в конце результата,
        > что опять-таки бессмыслено с точки зрения математики.

        Снова читаем документацию: reference.wolfram.com/language/tutorial/IndefiniteIntegrals.html

        > The Wolfram Language function Integrate[f,x] gives you the indefinite integral. You can think of the operation of
        > indefinite integration as being an inverse of differentiation. If you take the result from Integrate[f,x], and then
        > differentiate it, you always get a result that is mathematically equal to the original expression f.

        > In general, however, there is a whole family of results which have the property that their derivative is f.
        > Integrate[f,x] gives you an expression whose derivative is f. You can get other expressions by adding an arbitrary
        > constant of integration, or indeed by adding any function that is constant except at discrete points.

        > If you fill in explicit limits for your integral, any such constants of integration must cancel out. But even though the
        > indefinite integral can have arbitrary constants added, it is still often very convenient to manipulate it without filling
        > in the limits.

        Теперь читаем Н. Н. Лузина «Интегральное исчисление», страница 6 (их там 417. Что у вас по матану?):

        > Общее же выражение f(x)+C, где C — произвольное постоянное, носит название
        > неопределённого интеграла от функции Ф(x). Первое слагаемое f(x) этого выражения
        > называется **функциональной частью неопределённого интеграла**.

        «Бессмысленно с точки зрения математики»?..

        P. S. Комментарии не могу оформлять нормально из-за кармы.


        1. safinaskar Автор
          20.07.2015 20:21
          -1

          Ладно, тут я согласен, убрал из статьи


          1. OsipovRoman
            20.07.2015 20:29
            -2

            Зачем отказываться от своих слов? Для вас же так критично было отсутствие константы, которая бессмысленна в работе.


      1. safinaskar Автор
        20.07.2015 20:13
        -2

        Delphi я научился сам. Программировал я на нём в 2005-2009 годах, может даже раньше, может даже начиная с 2000-го. На тот момент, возможно, он действительно считался хорошей средой разработки под Windows. То, что WL — игрушка — это моё мнение, которое, разумеется, сформировалось при участии других людей


        1. dbanet
          20.07.2015 23:37

          Я ничего не говорил про технологии. Про них можно говорить много, как хорошего, так и плохого.

          Моя основная посылка в другом — перечитайте комментарий.


  1. stepik777
    20.07.2015 00:48
    +7

    Сам пакет Mathematica содержит кучу математических функций, но никакая из них не развита так, как она развита в узкоспециализированных математических пакетах.
    Тут не соглашусь, некоторые вещи сделаны очень хорошо. Как пример — символьное интегрирование, возможно в нём не очень много практической пользы, но всё же.

    WL не является математически правильным. Например:
    Вот ещё более простой пример, Mathematica считает, что 0/x = 0, но 0/0 = Indeterminate, то есть в первом случае игнорируется случай, что x может быть равен нулю.

    Так вот, все такие системы грешат отсутствием математической строгости.
    Это ещё что. Помню статью Стивена Вольфрама (где-то на хабре был перевод), он там с помощью каких-то эвристических алгоритмов нахватал из кучи математических статей теоремы с доказательствами и пытался на основе этого что-то доказывать. Мне аж не по себе стало. То что нужно использовать формальные методы, в этом я с вами абсолютно согласен.

    Но с тем, что Wolfram Mathematica — просто игрушка, я категорически не согласен, всё-таки система довольно мощная. Да, это не язык общего назначения, но для своих задач очень даже подходит, несмотря на перечисленные вами недостатки.


  1. SirEdvin
    20.07.2015 01:22
    +9

    На Lisp WL вообще не похож. Может быть для знатоков гуру он похож на Lisp, но мне как-то так не казалось.

    Обе альтернативы, которые вы представили в своем выводе имеют ряд недостатков.
    1. Пишите сами, как это делает Богачёв
    Я понимаю, это интересно. Я сам таким страдаю на Java, но… серьезно? Призывать делать свои велосипедыбиблиотеки в каждом случае, когда вам нужно решить дифур или систему, это странно.
    Обычно, если пишется свое решение, то только в двух случаях. Или аналогов и правда нет (с решением систем и дифуров вряд ли), или можно было оптимизировать под задачу, потому что там дифуры специального вида.
    Писать в других случаях при разработке продукта крайне странно. Собственно написанный код вызывает у вас больше доверия, чем многоразово протестированная система?

    2. либо используйте профессиональные библиотеки
    Неплохое решение. Особенно, если профессиональные библиотеки под ваш язык имеются. Как-то так сложилось, что большинство профессиональных математических библиотек написано на С/С++ (ну или Fortran), а остальные пишутся программистами для программистов. Профессионалы там не участвуют. Доверия к таким библиотекам (особенно потому, что я видел их наполнение) у меня еще меньше, чем к Mathematica. Про соответствие формальной математике я вообще промолчу (так как практически любой язык программирования имеет те или иные проблемы с ней).

    Каждая из предложенных вами альтернатив имеет сомнительное превосходство над WL. Да, скорее всего, вы будете знать, что находится внутри (ведь ML закрытый, все плохо), но минусов в таких подходах тоже достаточно.

    Это инструмент студента, но не учёного. Вряд ли, скажем, данные с большого андронного коллайдера обсчитываются на WL. WL как 1С: плохой, узкоспециализированный, коммерческий, несвободный язык.

    Как-то это глупо звучит. Предположим, я ученый. Предположим, мне нужно провести многоразовое моделирование. Почему я должен выкинуть имеющейся у меня ML и начать это все кодить на каком-то языке. Оно станет быстрее в 1.001 раз? Ну да мне все равно. Оно станет точнее? Сомнительно.
    WL — отличный инструмент для ученых. Для ученых, у которых нет денег на программистов, у которых нет знаний языков программирования (да и не особо они им нужны). Для ученых, которые находятся между БАКом и институтами. А таких много.
    Приведенный пример с БАК вообще смешон. Это все равно, что сказать «Java/C# плохой язык, вряд ли на нем написаны поисковые движки Google».

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


    1. stepik777
      20.07.2015 01:45
      +1

      На Lisp WL вообще не похож.
      На Лисп он, по-моему, как раз очень похож. Кстати, многие другие системы компьютерной алгебры написаны именно на Лиспе.

      То, что на Лиспе записывается как (f arg1 arg2 arg3), на WL будет f[arg1, arg2, arg3], то есть функции здесь имеют выделенный статус, по сравнению с Лиспом, где это просто первый элемент списка, но основные идеи — те же, то есть программный код и данные записываются с помощью одинаковых конструкций и можно манипулировать самими выражениями языка программирования также как и любыми другими данными.


      1. SirEdvin
        20.07.2015 01:56
        +1

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

        Хм, там доступно такое? Просто пока что я только видел lambda функции, но именно таких вещей как в лиспе (что код тоже данные) я там не наблюдал. Как по мне WL — больше процедурный, с элементами функционального.


        1. safinaskar Автор
          20.07.2015 02:25
          +1

          но именно таких вещей как в лиспе (что код тоже данные)

          Чтоа? Из всех известных мне языков лишь в WL принцип «код — данные» выдерживается в самом прямом смысле. Если написать код Solve[x^2==0, {x}], то этот код представляет собой ещё и данные. Просто манипулировать такими данными не совсем удобно, т. к. этот код стремиться вычислиться при первой же возможности. Но если запихнуть его в Hold, то всё тип-топ:
          In[12]:= Hold[Solve[x^2==0, {x}]]
                               2
          Out[12]= Hold[Solve[x  == 0, {x}]]
          In[13]:= Hold[Solve[x^2==0, {x}]] // FullForm
          Out[13]//FullForm= Hold[Solve[Equal[Power[x, 2], 0], List[x]]]
          In[15]:= Hold[Solve[x^2==0, {x}]][[1, 0]]
          Out[15]= Solve
          In[17]:= Hold[Solve[x^2==0, {x}]][[1, 1]]
                    2
          Out[17]= x  == 0
          


        1. LeonidShifrin
          20.07.2015 23:00

          > Хм, там доступно такое? Просто пока что я только видел lambda функции, но именно таких вещей как в лиспе (что код тоже данные) я там не наблюдал. Как по мне WL — больше процедурный, с элементами функционального.

          Это глубокое заблуждение. Более правильно будет сказать, что Mathematica — функциональный язык с элементами процедурного (хотя и это не совсем точно отражает суть дела).

          Посмотрите мою книгу, например (более конкретно — 5 главу):

          mathprogramming-intro.org/book/chapterNode6.html

          или, более кратко, мой доклад двухлетней давности

          www.youtube.com/watch?v=1DuAciYorbs&feature=youtu.be&t=22m25s

          (ссылка указывает на начало обсуждения именно языка Mathematica / WL)


    1. safinaskar Автор
      20.07.2015 01:59
      +5

      На Lisp WL вообще не похож

      Они похожи внутри. В Lisp любые данные — это список. В WL, можно сказать, тоже всё — список. A[B, C] можно рассматривать как список с элементами A, B и C. Обращение к элементам этого «списка» происходит весьма естественным способом:
      In[2]:= x = A[B, C]
      Out[2]= A[B, C]
      In[3]:= x[[0]]
      Out[3]= A
      In[4]:= x[[1]]
      Out[4]= B
      

      Программа на Lisp представляет собой выражение. Программа на WL — это тоже выражение, причём в подавляющем большинстве случаев программа на WL может быть записана только с помощью букв, цифр, квадратных скобок и запятых. Скажем, Solve[x^2 == 0, {x}] можно записать как Solve[Equal[Power[x, 2], 0], List[x]]. Такая форма называется полной. Посмотреть её можно так:
      In[8]:= Solve[x^2 == 0, {x}] // Hold // FullForm
      Out[8]//FullForm= Hold[Solve[Equal[Power[x, 2], 0], List[x]]]
      

      Даже присвоение и последовательное выполнение являются в WL обычными выражениями (с заголовками Set и CompoundExpression), так же, как и в Lisp.

      Lisp — это нечистый нетипизированный функциональный язык, как и WL.

      Есть и отличия. Главное отличие, в том, что в Lisp есть принципиальная разница между программой и данными. (+ 1 2) — это программа, т. е. выражение, но не список. А (1 2) — это данные и при этом список, но не программа. (list 1 2) — это программа (выражение), результатом работы которой является список (данные) (1 2).

      В WL этой разницы нет. Любая программа — это выражение, и при этом она может быть данными. {1, 2} — это программа (выражение), результатом которой является она же, т. е. данные, а именно список {1, 2} (полная форма: List[1, 2])


      1. SirEdvin
        20.07.2015 02:03

        Спасибо большое за пояснение, стало понятно, что автор имел ввиду.


    1. safinaskar Автор
      20.07.2015 02:19
      +5

      Обе альтернативы, которые вы представили в своем выводе имеют ряд недостатков.

      Если нужно решить диффур, чтобы сделать домашку в универе — юзаем WL. Если нужно решить диффур, чтоб копипастнуть результат в свою реальную научную работу, опять-таки, не в курсовую, а реальную научную работу, которой будут доверять, и которую будут потом внедрять на производстве, то WL юзать нельзя. Потому что нет никакой гарантии, что результат будет правильным. Да, WL можно использовать даже в реальной научной работе, для того, чтобы просто посмотреть, как оно работает. Но полагаться на результат, выданный Mathematica, нельзя.
      Особенно, если профессиональные библиотеки под ваш язык имеются

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

      Ещё разок: если программа на WL численно решает простой диффур, то, пожалуй, да, ей можно доверять. Если что-то сложнее — уже нельзя


      1. SirEdvin
        20.07.2015 10:19

        Если нужно решить диффур, чтобы сделать домашку в универе — юзаем WL. Если нужно решить диффур, чтоб копипастнуть результат в свою реальную научную работу, опять-таки, не в курсовую, а реальную научную работу, которой будут доверять, и которую будут потом внедрять на производстве, то WL юзать нельзя. Потому что нет никакой гарантии, что результат будет правильным. Да, WL можно использовать даже в реальной научной работе, для того, чтобы просто посмотреть, как оно работает. Но полагаться на результат, выданный Mathematica, нельзя.

        Если для вас единственным критерием служит присутствие «формальной математики», то вы так же не можете положится на практически любую математическую библиотеку, потому что языки программирования имеют весьма непростые с ней отношения.
        К тому же, большинство библиотек как раз построены на численных методах, а WL может решить все аналитически.

        Приведенный вами пример неправильности WL ничего не показал, кроме того, что вы не понимаете, как он работает.
        1. Возьмите тоже выражение (x^2 +x)/x и подставьте туда ноль. Что вы получите, с точки зрения формальной математики?
        2. А теперь возьмите выражение x+1 и поставьте туда ноль. Результат ведь отличается?

        Из приведенных аргументов, существенным является только тот, что WL часто не учитывает частные случаи и решения. На которые, в большинстве случаев и так всем все равно.

        Ещё разок: если программа на WL численно решает простой диффур, то, пожалуй, да, ей можно доверять. Если что-то сложнее — уже нельзя

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


        1. 0serg
          20.07.2015 10:40

          Возьмите тоже выражение (x^2 +x)/x и подставьте туда ноль. Что вы получите, с точки зрения формальной математики?


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


          1. SirEdvin
            20.07.2015 10:49
            +2

            Никакого функционального анализа. Вот вы в WL берете и подставляете в это выражение ноль.
            Почему в реальности вы начинаете делает какие-то отступления и прочее?
            И как вы вообще сможете дальше применять выражение 0/0?


            1. 0serg
              20.07.2015 12:46

              Потому что в реальности Вы работаете не с «выражением» а с функцией описываемой через это выражение.
              И с любой разумной точки зрения эта функция в нуле превращается в единицу.

              Матанализ имеет целый раздел посвященный вопросам «чему равно данное 0/0» или «inf/inf» :)


              1. SirEdvin
                20.07.2015 13:14
                -1

                У вас свой математический анализ?
                В нем целый раздел посвящен тому, чему в пределе равняются эти неопределенности.
                То, о чем вы говорите, называется доопределением функции.
                А тут вы просто поставляете в функцию ноль, когда в нуле она не определена. И получаете неопределенность. Что тут не так?


              1. SirEdvin
                20.07.2015 13:26
                +1

                Об этом можно прочитать, например, тут. Написано для комплексных функций, но для рациональных есть такая же теория.
                Коротко говоря, для этой функции 0 — особая точка (то есть в ней функция не определена):
                image
                А для этой уже нет:
                image


                1. 0serg
                  20.07.2015 17:00

                  Ох. Я не говорю про формальное определение. Я говорю про то что во всех практических смыслах указанные Вами две функции y(x) для любых целей идентичны. Вас не смущает то что соответствующий раздел матанализа называется «раскрытием неопределенностей» (en: evaluation of intederminate form)?


                  1. SirEdvin
                    20.07.2015 17:28

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


        1. safinaskar Автор
          20.07.2015 20:58
          -2

          Если для вас единственным критерием служит присутствие «формальной математики»

          Нет, её присутствие нужно не всегда. Можно выделить два типа задач: численные и аналитические. Так вот, в численных задачах, мне кажется, вполне можно обойтись без формальной математики (хотя иметь её было бы здорово). В частности, Богачёв эту формальную математику не использует, и всё у него в порядке. Но вот в аналитических задачах она нужна. Т. е. если вам нужно, скажем, аналитически найти производную, упростить выражение и пр., то полагаться на результат, выданный WL, нельзя. Лучше провести преобразование вручную. WL воспользоваться, в принципе, можно, но только при условии что вы очень хорошо понимаете, что делаете. Например, используя где надо Reduce вместо Solve, как мне подсказали в ветке выше и т. д. И даже тогда нужно действовать крайне осторожно.

          то вы так же не можете положится на практически любую математическую библиотеку

          Таким образом, вполне можно полагаться на численные математические библиотеки

          К тому же, большинство библиотек как раз построены на численных методах, а WL может решить все аналитически

          То есть вы считаете, что аналитические вычисления на компьютере лучше численных? Нет, всё как раз наоборот. С численными задачами компьютер справляется хорошо (если не использовать для них WL). А вот с аналитическими всё плохо, т. к. по-настоящему доверенный аналитический результат может получиться лишь при использовании формальной математики, а формальные системы компьютерной алгебры, как я говорил, находятся в зачаточном состоянии

          Приведенный вами пример неправильности WL ничего не показал, кроме того, что вы не понимаете, как он работает

          В приведённом примере Solve неправильно упростил выражение. Он упростил (x^2+x)/x до x+1, хотя это верно только если x не равен нулю. В остальном, да, ответы WL в этом примере правильные

          WL часто не учитывает частные случаи и решения

          В численных подсчётах частные случаи действительно не важны. И WL их игнорирует, как и профессиональные библиотеки. А в случае аналитических вычислений важны, т. к. эти аналитические вычисления как раз и проводятся, чтобы учесть всё.

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


          1. OsipovRoman
            20.07.2015 21:19

            В частности, Богачёв эту формальную математику не использует, и всё у него в порядке.

            У меня уже ощущение, что ваша статья — пиар тов. Богачева.

            Таким образом, вполне можно полагаться на численные математические библиотеки.

            С численными задачами компьютер справляется хорошо (если не использовать для них WL).

            В численных подсчётах частные случаи действительно не важны.

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

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

            Из одного примера своего собственного неумения вы раздуваете свою фантазию до космического масштаба.

            Что нибудь кроме многократно рассмотренной в куче комментариев неопределенности 0/0 вы предложить можете?
            Вам на этот счет уже ответили, потрудитесь почитать.

            Последнее:
            В приведённом примере Solve неправильно упростил выражение. Он упростил (x^2+x)/x до x+1

            Solve не занимается упрощением выражений.


            1. Arastas
              20.07.2015 21:34
              +2

              Роман, почти вся ценность этого поста в комментариях. :)


              1. OsipovRoman
                20.07.2015 21:36

                Да, автору конечно спасибо за возможность всем нам пообщаться.
                Но только за это.


            1. FransuaMaryDelone
              21.07.2015 11:45

              Давайте я вам дам интегральное сингулярное несобственное уравнение с нелинейным ядром (этой задачей я успешно занимался продолжительное время).

              Мне интересно было бы взглянуть на задачу. Если Вас не затруднит.


              1. OsipovRoman
                21.07.2015 12:06

                Интегральное уравнение, описывающее смещение берега трещины разрушения u:


                1. FransuaMaryDelone
                  21.07.2015 12:36
                  +1

                  Спасибо. А в чём тут сложность?


                  1. OsipovRoman
                    21.07.2015 12:41

                    Если вы задаете такой вопрос, вы интегральные уравнения не решали.


                    1. OsipovRoman
                      21.07.2015 12:51

                      Из основных особенностей:
                      1) интеграл несобственный;
                      2) подынтегральная функция имеет бесконечный разрыв;
                      3) искомая функция u входит в подынтегральную функцию нелинейным образом (в показателе экспоненты).

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


                      1. FransuaMaryDelone
                        21.07.2015 13:22
                        +1

                        Да, Вы правы — я не решал интегральных уравнений. Ваш комментарий и заставил задуматься о деталях этой кухни. На мой вкус, приятная штука: и само уравнение чудесное и формулировка загадочна (откуда такая одномерная прелесть появилась и куда такая задача может понадобиться). Спасибо за ответ.


                        1. OsipovRoman
                          21.07.2015 14:09
                          +1

                          «Одномерная прелесть» на самом деле двумерная. Так как рассматривается трещина в виде диска с радиальной симметрией. А задача родилась просто: дело в том, что стандартный подход в теории разрушения материалов говорит о том, что в вершине трещины бесконечное напряжение, это нефизично и получается из-за макроскопического подхода к трещине. Именно эту особенность, вслед за идеями Баренблатта, я и мой руководитель профессор Шевелев решали. Большой член по центру — это выражение силы взаимодействия между берегами трещины — на основе модификации потенциала Морзе, а эллиптический интеграл (в конце) — следствие перехода от декартовой системы координат к полярной системе.


            1. safinaskar Автор
              26.07.2015 15:35

              Solve не занимается упрощением выражений

              Опечатка, Simplify


    1. Arastas
      20.07.2015 11:17
      +4

      Это не язык программирования для ученых, это инструмент для них. Мало кто будет использовать WL в прикладных продуктах, потому что это просто не его ниша. Он вообще не для этого разрабатывался.

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


      1. SirEdvin
        20.07.2015 11:21

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


        1. Arastas
          20.07.2015 20:26

          Не очень я бы на эти примеры ориентировался. Во всех, как я понимаю, одним из основных разработчиков был Роман, который, будучи тесно связанным с Wolfram, использовал наиболее удобный для себя инструмент.

          Вот интересно, сколько есть не связанных с Wolfram компаний, долго и профессионально разрабатывающих ПО, которые бы вдруг решили: всё, в новых проектах переходим на стек технологий Wolfram и заказчику в продакшн будем поставлять продукты, сделанные на WL? Не использовать его для внутренних исследований, прототипирования и отладки, а именно ставить в продакшн?


  1. tyderh
    20.07.2015 03:31
    +3

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


  1. Elfet
    20.07.2015 07:09
    -1

    Если вы не писали крупных программ на Wolfram Mathematica, или не видели других крупных программ, это не значит что на WM нельзя написать «сколько-нибудь крупные программы».


  1. mifki
    20.07.2015 07:26
    +11

    Какая каша в голове. Узнали про Linux, восхитились, и понеслось — командная строка — наше всё, если несвободное ПО, значит плохое, всё можно сделать однострочниками в баше. А как думаете, тот самый prename кто-то запрограммировал, или он свыше спустился?

    Я не знаю, с какого перепугу они стали продвигать WL как язык общего назначения. Но если вам удобнее было писать симулятор нефти на C++, что не удивительно, а идея файлового менеджера со скриптингом на WL оказалось плохой — не значит, что WL/Mathematica никому не нужны.


    1. safinaskar Автор
      22.07.2015 04:54
      -1

      Процитирую UPD:

      Я, конечно, понимаю, что WL всё-таки имеет свою область применения. Он нужен для создания прототипов, для того чтобы по-быстрому найти производную и т. д., для того, чтобы провести некие расчёты там, где ошибки не критичны (скажем, при выполнении домашних заданий в вузе и написании курсовых), для того, чтобы провести некие расчёты, которые будут потом проверены другим, более надёжным способом. Мой коммент на эту тему: habrahabr.ru/post/263015/#comment_8506387.

      <...>

      Про кучу подробностей из моей жизни и Windows vs GNU/Linux. Я написал про GNU/Linux и т. д. не потому, что я хотел сказать, что GNU/Linux лучше Windows, а гуй лучше текстового интерфейса. И про Богачёва я написал не для того, чтобы его пропиарить. Просто я хотел немного рассказать о своей жизни, чтобы сделать мой рассказ более убедительным, чтобы было понятно, как менялись мои представления. И я не считаю, что GNU/Linux сильно превосходит Windows в техническом плане. И я понимаю, что GUI и CLI — это просто два разных интерфейса со своими применениями.

      Про свободное ПО. Конкретно в случае WL его несвободность является существенным минусом, т. к. понижает доверие к полученным результатам


      1. mifki
        22.07.2015 05:16
        +1

        > для того, чтобы провести некие расчёты, которые будут потом проверены другим, более надёжным способом

        Это каким? Системы формальной математики — дремучий лес. Статья об их комбинировании с традиционными CAS очень интересная, но пока это теоретическая работа. Писать что-то свое для расчетов на C++ — ни разу не более надежно. А главное, все ваши примеры на счет ошибок связаны с областью определения функций и тому подобным. Эти вещи надо держать в голове и учитывать отдельно в любом случае, и при проведении расчетов самостоятельно без WL их надо будет учитывать ничуть не меньше.

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

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


      1. OsipovRoman
        22.07.2015 08:52
        +1

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

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

        Людей, которые очарованы достоинствами WL (как я в своё время), и не знают, что, скажем, WL — это далеко не единственный функциональный язык программирования.

        Wolfram Language не только функциональный язык программирования. Изучите уже основы. В языке Wolfram Language реализовано несколько парадигм программирования и он позволяет реализовывать и другие самостоятельно.

        Которые не знают, что вообще-то есть скриптовые языки программирования (Perl, Python, Bash) и что есть функциональные, с которых этот WL содран (Lisp, Haskell, ML).

        Вы историю вообще читаете: Haskell вышел в 1990, а Wolfram Language существует с 1988.
        По-вашему, если используются какие-то идеи из LISP, язык содран. Ну тогда все жестко сдирают с C в своих языках и Fortran.

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

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

        И чтобы быть максимально убедительным, я использовал кричащий заголовок («WL — игрушка»).

        Прямо такие как любя желтая пресса.

        Я, конечно, понимаю, что WL всё-таки имеет свою область применения.

        На этом месте я обрадовался. Автор что-то понял из диалогов в комментариях.

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

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

        Про кучу подробностей из моей жизни и Windows vs GNU/Linux.

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

        Я написал про GNU/Linux и т. д. не потому, что я хотел сказать, что GNU/Linux лучше Windows, а гуй лучше текстового интерфейса. И про Богачёва я написал не для того, чтобы его пропиарить. Просто я хотел немного рассказать о своей жизни, чтобы сделать мой рассказ более убедительным, чтобы было понятно, как менялись мои представления. И я не считаю, что GNU/Linux сильно превосходит Windows в техническом плане. И я понимаю, что GUI и CLI — это просто два разных интерфейса со своими применениями.

        Зачем эти оправдания? Вы хотели одного: испортить репутацию Wolfram Language. Не вышло. Пошли оправдания.

        Про свободное ПО. Конкретно в случае WL его несвободность является существенным минусом, т. к. понижает доверие к полученным результатам.

        Свободное ПО — это миф. Несвободность в случае Wolfram Language — делает его результаты недостоверными? Ох… Хочется спросить, вы весь код GNU/Linux прочли? Все сборки знаете? Или вы такой эксперт, что дай вам любое свободное ПО, вы сразу весь его код изучите и скажите «да, ошибок нет».

        Последнее. Потрудитесь ответить хотя бы раз эксперту, а не убегайте из веток каждый раз, когда я или Леонид что-то в них вам ответят. Я понимаю, что сказать вам нечего. Но за свои слова вам придется отвечать. В том числе перед всем сообществом Хабра и Wolfram.


    1. safinaskar Автор
      26.07.2015 16:19
      +1

      Я передумал, см. UPD :)


  1. tzlom
    20.07.2015 09:51

    А с Maxima у вас какой-нибудь интересный опыт есть?


    1. safinaskar Автор
      22.07.2015 04:55
      -1

      Нет


      1. OsipovRoman
        22.07.2015 08:54
        -1

        Странно было не услышать от вас, что Wolfram Language «содран», якобы, с Maxima.


  1. OsipovRoman
    20.07.2015 10:55
    +12

    Автор, к сожалению вы не указали какой последней версией Wolfram Mathematica вы пользовались. Подозреваю, что очень сильно устаревшей 5-й или 7-й.

    При этом вы явно практически полный дилетант в использовании Wolfram Mathematica и языка Wolfram Language, который решил написать на Хабре порочащую статью, желая получить легких лайков. Это скорее всего продиктовано юношеским максимализмом — судя по анкете на Хабре вам неполных 23 года. А в этом возрасте человек еще не может быть экспертом ни по какому вопросу, особенно делать выводы, которые, как говорилось в «Собачьем сердце», имеют «космический масштаб и космическую же глупость».

    Из вашего поста следует, что все ваше обучение было сначала самостоятельным — в школе. А затем у человека, по каким-то причинам являющегося вашим, видимо, огромным авторитетом — Богачева, который не любит систему Mathematica. Почему — видимо просто потому, что в его задачах она приносит мало пользы.

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

    В остальном.

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

    Из вашего примера про функцию Simplify следует, что вы либо не знаете Main Evaluation Loop в Mathematica, либо сознательно избрали такой простой пример, который должен убедить людей, не знающих системы, в том, что она плоха.

    Вы должны знать, что выражения
    Simplify[(x^2 + x) / x /. x -> 0] и Simplify[(x^2 + x) / x] /. x -> 0
    отличаются тем, что в первом случае сразу происходит подстановка 0, а затем вычисление, что дает Indeterminate.
    А во втором случае происходит сначала упрощение, а затем подстановка, что дает, естественно 1.

    Если вы разобрались бы в вопросе, вы бы знали, что Simplify может изменять область определения функции в процессе работы счетным множеством меры нуль. Т. е., как в вашем случае, потеряна точка 0.

    Далее, если бы вы потрудились разобраться, вы бы знали, что существует функция FunctionDomain, которая позволяет определить область определения вашей функции. Что должно учитываться в ваших расчетах, если вы серьезный исследователь. А зная, на основе ее результатов, что 0 не входит в область определения, нужно искать предел в точке. И предел как раз и равен 1.

    Limit[(x^2 + x)/x, x -> 0]

    Таким образом, вы сыграли на понятии предельного перехода и раскрытии неопределенности.
    Профессионал в Wolfram Language легко обходит такие проблемы.

    Идем далее.

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

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

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

    Глупо сравнивать простой язык с высокоуровневым приложением и языком сверхвысокого уровня вообще.
    Если вы копнули бы глубже, вы бы знали, что вы можете подключать программы на C, Java, R, Matlab к Mathematica и использовать их в своих расчетах. Таким образом, ничто не мешает интегрировать их в ваши программы. По поводу ошибок (багов) в Wolfram Mathematica — безусловно есть некоторые баги, но их поиск — это почти всегда искусство. Они часто очень неочевидны и возникают в крайне экзотических конструкциях, с которыми реальный пользователь вряд-ли встретится.
    Вообще интересно, если вы утверждаете такое, потрудитесь привести список найденных вами багов.

    WL имеет куда меньшее быстродействие, чем, скажем, C++

    Опять же, если вы хороший программист, непонятно, почему вы позволяете себе сравнивать скорость в принципе низкоуровневого языка C++, с высокоуровневым интерпретируемым языком Wolfram Language. Если сравнивать по формальной скорости, язык Wolfram Language, естественно уступит чистому С (С++, Java)… Но это позволяет часто выиграть миллисекунды или секунды на задачах побольше. Для решения сложных задач, как я и говорил выше, можно создавать компилируемые функции на основе Compile, использовать распараллеливание, CUDA, OpenCL и Hadoop. се это (из коробки) есть и позволяет ускорить код на Wolfram Language в сотни, тысячи, а часто и десятки тысяч раз. Но вы этим явно не занимались и, подозреваю, не можете оптимизировать код даже на уровне базовых советов 10+ советов по написанию быстрого кода в Mathematica. Хорошо было бы, чтобы вы показали какой-то свой реальный код.

    В остальном, все что вы сказали демонстрирует вашу некомпетентность в Wolfram Language. Особенно взгляд на систему, как только на систему, способную работать в области математики (кстати, многие крупные математики — Матиясевич (решил десятую проблему Гильберта), Джон Нэш (нобелевский лауреат) и огромное количество других используют систему и используют успешно). Да, это традиционная область. И те, кто так думают, просто не знают современного функционала Wolfram Language.

    В остальном я, как человек разрабатывавший и разрабатывающий крупномасштабные приложения на Wolfram Language могу с уверенностью сказать, что вы не правы (я делал системы для фармацевтической компании ОАО «Валента Фарм», для издательства «Баласс», а также для ООО «Эвика» (интеллект умного дома)) в том, что говорите.

    Я уверен, что Леонид Шифрин (эксперт по Wolfram Language (разработчик ядра), С, Java, R, Python и JavaScript) найдет что еще сказать вам на вашу необоснованную критику, порочащую хороший продукт.


    1. SirEdvin
      20.07.2015 11:00

      Простите за вопрос, но мне очень интересно.
      Вы пишите программы чисто на WL, или используете какой-то другой яп для создания приложения, а потом связываете его с WL?

      Просто я никогда не видел возможности делать Sandalone приложения в WL.


      1. OsipovRoman
        20.07.2015 11:10
        +5

        Делать Standalone приложения в Wolfram Language можно тремя путями:
        1) использовать просто Wolfram Mathematica — это дорогой путь для заказчика,
        2) использовать Wolfram Player Pro (который с недавнего времени принял имя CDF Player Pro) — это по сути голое ядро Wolfram Language. Приложение разрабатывается в виде документа Mathematica, по сути, а его можно сделать каким угодно по внешнему виду. Именно так было сделано с фармкомпанией,
        3) для небольших проектов подойдет обычный простой CDF.

        Случай 3 вообще бесплатный, так как CDF Player — бесплатный кроссплатформенный продукт.

        Сейчас — с компанией Эвика — разрабатывается решение на основе Wolfram Cloud, а если быть точнее, то связки — Wolfram Programming Cloud и Wolfram Data Drop (статья на Хабре).

        В издательстве Баласс мы применяем Wolfram Language для сложных задач разработки парсинга в другие языки необходимых нам объектов (тесты, базы объектов для учебников — иллюстрации, видео, аудио, и т. п.), автоматизации, разработки полиграфических иллюстраций, систем генерации задач, проверки ответов в учебниках и пр. При этом мы создаем приложения (электронные учебники) для платформ iOS, Android, Linux, Mac, Windows. Сами приложения пишутся на Java, Javascript, ObjectiveC. Так что в этом проекте Mathematica взяла на себя самую сложную часть — разработку и обработку контента, а оболочки делаются нативными для каждой системы.

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


        1. SirEdvin
          20.07.2015 11:11
          +1

          Спасибо за ответ)


    1. mifki
      20.07.2015 14:15
      +2

      Что вы думаете о Maple?


      1. OsipovRoman
        20.07.2015 14:43
        +1

        Это конечно холиварный вопрос.

        Maple традиционно ставит себе в заслугу то, что их рабочий документ выглядит так, «как будто вы пишите на бумаге». При этом на самом деле это необычайно неудобно при программировании. Интерфейс Mathematica выдает все в функциональном виде и он намного ближе к именно программированию. То, что некоторые говорят о том, что код в Wolfram Mathematica выглядит «навалом», это часто правда. Однако в этой куче легко работать и так выглядит обычно «быстрый» код, который нужен здесь и сейчас. Код серьезных проектов выглядит структурированно и привычно для программистов и опытные пользователи стараются писать код ясно и красиво.

        Есть области, в которых Maple хорош по функциональноси, так же, как и Mathematica — это чистая математика.
        По всем остальным параметрам, он, по моему мнению, хуже.

        Детального экспертного сравнения этих двух систем пока что, по сути, нет. Однако, я бы рекомендовал посмотреть вот этот документ: Review of New Features in Maple 17 (они даже сделали свой публичный ответ на непубличное сравнение Wolfram, в котором привели совершенно смехотворные недостатки Mathematica — вроде «В Wolfram Language вы должны писать в уравнении ==, а у нас =». Еще одна проблема их сравнений — они не приводят кода, когда говорят о времени работы алгоритма, когда они сравнивают Maple и Mathematica — это само по себе уже бросает тень сомнения на их результаты. Wolfram же приводит коды, так что пользователь может их вычислить у себя и сравнить системы сам.)

        Из этого документа вы увидите общую тенденцию: Maple постоянно заимствует идеи у Wolfram Mathematica и они делают вслед за Wolfram Research похожий функционал, часто с большим опозданием.

        Помимо этого у Maple нет аналогов Wolfram|Alpha, курируемых баз данных, Wolfram Cloud, Wolfram Functions Syte, Wolfram Demonstrations Project (здесь есть слабый аналог), Wolfram MathWorld. Maple — во всем, что не связано с чистой математикой — тень Mathematica, но даже в этой области у них нет главного, что есть у Wolfram Language — символьной парадигмы всего в языке, что дает широчайшие возможности для манипулирования выражениями, метапрограммирования, автоматизации и пр.


        1. OsipovRoman
          20.07.2015 14:51

          Помимо приведенного файла, посмотрите еще один: уже про версию Maple 18.
          Review of New Features in Maple 18


        1. mifki
          20.07.2015 15:13

          Мое знакомство с CAS началось (да в общем-то и закончилось, ибо математик из меня не вышел) с Maple V R4 — ничего кроме «чистой математики» тогда и не было. Зато возможность просмотра кода всей математической библиотеки впечатлила.


          1. OsipovRoman
            20.07.2015 15:16

            Плюс Mathematica заключается в том, что она не ограничивает вам математикой. Количество покрываемых областей очень велико. Математика теперь лишь одна из них.


            1. mifki
              20.07.2015 15:32

              Вот как раз из-за этого у меня несколько предвзятое отношение к нынешнему развитию Mathematica. В силу своего образования, мне понятны математические задачи вроде моделирования/расчёта механических систем, физических процессов и прочие довольно скучные вещи. Поэтому у меня не получается серьезно воспринимать, когда возможности языка демонстрируются вроде «вот как легко мы можем загрузить данные о чем-то из облака, что-то с ними сделать, красиво визуализировать, применить фильтрик и сохранить в 10 графических форматов». Не вижу, как мне могло бы что-то из этого понадобится в научной работе.


              1. OsipovRoman
                20.07.2015 15:45

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

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


    1. LeonidShifrin
      20.07.2015 18:24
      +1

      Спасибо за оценку, Роман, но экспертом я могу (вероятно) считаться только в WL, в остальных — разработчик с разной степенью компетентности.


    1. safinaskar Автор
      26.07.2015 15:14

      Автор, к сожалению вы не указали какой последней версией Wolfram Mathematica вы пользовались. Подозреваю, что очень сильно устаревшей 5-й или 7-й

      Сейчас у меня десятая

      Ссылаясь на то, что система Mathematica — коммерческий продукт, у меня есть все основания полагать, что (как минимум) в школе вы использовали ее не лицензионную версию

      Это так :)

      что вы не работали толком с возможностями обработки файлов в Mathematica

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

      Вы должны знать, что выражения...

      Я сперва неудачно написал про Simplify. Посмотрите UPD про Simplify и прочее.

      И наконец, OsipovRoman, вы меня переубедили, спасибо, см. UPD. Сделаю пинг заодно вам, LeonidShifrin


      1. OsipovRoman
        26.07.2015 15:39

        Вы пользуетесь устаревшей на текущий момент версией Wolfram Mathematica, у вас версия не выше 10.0.2.

        К вашему сведению, этот баг был исправлен уже в 10.1 (текущая версия системы 10.2) и сейчас вычисления производятся верно:



        Вы попутно показали один из стандартных способов проверки аналитического интегрирования.

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

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

        А вот это ваше личное мнение, которое стоит оставить при себе. Хотя конечно спасибо, что вы изменили свое мнение и признали свою неправоту. Это достойно похвалы.


        1. OsipovRoman
          26.07.2015 15:54
          +1

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

          Расскажу простой пример из недавнего: двое моих знакомых ученых в РАН занимались одной задачей в теории прочности. Один прислушался еще давно ко мне и стал профессионально использовать Wolfram Language. Второй вроде вас — любит писать все сам и с нуля. Каждый решил получить решение независимо. Первый на Wolfram Language решил задачу примерно за 3 дня, получил ответ. Второй написал свое приложение на C, писал 1,5 месяца. Получил тот же ответ. Вот только его программа не универсальна и ему придется для новой задачи либо допиливать что он создал, либо опять почти все делать с нуля.

          Любой инструмент нужно использовать с головой. А если вы используете Wolfram Language с головой, он станет вашим самым мощным инструментом.


        1. safinaskar Автор
          26.07.2015 16:40

          Про Integrate добавил в UPD, ок


      1. LeonidShifrin
        29.07.2015 01:53
        +2

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

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

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

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


        1. safinaskar Автор
          30.07.2015 03:14

          Я буду думать, прежде чем писать на Хабр.
          Я буду думать, прежде чем писать на Хабр.
          Я буду думать, прежде чем писать на Хабр.
          (Не копипаста.) Простите


          1. FransuaMaryDelone
            30.07.2015 13:10

            Вы запятую не там поставили!

            А хабр, это да…


            1. OsipovRoman
              30.07.2015 13:21

              В этом весь автор)


              1. FransuaMaryDelone
                31.07.2015 06:18
                +1

                Пусть не хватает опыта. Но он пытлив, уравновешен и совсем не глуп — а это дорогого стоит, мне кажется.


            1. safinaskar Автор
              30.07.2015 14:57
              +2

              new.gramota.ru/spravka/punctum?layout=item&id=58_628. Мой вариант допустим :)


              1. FransuaMaryDelone
                31.07.2015 06:16
                +2

                Ваш аргумент убедителен. И я вынужден просить извинения.


  1. OsipovRoman
    20.07.2015 11:00
    +2

    В дополнение к моему предыдущему ответу.

    Рекомендую к просмотру:

    Разработка больших приложений в Mathematica


  1. Nilis
    20.07.2015 11:31
    +3

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

    Думаю, даже по комментариям здесь очевидно, что WL используют не от незнания Lisp.

    Каждому инструменту своя ниша, с этим сложно спорить. Но один частный случай еще не опровергает все остальные. Эта игрушка экономит куче людей и компаний много времени и денег. У нее есть своя ниша, которая несколько шире, чем помощь студентам с домашкой. Сейчас эту нишу пытаются расширить и появляется куча проблем. Будут ли они решены — я не знаю. Тут каждый решает для себя, на что ставить.


  1. alexxz
    20.07.2015 13:02

    Офтопик. Господа, а помогите нубу с Вольфрамом. Пытался посчитать сложный параметризуемый интеграл на ряде значений параметра, так что-то происходило не так…

    Вот пример, когда параметр p = 16 просто подставлен в выражение http://www.wolframalpha.com/input/?i=1+%2F+%2816+*+N[int+%28log+base+2+of+%28%282%2Bx%29%2F%281%2Bx%29%29%29^16+from+0+to+infinity]+%29
    Но формуле реально не хватает изящности, потому хочется значение вытащиить в параметр.

    Простые интегралы я научился вот так параметризовать http://www.wolframalpha.com/input/?i=p%3D16%2C+N[int+p%2Fx+dx+from+1+to2

    Но аналогичный подход не работает для первого примера. Как же правильно?


    1. OsipovRoman
      20.07.2015 13:33

      Вы работаете с Wolfram|Alpha, это не Wolfram Language, это система, которая выдает ответ на поставленный вопрос, вычисляя его, а также является источником курируемых баз данных для Wolfram Language.

      Ваша задача в Wolfram Language (Wolfram Mathematica) решается так:


      1. OsipovRoman
        20.07.2015 13:39

        У вас, правда, функция чуть другая

        Рисунок


        1. alexxz
          20.07.2015 14:52

          OsipovRoman спасибо за разъяснения и графики. Математика штука, конечно, интересная, но в Альфе функционал привлекает бесплатностью. Рассчёты эти мне нужны для улушения мира нищебродов OpenSource, потому, покупать минимум годовую подписку я считаю для задачи необоснованным.
          Хотя, теперь, когда у меня есть корректный пример, я вероятно возьму триал и рассчитаю там.

          P.S. Вы немного ошиблись в интерпретации моих слов — 16 перед интегралом — это тоже p. Интересен на целых точках в интервале 4..32.
          Если интересно формула — нормировочный коэффициент для алгоритма HyperLogLog. В любом случае — большое спасибо!


          1. OsipovRoman
            20.07.2015 14:58

            Открою для вас интересную вещь: вы можете программировать на Wolfram Language бесплатно в аккаунте Wolfram Programming Cloud.


  1. wibotwi
    20.07.2015 17:26
    +2

    Статья, имхо, ни о чём. ПОтому что любой тул нужно использовать по назначению. Где-то один тул идеален, где-то другой. Никто не предлагает использовать WL для тех задач для которых он не предназначен.

    P.S.
    Не знаю к чему вообще в статье упоминается Богачёв, но он очень крутой, научил и меня и многих очень многому.


  1. LeonidShifrin
    20.07.2015 18:08
    +7

    «Wolfram Language (Mathematica) — это просто игрушка» — скажите это десяткам тысяч ученых, финансовых аналитиков, инженеров и других профессионалов, использующих WL каждый день как один из основных инструментов. Причем и на западе, где люди умеют считать и ценить свое время и деньги, и у нас, где люди просто умеют ценить хорошие инструменты.

    В Вашем посте нет практически ни одного аргументированного, или вообще сколько-нибудь осмысленного утверждения. Складывается впечатление, что Вы, что называется, «слышали звон». Все разумное, что мне удалось вычленить из Вашего произведения, это то, что у каждого инструмента есть своя ниша и область применения (что справедливо в т.ч. и для WL), и за ее пределами инструмент перестает быть оптимален. И еще, что WL — закрытая коммерческая система.

    Все же, пройду коротко по Вашим тезисам

    > WL — это всё-таки узкоспециальный язык.

    Это неверно. Верно то, что его эффективное применение как языка общего назначения требует более высоких навыков, в сравнении со многими другими языками (что может считаться как минус для определенных задач).

    > Также замечу, что WL — это не свободное ПО, в отличие от кучи других языков, включая тот же питон.

    Это справедливо. Минус это или плюс, зависит от многих факторов. Абсолютное преимущество свободного ПО — это миф. Всем кому интересно, советую почитать скажем эту прекрасную статью, которая развенчивает ряд мифов о свободном ПО:

    marktarver.com/problems.html

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

    > Там у нас началось программирование, преподавателя зовут Богачёв. От него (и от других людей) я узнал, что WL — это просто игрушка, причём даже для математических задач.

    То есть Вы находите возможным публиковать статью на Хабре с весьма определенным мнением о некотором языке программирования, основываясь не на совокупном мнении некоторого экспертного сообщества (что было бы правильно), и даже не на своем сколько-нибудь серьезном опыте — скажем, нескольких серьезных но неудачных попытках решения серьезных задач на WL — а просто на опыте нескольких преподавателей?

    Оставлю это без дальнейших комментариев.

    > Mathematica и её язык \[LongDash] это просто сборная солянка.

    Это было бы так, если бы WL не был построен на не очень большом числе весьма общих принципов. Такая фраза без уточнения и расшифровки — неверное и поверхностное суждение о языке.

    >Если нравится WL, используйте языки, от которых он произошёл, например, Lisp.

    Это зависит от задачи. Есть задачи, для которых Lisp имеет преимущество перед WL, и наоборот.

    > Сам пакет Mathematica содержит кучу математических функций, но никакая из них не развита так, как она развита в узкоспециализированных математических пакетах.

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

    > Например, если вам нужно быстро и точно обратить большую матрицу (например, 1000 x 1000), то WL использовать нельзя (т. к. могут быть ошибки, неоптимизировано, низкая точность, не предназначено для реальных применений). Пишите свою реализацию или используйте узкоспециализированные пакеты, скажем, для C, C++ или Fortran

    Вы привели плохой пример. Для матричных вычислений с машинной точностью, WL использует высоко-оптимизированные библиотеки типа Intel MKL, и писать свою реализацию в таких случаях — самонадеянность и потеря времени, я уже не говорю о надежности результатов.

    > В WL могут быть ошибки. Вероятность ошибок, скажем, в компиляторе C гораздо ниже, т. к., во-первых, есть полно свободных компиляторов C, во-вторых, эти компиляторы по-настоящему широко используются для реальных задач, и ошибки в них сразу становятся заметны

    На самом деле тут неправильная логика. C — язык совсем другого (более низкого) уровня, так что сравнивать ошибки в функционале WL и в компиляторах С — некорректно. Вам нужно бы сравнивать ошибки в WL c ошибками в соответствующих библиотеках, выдающих функционал высокого уровня — и тут как раз логика обратная, так как у WL как универсального пакета более широкая аудитория. Я уже не говорю о самописных решениях.

    > WL имеет куда меньшее быстродействие, чем, скажем, C++

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

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

    > WL не является математически правильным.

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

    > WL — это не свободное ПО

    Верно. У этого есть как минусы, так и плюсы, см. выше

    > Так вот, симулятор написан на C++, в том числе код, выполняющий расчёты (решение диффуров и систем линейных уравнений). И разумеется, не на WL, потому что нет нужного быстродействия, нет должного доверия к этому WL, и вообще WL здесь было бы использовать несерьёзно.

    Это лишь мнение разработчиков конкретной компании. Вполне уважая его, я могу привести сходу несколько известных мне примеров не менее ответственных и «денеженых» проектов, где WL (Mathematica) использовался как основной инструмент имплементации.

    > Так вот, я вам скажу, что формальная математика \[LongDash] это единственный способ проводить математические манипуляции на компьютере так, чтобы быть уверенным в их математической правильности.

    Нет, не единственный. Самый главный метод не поменялся за многие сотни лет — это использовать голову и проверять результаты различными способами. Если Вы не можете сделать этого для какой-либо задачи, значит у Вас нет достаточного понимания этой задачи, независимо от того, какой инструмент Вы используете.

    > Для нематематических задач WL использовать вообще нельзя.

    Это неверно. Давайте приведу два примера. Сама Mathematica (WL) написана в значительной степени на самой себе, а это миллионы строк кода. Система WolframAlphа написана почти полностью на WL, а это десятки миллионов строк кода.

    > Итог. WL \[LongDash] это просто игрушка. Это инструмент студента, но не учёного.

    А вы расскажите это всему сообществу физиков — теоретиков (к которому в прошлом принадлежал и Ваш покорный слуга), среди которого WL — один из самых популярных инструментов. Могу сказать за себя — результаты нескольких моих научных работ были получены с очень большой опорой на Mathematica

    >Вряд ли, скажем, данные с большого андронного коллайдера обсчитываются на WL.

    А Вы проверяли? Вот, например, ссылка, опровергающая Ваше утверждение

    www.wolfram.com/mathematica/customer-stories/scientists-at-cern-use-mathematica-to-create-quark-gluon-plasma-state-of-matter.html

    > Если что-то заинтересовало в этом посте (формальная математика, функциональное программирование, и т. д.), спрашивайте, я отвечу.

    Спрашивать мне у Вас нечего, но позвольте дать Вам совет: прежде чем публиковать такого р


    1. Arastas
      20.07.2015 20:37

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

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

      Вот тут и приходит на помощь OpenSource. Кроме того, вы правда считаете, что у Mathematica больше пользователей, чем, например, у библиотек Fortran? Или NumPy?

      Вполне уважая его, я могу привести сходу несколько известных мне примеров не менее ответственных и «денеженых» проектов, где WL (Mathematica) использовался как основной инструмент имплементации.

      Приведите, пожалуйста. Этого очень не хватает.


      1. SirEdvin
        20.07.2015 20:54

        Добрый день, извините, что отвечаю на ней мой вопрос, но…

        Вот тут и приходит на помощь OpenSource. Кроме того, вы правда считаете, что у Mathematica больше пользователей, чем, например, у библиотек Fortran? Или NumPy?

        Как минимум, большое число ученых (даже в Церн (выше по ссылке)) ну и значительное количество студентов.
        (Про Fortran я не буду вспоминать, ибо его популярность весьма низкая)
        Сколько тех же студентов будет использовать Python и тем более NymPy?


      1. LeonidShifrin
        20.07.2015 21:32
        +1

        Arastas, добрый день.

        > Вот тут и приходит на помощь OpenSource. Кроме того, вы правда считаете, что у Mathematica больше пользователей, чем, например, у библиотек Fortran? Или NumPy?

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

        Во-вторых, Mathematica не требует того уровня специальных знаний (знаний библиотек), которые требуются при использовании скажем библиотек Fortran (попробуйте, например, разобраться в руководстве LAPACK и грамотно использовать его за 10 минут), и в меньшей степени NumPy. При этом, зачастую «под капотом» используются эти самые библиотеки (как скажем в случае с LAPACK).

        Наконец, в третьих, возможности интеграции Mathematica c другими языками часто дают возможность прямо из Mathematica вызывать те библиотеки в других языках, функционал которых требуется и почему-либо отсутствует в Mathematica. Это так для С и Fortran (можно подгружать динамические библиотеки прямо в ядро Mathematica через LibraryLink), а также Java (через J/Link), .Net (через .Net/Link), R (через RLink — мой скромный вклад в Mathematica linking technologies). К сожалению, пока нет PythonLink, но я уверен что его появление — вопрос ближайшего будущего.

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

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

        > Приведите, пожалуйста. Этого очень не хватает.

        Ну вот например, с сайта WRI:

        www.wolfram.com/mathematica/customer-stories/global-hedge-fund-develops-enterprise-wide-platform-with-mathematica.html

        www.wolfram.com/mathematica/customer-stories/flight-operational-safety-analysis-with-mathematica.html

        www.wolfram.com/mathematica/customer-stories/quality-control-measuring-true-performance-with-mathematica.html

        Это только те случаи, где я лично знаю людей, ответственных за использование Mathematica в соответствующих проектах.

        Я не скажу, что таких проектов огромное количество, но они есть, и весьма успешные.


        1. Arastas
          20.07.2015 21:37

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

          Давайте не будем лукавить. Студенты и (иногда) преподаватели — это не то профессиональное сообщество, которое будет вылавливать тонкие нюансы в реализации библиотек.
          Я не оспариваю того факта, что Mathematica широко используется в серьезных проектах, но мне представляется, что профессиональное сообщество Fortran несколько больше.


          1. LeonidShifrin
            20.07.2015 22:11
            +1

            Честно говоря, у меня нет данных на эту тему. Возможно Вы и правы.

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

            Так вот, я обычно использовал Mathematica, а мой шеф (один из ведущих мировых экспертов в своей области) — Fortran, и к Mathematica относился в плане численных расчетов достаточно скептически (а для аналитики использовал Maple). Пару лет назад я был в Штатах и навестил его. С удивлением узнал, что он перешел на Mathematica (в силу ряда технических причин).

            Вообще, из того что я видел на семинарах, которые я посещал в бытность свою аспирантом и постдоком, достаточно большой процент специалистов использовал Mathematica наравне с или вместо Fortran. Это еще зависело от специфики. Скажем, теоретики больше использовали Mathematica, в то время как экспериментаторы тяготели к Fortran и Python / NumPy.


    1. SirEdvin
      20.07.2015 20:41
      +2

      Это было бы так, если бы WL не был построен на не очень большом числе весьма общих принципов. Такая фраза без уточнения и расшифровки — неверное и поверхностное суждение о языке.

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


      1. OsipovRoman
        20.07.2015 21:27

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


        1. SirEdvin
          20.07.2015 21:49

          Я не говорю, что мне это не нравится. Вы правы, что это может оказаться весьма полезным и все же, нельзя делать вид, что того факта, что эти все функции существуют независимо друг от друга.
          Я не говорю, что это плохо, но то, что в Mathematica из языка для описания математики постепенно превращается в сборную солянку из полезных инструментов. Например, функция Classify. Безумно полезная функция и ее возможности поражают меня, но в системе для работы с математикой (я привык воспринимать Mathematica) она смотрится немного странно.


          1. OsipovRoman
            20.07.2015 22:02

            Я понимаю о чем вы. Но концепция Wolfram Language начавшись с математики, теперь стремится уже объять мир. В принципе, сама наука математика делает тоже самое. Когда-то трудно было представить ее использование в биологии, химии или лингвистике, но теперь это передовые направления.
            Вообще Wolfram Research в том числе Research и потому, что делает многое необычно, по-новому. Сначала все смеялись над Wolfram|Alpha, потом ее интегрировали с Siri, затем с Bing, теперь уже и Google идет в каком-то смысле по пути Wolfram|Alpha.

            На самом деле все функции Wolfram Language показывают чудесную мысль — вычислимости всего. Любой объект есть функциональная конструкция: функция Sin, документ Mathematica или его ячейка, изображение, облачный интерфейс или интерактивное приложение. Всюду используются стандартные принципы, единые и простые. В этом и красота. Я люблю Wolfram Language именно за это.


        1. Shtirliz
          25.07.2015 15:53

          А как с «не специалистами» детьми, например, или домохозяйками? Когда то давно, бытовал тезис, что программирование как умение будет обязательным для любого образованного человека. Может WL претендовать на первый ЯП для детей? Или для не математика и IT-специалиста?


          1. OsipovRoman
            25.07.2015 16:18

            В настоящее время мы ведем переговоры (они во многом положительно окончены уже) с одним из лучших (если не самым лучшим) лицеем информационных технологий в Росиии — Лицеем 1533 о том, чтобы как раз Wolfram Language стал первым языком программирования для лицеистов. После него они будут учить еще множество языков (C, Java, JavaScript, C++, Python и др.).
            Это решение очень разумно, так как Wolfram Language прост в изучении и дает ребятам сразу огромные возможности. И это понимает руководство лицея.
            К тому же у Wolfram Research будет скоро онлайн система обучения на основе Wolfram Cloud, которая будет учить детей и всех желающих программированию на Wolfram Language бесплатно и на очень интересных примерах.


      1. LeonidShifrin
        20.07.2015 22:29

        > Сначала в WL была только математика и все было нормально, но потом туда начали добавлять различные странные функции типа вывода флага и прочего. Оно конечно выглядит хорошо, но превращает язык для описания математики в сборную солянку всякого.
        Или я не прав?

        Я немного не об этом говорил. Встроенные функции типа тех, что Вы упоминаете — это ведь по сути библиотеки, просто несколько (часто значительно) лучше интегрированные с основным языком и друг с другом. Я говорил о принципах, на которых построен основной язык. Хотя в Mathematica / WL нет формального разделения на основной язык и специализированный функционал, тем не менее такое разделение можно провести достаточно четко. В основной язык войдут общие конструкции, дающие поддержку основных структур (списки, ассоциации) и действий над ними, поддержка различных стилей программирования (процедурный, функциональный, логический), базовые конструкции языка (циклы, операторы ветвления, локализация переменных, и др.), и другие подобного рода вещи. Их будет где-то 150 — 200 штук. Это довольно много, но все же не несколько тысяч.

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

        stackoverflow.com/a/4435720

        Так что говорить, что Mathematica просто сборная солянка — это значит не понимать ее суть. Есть основной язык, а есть специализированный функционал, который в других языках был бы в библиотеках. В Mathematica, между этими частями нет формального разделения. Так что если в чем-то ее и упрекать, так это как раз в отсутствии такого разделения (но тут нужно понимать, что в этом есть и свои плюсы, особенно в плане интеграции всех компонент друг с другом). Вам же не придет в голову упрекать библиотеки языка в том, что там «слишком много всего». Я здесь совершенно не касаюсь темы актуальности тех или иных добавляемых функций, это отдельная тема.


  1. Tiberius
    22.07.2015 23:28
    +1

    Интересно послушать иное мнение, конечно, но автор статьи как-то уж слишком с плеча рубит, ИМХО, обзывается «несерьёзными научными исследованиями» и прочее

    Вот Вы говорите, мол пишите сами решение диф. уравнений на С, python или каком-то другом языке, но вот положа руку на сердце, скажите, пожалуйста, а сколько же строк кода должен написать химик, к примеру, чтобы решить дифур (а вся хим.кинетика — это диффуры)? У меня такое ощущение, что очень много… очень-очень… Да, можно скачать где-то библиотеку, но в WL уже всё готово — нужно вызвать только готовую функцию, как для Yupi: «просто добавь воды данных». При этом Mathematica позволят превращать в символы сложные выражения и оперировать с ними — ну а что ещё надо? Красиво — красиво, наглядно — наглядно, можно в статью вставить, можно студенту показать и он всё поймёт, как и что считается.

    Другое дело, если надо создать программу, которая и управлять прибором будет, и данные собирать, и обсчитывать что-то, тогда, да, можно и на python запрограммировать всё. У каждого языка и каждого ПО есть своя область применения и не стоит натягивать ненатягиваемое на глобус.


  1. valent_in_habrahabr
    26.07.2015 18:14
    +2

    Заинтересовало название статьи. Зашел прочитать и не понял к чему всё это. Прочитал комментарии — стало понятно и даже интересно это направление. Спасибо людям за полезные комментарии.