Ru-Board.club
← Вернуться в раздел «Программы»

» Mathematica (математика)

Автор: karl_karlsson
Дата сообщения: 25.11.2010 18:07
Говорят что это баг из 7.
Перестановку не заметил, конечно, но все же ответ не верен. Вне зависимости от порядка суммирования выражение является линейным по p, и p отсутствует только там где имеется r.

Sum[Sum[p*(-1)^(i + j + k), {i, 1, k}] + 2 r, {k, 1, j}]
1/2 (1+2 (-1)^(2 j)+2 j^3+2 p^2+2 r)


Sum[Sum[p*(-1)^(i + j + k), {k, 1, j}] + 2 r, {i, 1, k}]
1/4 ((-1)^j p-(-1)^(2 j) p-(-1)^(j+k) p+(-1)^(2 j+k) p+8 k r)

Добавлено:
Еще более выражение является линейным по p*(-1)^j, и p*(-1)^j отсутствует только там где имеется r.

Добавлено:
Mathematica 8

Maple 14
Автор: terminat0r
Дата сообщения: 26.11.2010 13:26
karl_karlsson

Цитата:
Говорят что это баг из 7.

Кто говорит? Вы вольфрамовцам выслали уже?

Кстати нигде не могу найти список багов, как например для http://maple.bug-list.org.
По-моему, очень не хватает пользователям математики еще одного г-на Бондаренко. Рыть в comp.soft-sys.math.mathematica очень непродуктивно. Что-то делается в эту сторону но уж слишком медленно http://code.google.com/p/mathematica/
Автор: r_green
Дата сообщения: 26.11.2010 19:41

Код: Sum[p + (-1)^(k + 1)* (1 + (-1)^(k)), {k, 1, j}]
Автор: popkov
Дата сообщения: 26.11.2010 23:29
karl_karlsson
r_green
А вот результаты из версии 5.2:
[no]In[1]:=
Sum[Sum[p*(-1)^(i+k)*(-1)^j,{i,1,k}]+2 r,{k,1,j}]//InputForm

Out[1]//InputForm=
(-p + (-1)^j*p + 2*(-1)^j*j*p + 8*j*r)/4

In[2]:=
Sum[Sum[p*(-1)^(i+k)*(-1)^j,{k,1,j}]+2 r,{i,1,k}]//InputForm

Out[2]//InputForm=
(-p + (-1)^j*p + (-1)^k*p - (-1)^(j + k)*p + 8*k*r)/4

In[3]:=
Sum[p+(-1)^(k+1)*(1+(-1)^(k)),{k,1,j}]//InputForm

Out[3]//InputForm=
(1 - (-1)^j)/2 - j + j*p[/no]

Вроде по виду все правильно. Все-таки не зря я всегда держу под рукой и 5-ку тоже! Доверяю ей больше: это последняя версия перед началом "раздутия" системы как мыльного пузыря...

Добавлено:
terminat0r

Цитата:
Кстати нигде не могу найти список багов

В официальной группе новостей периодически поднимается этот вопрос. Вот, например, самый последний пост на эту тему. Однако WR просто игнорируют такие посты последнее время. Раньше они писали, что знание о исправленных багах слишком смущает многих пользователей, которые восклицают: "Как мы можем доверять теперь, если раньше, как оказалось, были обмануты?!" Незнание - благо для быдла...
Автор: karl_karlsson
Дата сообщения: 27.11.2010 00:23
terminat0r

Цитата:
Кто говорит? Вы вольфрамовцам выслали уже?

Не знаю.
Иначе, к сожалению, Владимир Бондаренко почему то не обновляет maple.bug-list.org.

r_green
Вот еще если написать
Код: Unprotect[Sum];
Sum[Plus[a_,b_],i_]:=Sum[a,i]+Sum[b,i]
Protect[Sum];
Sum[Sum[p*(-1)^(i + j + k), {i, 1, k}] + 2*r, {k, 1, j}]
Автор: popkov
Дата сообщения: 27.11.2010 00:53
karl_karlsson

Цитата:

Ну такой вопросик - там 5.0, 5.1, 5.2, 5.3. Разница какая то имеется?

Про 5.3 слышу впервые. Она доступна?
Разница между 5.1 и 5.2 маленькая, несколько мелких доработок.
Автор: karl_karlsson
Дата сообщения: 27.11.2010 01:03
popkov

Цитата:
Про 5.3 слышу впервые. Она доступна?

Не вспомню совсем точно, вполне возможно как и 7.0.2 - только для Линукс. SuSE 9 был тогда у меня для математики. Ну перешел в основном только на Windows, хотя SuSE еще имеется.
А возможно я что то о 6.0.3 подумал.
Автор: popkov
Дата сообщения: 27.11.2010 01:14
karl_karlsson
На Walking Randomly недавно было высказано общее впечатление, что пользователей Linux разработчики воспринимают как второсортных: в Linux-версии не работают некоторые функции, напр. в 8-ке ImageCapture[], проблемы со шрифтами и т.п.
Автор: karl_karlsson
Дата сообщения: 27.11.2010 01:26
popkov
Тоже заметил такое, и очень часто падала совсем. Кроме того GUI на Линукс у 5-той очень, так сказать, не доходило до того что у Windows было. Mac тоже имеется, но он древнейший PowerPC, они на Intel перешли немного позже... Windows не идеален, но с наименьшей затратой усилии и денег все работает как надо (или ближе).
Автор: Griefin
Дата сообщения: 27.11.2010 02:12
karl_karlsson

Цитата:
Кроме того GUI на Линукс у 5-той очень, так сказать, не доходило до того что у Windows было.

Это последствия линуксовой политики "Stable API Nonsence". Вместо одного вменяемого API их два или три, и в каждом чего-то не хватает. 5-ка была последней версией, которая использовала устаревшую библиотеку Motif. Никакого сглаживания шрифтов и прочего. Из-за этого 6-ю версию для Linux довольно долго переписывали на Qt.

Сейчас пробую на практике генерацию кода и компилируемые функции. Mathematica просит установить какой-нибудь сишный компилятор. Не подскажет ли кто-нибудь некий минимальный пакет с компилятором для Windows, чтобы не надо было тянуть и ставить весь Visual Studio?

Добавлено:
А... можно же Intel Compiler или MinGW поставить.
Автор: popkov
Дата сообщения: 27.11.2010 02:24
Кстати, насчет багов. Недавно появился весьма откровенный ответ одного из ведущих разработчиков WR на сообщение о серьезном баге в функции [no]CDF[MultinormalDistribution[...]][/no], являющейся в 7-ке частью пакета "MultivariateStatistics`", а в 8-ке полностью интегрированной в ядро. Вот что он пишет:

Цитата:
The results for these 6-dimensional cases are roughly the same in
version 8 as they are in version 7. <...> For 2 and 3
dimensional normals, special case code is now used in version 8 which
gets more precise results than in version 7 in your examples.

Т.е. ясно: ранее в WR было обнаружено, что для случаев с размерностью выше 1 код пакета 7-ки дает неправильные результаты. И вот решение: в 8-ке случаи с размерностью 2 и 3 теперь рассматриваются как "особые", чтобы результаты были хотя бы удобоваримы. О размерностях выше 3 этот ведущий разработчик предпочел просто "забыть": зачем напрягать мозги, да и нечасто встречаются пользователи, которым это нужно...

Но вот что интересно далее:

Цитата:
The following approach to computing the values you are after was
provided by my colleague Sasha Pavlyk

Замечательно и характерно, что решение проблемы было найдено не ведущим разработчиком, а никому не известным сотрудником Сашей Павлюком, наверняка выходцем из бывшего СССР. Вообще, Бондаренко как-то обмолвился, что наибольший прогресс в развитии Mathematica наблюдался при переходе к версии 2.7 (если мне не изменяет память). Дата точного выхода этой версии мне неизвестна, но она приходится где-то на 1994-1996 гг., т.е. на тот период, когда в США и Европу уже имигрировали вот уже несколько лет лучшие российские ученые в качестве дешевой высококвалифицированной рабочей силы. В тот период и число сотрудников Wolfram Research, согласно биографическому сайту Вольфрама, резко возросло (но потом некоторое время оставалось примерно стабильным). Выводы напрашиваются сами... В настоящее время, очевидно, многие русские оттуда уволены, а оставшиеся находятся где-то на задворках, обычно безымянны и никому не известны. Однако отрадно, что даже "ведущим сотрудникам" WR иногда хватает внутренней честности проговариваться... Для наших собственных, российских мажоров, "академиков" и даже "профессоров" подобная честность является чем-то невероятным (знаю по собственному опыту работы в науке).
Автор: Griefin
Дата сообщения: 27.11.2010 04:22
popkov
Да, это украинец. Зовут его Александр Павлык. Когда я был студентом, он приезжал с докладом про Mathematica.
Автор: popkov
Дата сообщения: 27.11.2010 07:37
Griefin
Прикольно!
А в каком году это было?
Автор: popkov
Дата сообщения: 27.11.2010 11:36
Еще один любопытный тред в группе новостей. На этот раз речь о круто усовершенствованной функции Solve[] 8-ки.

Вот задача:

eq1 = (b + d + f)/x - (a + b)/(1 + x) - 2*(c + d + e)/(1 + 2*x + y) -
(f + g)/(x + y) == 0
eq2 = (e + g)/y - (c + d + e)/(1 + 2*x + y) - (f + g)/(x + y) == 0

Timing[sols = Solve[{eq1, eq2}, {x, y}];]

Вот результаты на моем стареньком ноуте:

1) Mathematica 5.2:

{8.713 Second, Null}

2) Mathematica 7.0.1:

{100.004, Null}

8-ки пока не имею, но из треда ясно, что 8-ка в данном случае конкретно подвисает даже на мощных машинах, не чета моей.

Сотрудники WR в данном случае предлагают использовать старый Solve через Method->"Legacy":

Timing[sols = Solve[{eq1, eq2}, {x, y}, Method->"Legacy"];]

Кто имеет все три версии (5, 7 и 8), потестите, пожалуйста. Любопытно, так ли быстро работает в 8-ке старый Solve[], как и в 7-ке, и каков порядок различий в скорости между версиями?
Автор: r_green
Дата сообщения: 27.11.2010 12:04

Цитата:
Не подскажет ли кто-нибудь некий минимальный пакет с компилятором для Windows, чтобы не надо было тянуть и ставить весь Visual Studio?

Visual C++ Express.

Автор: karl_karlsson
Дата сообщения: 27.11.2010 13:39
Griefin
Ну если у вас Maple там и так Watcom имеется.

popkov

Цитата:
Вообще, Бондаренко как-то обмолвился, что наибольший прогресс в развитии Mathematica наблюдался при переходе к версии 2.7 (если мне не изменяет память). Дата точного выхода этой версии мне неизвестна, но она приходится где-то на 1994-1996 гг., т.е. на тот период, когда в США и Европу уже имигрировали вот уже несколько лет лучшие российские ученые в качестве дешевой высококвалифицированной рабочей силы.

Не только из СССР, но и из всей восточной Европы, даже из всей Европы.


Цитата:
Сотрудники WR в данном случае предлагают...

Adam Strzebonski, кажется из, Польши. Вот что он пишет:

Цитата:
I have been a member of the Wolfram Research R&D team since 1993.



Цитата:
Для наших собственных, российских мажоров, "академиков" и даже "профессоров" подобная честность является чем-то невероятным (знаю по собственному опыту работы в науке).

Такое по всего мира наблюдается, думаю.

Вот функция Solve.

Mathematica 5.1
{9.953 Second, Null}

Mathematica 7.0.1
{59.312, Null}

Mathematica 8.0.0
Method -> "Legacy"
{64.891, Null}

Попробую что получается, если Legacy нет.
Автор: Griefin
Дата сообщения: 27.11.2010 14:07
popkov
В 2005-м. Об этом страница даже на веб-сайте все еще сохранилась: http://www.wolfram.com/services/seminars/russia2005/schedule.html
Автор: r_green
Дата сообщения: 27.11.2010 15:12
karl_karlsson

Цитата:
Mathematica 5.1
{9.953 Second, Null}

Mathematica 7.0.1
{59.312, Null}

Mathematica 8.0.0
Method -> "Legacy"
{64.891, Null}

Прогресс налицо

В support писали?
Автор: popkov
Дата сообщения: 27.11.2010 15:57
r_green
Разработчики уже знают о тормозах 8-ки по сравнению с 7-кой. По извиняющемуся тону разработчика можно понять, что его искренне смутила новость. Не уверен, правда, что ему известны результаты сравнения с 5-кой. Допускаю, что такое сравнение его бы убило, как оно, похоже, уже убило совесть у многих руководителей отделов в WR. Каждый там стремится пустить пыль в глаза: такова стратегия развития корпорации. Большей части пользователей нужны "свистелки и перделки", они же и приносят доход...
Автор: r_green
Дата сообщения: 28.11.2010 12:19
popkov

Цитата:
такова стратегия развития корпорации. Большей части пользователей нужны "свистелки и перделки", они же и приносят доход

Хотя, IMHO, надо отдать им должное - "свистелки" прикручивают довольно аккуратно, без нарушения основных концепций продукта.
Распыление ресурсов, видимо, сказывается...
Вообще, при достижении программым продуктом некоторого порога сложности необходимо радикально менять внутреннюю архитектуру, иначе управляемость падает, а сложность разработки начинает расти неадекватно... а радикальные шаги требуют серьёзных инвестиций...
Автор: popkov
Дата сообщения: 28.11.2010 18:50
r_green

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

Согласен в большинстве случаев, но по отношению к системе Mathematica - лишь отчасти. Дело в том, что эта система - исключительный пример продукта, первоначально создававшегося действительно грамотными специалистами именно так, как им хочется! Я подчеркиваю: выдающиеся профессионалы для самих себя создавали и создали инструмент, концепция которого была ими же с самого начала продумана, без давления со стороны руководства, без строгой отчетности, при наличии избытка времени. И при возможности учитывать опыт предыдущих также весьма успешных разработок, в первую очередь системы Macsyma, потомок которой Maxima жив до сих пор и все еще имеет множество пользователей. В общем, не часто творческим и высокообразованным людям выпадает шанс делать, что хочется, имея время и деньги. Главная заслуга Вольфрама - именно в этом: он не давил, ничего не навязывал, не торопил, не требовал отчетности. Люди наслаждались творческим процессом. Получился продукт, изначально и в самой своей основе едва ли не гениально устроенный. Его изначальную архитектуру не нужно менять: она чудесна и разработана с учетом весьма далекой перспективы! Другое дело, что, как и в любую кормушку, в этот проект постепенно пролезало все больше ничтожеств с бюрократическим мышлением. В результате накапливалось все больше кривых решений, а изначальная перспектива уходила из мышления разработчиков, её все меньше понимали (вероятно, и разработчиков также постепенно "уходили"). В настоящее время имеет место тупая эксплуатация языка, потому что его цельность многократно и на разные лады нарушена. Фактически, надо откатываться к первым версиям системы и переделывать все заново, восстановив изначальную перспективу краткости, ясности и гибкости, без бюрократизма. Возмножно, и там уже были зачатки позднейшего замутнения языка, но на них в то время легко было закрыть глаза. Сейчас - все знают - Вольфрам открыто измеряет развитие Mathematica количеством встроенных функций и числом строк исходного кода на СИ (см. его биографический сайт). Он уже не способен понять, насколько позорна и отвратительна такая позиция по отношению к продукту, созданному математиками! Математики всегда стремились описать максимально широкий диапазон явлений минимумом понятий и формул. Теперь же в системе Mathematica чем дальше, тем больше дублирующих друг друга функций с разными названиями и зачастую не вполне совместимым синтаксисом. И весь этот мусор пользователь должен помнить!
Автор: popkov
Дата сообщения: 29.11.2010 05:44
Кстати, Daniel Lichtblau (Wolfram Research) вчера вступил (сугубо лично, т.е. не от лица корпорации, конечно) в дискусию о возможности создания официального Mathematica bug list и изложил свои аргументы против:


Цитата:
I will make some comments on various social and technical aspects.

(1) It is difficult to navigate between bugs vs. intentional and justifiable changes (with new "features" falling in the middle). I generally can address such things when writing replies as an individual. I am not so sure how well this transfers to corporate "official responsa", so to speak.

(2) It is easy to get into awkward situations where some users will claim that changes in behavior are bugs, when we at WRI opine otherwise. While I agree that having a publicly available set of workarounds can be useful (and recently posted one such), I do not like the idea of appearing to endorse that some changes are bugs. Obviously, the ones we agree are bugs do not fall prey to this problem. But I can say from past experience that a lot of energy and patience can be spent on such issues, and I'd not want to see that sort of problem elevated to corporate status.

(3) It is not easy to get this information to users who might need it. We do not always recognize when a question involves an issue in this territory. And most people who have such questions are not likely to be MathGroup readers (specifically, your "we could check out the fixes" is far from "most users would..."). The upshot is we might often face ignorance on both our end (when we fail to recognize this type of an FAQ) and the user's. This of course does not make having a workaround list a bad idea: it simply indicates why it might be of limited use.

(4) It can be difficult to write an FAQ in such a way that it is clear to most readers. So we could end up doing work that has little applicability. I believe our experience is that this is an issue, but not a serious one (meaning, an FAQ can be generally useful as a first line of defense).

I myself tend to be neutral on this. I simply want to indicate reasons why it could cause more work than it is worth (both for WRI and users).

I should mention explicitly that I am not speaking for Wolfram Research on this matter.

Daniel Lichtblau
Wolfram Research


Как видите, ответ откровенен настолько, насколько вообще может быть откровенным официальное лицо (если не более!). Как и следовало ожидать, главная причина нежелания создавать FAQ - трудности для сотрудников компании, к которым это приведет. Однако этот человек остается открытым для конструктивной дискуссии!
Автор: r_green
Дата сообщения: 29.11.2010 20:04
popkov
Спасибо за обстоятельный ответ.

Цитата:
Сейчас - все знают - Вольфрам открыто измеряет развитие Mathematica количеством встроенных функций и числом строк исходного кода на СИ (см. его биографический сайт). Он уже не способен понять, насколько позорна и отвратительна такая позиция по отношению к продукту, созданному математиками! Математики всегда стремились описать максимально широкий диапазон явлений минимумом понятий и формул.

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

Кстати, какое из нововведений в Mathematica, на Ваш взгляд, было характерно кривым?
Автор: popkov
Дата сообщения: 30.11.2010 13:19
r_green

Цитата:
Кстати, какое из нововведений в Mathematica, на Ваш взгляд, было характерно кривым?


Очень кривым было добавление "symbolic preprocessing" в функции, являющиеся по определению числовыми, не символьными. Уже в 5-й версии это часто создавало проблемы с такими базовыми функциями, как Plot[] и FindRoot[]. Начиная с 6-ки, можно было уже рвать на себе волосы: перестали нормально работать едва ли не все встроенные числовые функции! Теперь у каждой из них имеется встроенный "symbolic preprocessing", который обычно не отключается никакой опцией (в единичных случаях имеется недокументированная опция) и приводит к зависанию на простейших задачах, мгновенно решавшихся в предыдущих версиях. Да, обходной путь существует (и наконец-то иногда документирован, хоть вскользь) - но он замедляет работу, удлинняет код и просто является "граблями". Причем обнаружить причину зависания программы, написанной для старой версии системы, пользователю, не знающему об этой "фиче", может стоит больших нервов!

Но самые серьезные проблемы создает, конечно, далеко не полная и далеко не всегда адекватная документация.
Сам я (в практическом плане) знаком с системой только начиная с 5-й версии. Если не отвлекаться на мелочи, то, пожалуй, мало кто поспорит, что реализация важнейшего в Mathematica механизма - pattern matсhing - на котором основана работа в т.ч. и "обычных" функций типа
[no]f[x_]:=x^2;[/no]
(такие функции Леонид Шифрин называют "rule-based functions" в противоположность "pure functions") как минимум столь плохо документирована, что является теми "граблями", на которые неизбежно наступает многократно не только начинающий, но также и опытный пользователь. Характерно, что документация по паттернам самая ясная в The Mathematica book для системы версии... 1 (доступна на оффсайте). Там коротко, но ясно дается хотя бы введение в эту область. Уже документация к версии 2 мутновата. В документации к новым версиям просто черт ногу сломит. Например, неясно, зачем в 3-й версии понадобилось вводить дополнительную функцию HoldPattern, единственное предназначение которой - препятствовать "выполнению" паттернов, хотя того же (вроде бы) можно достичь с помощью Unevaluated, а иногда и вовсе без подобных ухищрений (зачем такие выражения как x_*x_ превращаются в x_^2 при выполнении - отдельный вопрос; само по себе это столь интуитивно неочевидно, что даже опытные пользователи регулярно наступают на эти "грабли"). Грамотная работа даже с такой обычной функцией как Cases[] требует глубокого понимания работы паттернов, которого документация не дает. А ведь паттерны - это базис всего языка!..

На протяжении всего времени существования системы она не имела адекватной документации даже по важнейшим функциям и содержала огромное количество и вовсе недокументированных. Такая тенденция к скрывательству в конечном счете нанесла удар по самим разработчикам: новые сотрудники компании просто не знают многих "фокусов", позволяющих эффективно пользоваться важнейшими функциями! И уж тем более нигде не прописаны особенности реализации, делающие одни функции более совместимыми с другими - но не с их дубликатами, обладающими сходным функционалом. То, что новые функции почти все неадекватно тормозные и зачастую обладают запутанной системой опций (яркий пример - Histogram[], но то же можно сказать и о новых NIntegrate[], DSolve[] и др.) - одно из следствий.
Автор: r_green
Дата сообщения: 30.11.2010 17:08
popkov

Цитата:
очень кривым было добавление "symbolic preprocessing" в функции, являющиеся по определению числовыми, не символьными.

Мне кажется, этот шаг в принципе оправдан. Любой численный алгоритм, оперующий входной ф-цией как чёрным ящиком (т.е. фактически табличным представлением этой ф-ции), сильно ограничен. Другими словами, достаточно сложный алгоритм в вынужден строить (хотя бы частично и неявно) аналитическое представление входной ф-ции, выполняя своего рода reverse engineering. Чего можно избежать, сразу дав ему ф-цию в виде выражения.
Например, тот же NIntegrate для быстро осциллирующих ф-ций. Насколько мне известно, благодаря "symbolic preprocessing" Mathematica значительно продвинулась в интегрировании таких ф-ций, опередив Maple.


Цитата:
неясно, зачем в 3-й версии понадобилось вводить дополнительную функцию HoldPattern, единственное предназначение которой - препятствовать "выполнению" паттернов, хотя того же (вроде бы) можно достичь с помощью Unevaluated

Насколько я понимаю, это всё-таки разные ф-ции. Unevaluated/Evaluate служат для явного переопределения Hold-атрибутов ф-ции, применительно к её аргументам. Т.е. они определяют то, что получит целевая ф-ция после вычисления(evaluation) её аргументов. Напротив, Hold, HoldPattern позволяют контролировать обработку аргумента самой этой ф-цией. Оборачивая аргумент в Hold-подобные ф-ции, мы как бы делаем ему оболочку, которую может "снять" только нужная нам ф-ция. Например, Hold - по сути безусловная защита от вычисления, HoldPattern - "снимается" ф-циями, оперирующими паттернами.






Автор: popkov
Дата сообщения: 30.11.2010 21:31
Кстати, вот один баг, перекочевавший еще из самой первой версии Mathematica:

[no]In[1]:= f[Infinity] - f[Infinity]

Out[1]= 0

In[2]:= f[x_] = x;
f[Infinity] - f[Infinity]

During evaluation of In[2]:= \[Infinity]::indet: Indeterminate expression -\[Infinity]+\[Infinity] encountered. >>

Out[3]= Indeterminate[/no]

Очевидно, первый результат неверен.

Или вот еще один древнейший баг:

In[1]:= N[Sin[3141592653589793238]]

Out[1]= -0.64475

In[2]:= N[Sin[3141592653589793238], 6]

Out[2]= -0.446315

Здесь в обоих случаях берется синус точной величины. Причем единственный способ узнать, чему же равен синус такой величины, - использовать N[], т.к.

In[3]:= Sin[3141592653589793238]

Out[3]= Sin[3141592653589793238]

Однако, как легко видеть, здесь-то мы и попадаем в ловушку: результат такого очевидного (и предписанного документацией) действия оказывается неверен, если мы не зададим значение Precision для результата! Глядя на такие чудеса, начинаешь думать: имеет ли вообще смысл использовать N[] без указания целевой точности? Результат никем не гарантирован...

Добавлено:
r_green

Цитата:
Другими словами, достаточно сложный алгоритм в вынужден строить (хотя бы частично и неявно) аналитическое представление входной ф-ции, выполняя своего рода reverse engineering. Чего можно избежать, сразу дав ему ф-цию в виде выражения.

Для этого есть символьный Integrate[]. В практических задачах обычно никакой символьный анализ помочь не может - NIntegrate просто не должен совать нос не в свою область. Его задача - работать с функцией именно как с "черным ящиком". Редкие случаи (по сути, единичные классы задач), когда и правда возможно некоторое ускорение или увеличение точности за счет символьного анализа, должны быть частью символьной функции. Или уж, если на то пошло, этот дополнительный "мозг" должен быть легко отключаем без потерь, чего не наблюдается.

Ну да ладно с NIntegrate. А как насчет Plot[] (и всех остальных: ContourPlot[] и т.д.)? Как насчет FindMinimum[], да еще если однозначно указан метод, не требующий взятия производных, например "QuasiNewton" или "PrincipalAxis"? Зачем тут символьный анализ? Пользователь ожидает, что система будет действовать по известному алгоритму. Лишний "мозг" только вызывает недоумение и головную боль. В том, что поведение именно таково, нетрудно убедиться:

f[x_ /; Not@NumericQ[x]] := (Print["Symbolic evaluation"]; 2);
f[x_?NumericQ] := 1
Plot[f[x], {x, 1, 2}]

f[x_?NumericQ] := (Print["Numerical evaluation"]; 1)
Attributes[FindMinimum]
FindMinimum[f[x], {x, 0, 1}, Method -> "PrincipalAxis"]
FindMinimum[f[x], {x, 0, 1}, Method -> "QuasiNewton"]
(обратите внимание, что FindMinimum вообще не пытается изучить функцию численно, он уже все "знает". )


Цитата:
мы как бы делаем ему оболочку, которую может "снять" только нужная нам ф-ция.

А почему бы не присвоить атрибут HoldRest тому же MatchQ[], чтобы не нужно было по любому поводу использовать HoldPattern? Да и вообще, зачем нужно "выполнять" выражения типа x_*x_ или, например, [no]Times[___, Power[___], ___][/no] (т.е. явно состоящие из паттернов)?

Вот пример реально возникшей у пользователя проблемы (False в первом случае) и несколько вариантов её решения:
[no]x = 2;
MatchQ[Times[-1, Power[s, -1]], Times[___, Power[___ /; x == 2], ___]]
MatchQ[Times[-1, Power[s, -1]],
HoldPattern@Times[___, Power[___ /; x == 2], ___]]
MatchQ[Times[-1, Power[s, -1]],
Unevaluated@Times[___, Power[___ /; x == 2], ___]]
Unprotect[MatchQ];
SetAttributes[MatchQ, HoldRest];
MatchQ[Times[-1, Power[s, -1]], Times[___, Power[___ /; x == 2], ___]]
(*проверка, что условие в паттерне работает*)
x = 3;
MatchQ[Times[-1, Power[s, -1]], Times[___, Power[___ /; x == 2], ___]]
Quit[][/no]
Автор: r_green
Дата сообщения: 01.12.2010 00:44
popkov

Цитата:
Кстати, вот один баг, перекочевавший еще из самой первой версии Mathematica:

In[1]:= f[Infinity] - f[Infinity]

Out[1]= 0

In[2]:= f[x_] = x;
f[Infinity] - f[Infinity]

During evaluation of In[2]:= \[Infinity]::indet: Indeterminate expression -\[Infinity]+\[Infinity] encountered. >>

Out[3]= Indeterminate

Очевидно, первый результат неверен.


Не могу согласиться, что такое поведение следует считать багом.
Ведь тогда нужно считать багом и следующее:

Код: In[1]:= a - a

Out[1]= 0

In[2]:= a = Infinity

Out[2]= \[Infinity]

In[3]:= a - a

During evaluation of In[3]:= \[Infinity]::indet: Indeterminate expression -\[Infinity]+\[Infinity] encountered. >>

Out[3]= Indeterminate
Автор: popkov
Дата сообщения: 01.12.2010 10:31
r_green

Цитата:
По умолчанию (с одним аргументом) N[] работает на уровне машинной точности, т.е. напрямую с машинным представлением чисел. Это значительно ускоряет работу, но может приводить к искажению результата.

Однако это нарушает математическую строгость языка и приводит к двусмысленностям:

[no]In[1]:= 3141592653589793238. == 3141592653589793238.00
3141592653589793238. === 3141592653589793238.00
Sin[3141592653589793238] == Sin[3141592653589793238.00]
Sin[3141592653589793238] === Sin[3141592653589793238.00]
N[Sin[3141592653589793238.]] == N[Sin[3141592653589793238.00]]
N[Sin[3141592653589793238.]] === N[Sin[3141592653589793238.00]]

Out[1]= True

Out[2]= True

Out[3]= True

Out[4]= False

Out[5]= False

Out[6]= False[/no]

Другими словами, если a=b, да к тому же они еще и тождественны как объекты в системе Mathematica, то должно быть [no]f[a]=f и g[f[a]]=g[f[b]]. [/no]Или же они как минимум должны быть не тождественны, а по-хорошему - и не равны друг другу!

[b]Добавлено:


Цитата:
Ведь тогда нужно считать багом и следующее:

На самом деле, так оно и есть: это изначальный дефект архитектуры языка. Суть в том, что система обращается с 'a' так, будто бы это - обозначение настоящей математической величины, когда 'a' не определено:

In[19]:= a - a

Out[19]= 0

Однако, как только 'a' определено, вдруг выясняется, что оно не эквивалентво самому себе, чего для математической величины быть не может:

In[20]:= a = Infinity
a - a

Out[20]= \[Infinity]

During evaluation of In[20]:= \[Infinity]::indet: Indeterminate expression -\[Infinity]+\[Infinity] encountered. >>

Out[21]= Indeterminate

В математике, строго говоря, нет никаких "бесконечностей": это - жаргон. Под ним понимается сколь угодно большая величина. И, как бы она ни была велика, она все равно останется равной самой себе!

Добавлено:
С другой стороны, 'a' равно и тождественно самому себе:

In[24]:= a = Infinity
a == a
a === a

Out[24]= \[Infinity]

Out[25]= True

Out[26]= True

Вот это я и называю замутнением языка. Оказывается, это было с самого начала...
Автор: r_green
Дата сообщения: 01.12.2010 17:39
popkov

Цитата:
Однако это нарушает математическую строгость языка и приводит к двусмысленностям:
...
Другими словами, если a=b, да к тому же они еще и тождественны как объекты в системе Mathematica, то должно быть f[a]=f[b] и g[f[a]]=g[f[b]]. Или же они как минимум должны быть не тождественны, а по-хорошему - и не равны друг другу!


Дело в том, что язык и объекты Mathematica - это всего лишь удобные модели (или средства для моделирования) математических объектов. Более того, пользователь должен сам решать какую конструкцию языка можно выбрать для адекватного моделирования его математической системы. И если выбранная модель начинает давать недопустимые отклонения от поведения моделируемой системы, это в первую очередь ошибка пользователя, выбравшего данную модель. Претензии к средствам моделирования могут быть лишь при нарушении спецификации, определяющей их поведение.
Возьмём, к примеру, тот же оператор сравнения == (ф-ция Equal[]).
По спецификации, он не всегда обязан возвращать False для неравных по значению объектов - для действительных чисел ограниченной точности он проверяет равенство только в пределах точности:

Код:
In[1]:= a = 123456789012345.0;

In[2]:= b = 123456789012345.9;

In[3]:= a == b

Out[3]= True

In[4]:= a - b == b - b

Out[4]= False

In[5]:= a - b

Out[5]= -0.90625
Автор: popkov
Дата сообщения: 01.12.2010 18:08
r_green

Цитата:
Я считаю, что это скорее рациональное упрощение языка, а не дефект.

Дефектом является то, что величина перестает быть тождественна самой себе, если устремляется к бесконечности.
Цитата:
И не вижу здесь покушения на математические принципы - в конце концов, объект Mathematica - это лишь модель, и именно Вы выбираете моделируемый им математический объект, разве нет?
Вы издеватесь? Какому математическому объекту соответствует объект Mathematica и её язык с таким двусмысленным поведением?

Страницы: 12345678910111213141516171819202122232425262728293031323334

Предыдущая тема: Идея несуществующей программы...


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.