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

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

Автор: popkov
Дата сообщения: 13.03.2011 03:50
Andrew10
Способ с Unevaluated является официальным методом, позволяющим имитировать наличие Hold*-атрибута у функции, которая его не имеет. Для иллюстрации: если присвоить атрибут HoldFirst функции ReplaceAll (infix form этой функции - "/."), мы получим в точности тот же результат:

Код:
Unprotect[ReplaceAll]; SetAttributes[ReplaceAll, HoldFirst];
First@NDSolve[{x''[t] + w^2 x[t] == 0, x[0] == x0, x'[0] == v0},
x, {t, 0, tmax}] /. {w -> 1., x0 -> 1, v0 -> 0, tmax -> 10}
Автор: Andrew10
Дата сообщения: 13.03.2011 11:53
popkov
Разрешите еще вопрос как знатоку: какую книгу Вы бы посоветовали для изучения Математики не на самом начальном уровне, а на следующих: так сказать на Intermediate Level и на Advanced Level? Книг много, какую лучше всего читать. Может не одну, а пару - тройку?
Автор: popkov
Дата сообщения: 13.03.2011 13:01
Andrew10
Книга Леонида Шифрина, которую я уже рекомендовал ранее, содержит материал уж как минимум Intermediate Level - точно (хотя написана так ясно, что подходит и для начального уровня). В конце книги есть список рекомендуемой литературы для дальнейшего изучения. Но задаваться вопросами и самостоятельно ставить эксперименты никто не запрещал - это и есть главный метод изучения! Причем разработчики с самого начала вполне открыто это демонстрировали (достаточно почитать The Mathematica Journal)!

Кроме того, очень полезно регулярно тратить немного времени, чтобы прочитать ответы разработчиков и опытных пользователей на постоянно возникающие вопросы в официальной группе новостей, а также на сайте stackoverflow.com. Так можно узнать практические методы решения "нестандартных" задач, которые из документации не почерпнуть, а в руководствах легко проглядеть, не придав должного значения (если даже они там описаны).
Автор: Andrew10
Дата сообщения: 13.03.2011 13:07
popkov
Спасибо!
Автор: lesnikforum
Дата сообщения: 18.03.2011 14:36
Установил на компьютере 8 версию математики и удивился, что она работает почти в 2 раза медленнее 6 версии. Решал систему трёх уравнений с помощью FindRoot. Кто-нибудь может прокомментировать?
Автор: popkov
Дата сообщения: 18.03.2011 17:12
lesnikforum
Да что тут комментировать, прогресс налицо:
Цитата:
Вот функция Solve.

Mathematica 5.1
{9.953 Second, Null}

Mathematica 7.0.1
{59.312, Null}

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

Это результаты для задачи, описанной мной здесь.
Автор: Moscow
Дата сообщения: 18.03.2011 21:18
Ребят, недавно услышал, что Математика умеет подгружать информацию с определенных ресурсов, речь шла о Gulf Stream (Гольфстриме), обсчитывать какие-то характеристики, что-то еще делать... Кто-нибудь в курсе этой стороны Математики? Я понял, что я в этом полный чайник, не знаю даже, куда копать...
Автор: r_green
Дата сообщения: 18.03.2011 21:20
popkov

Цитата:
Это результаты для задачи, описанной мной здесь

В 8.0.1, похоже, несколько исправили ситуацию - у меня на этой задаче 8-ка оказалась на 30% быстрее чем 7.01.


Добавлено:
Moscow

Цитата:
недавно услышал, что Математика умеет подгружать информацию с определенных ресурсов, речь шла о Gulf Stream (Гольфстриме), обсчитывать какие-то характеристики, что-то еще делать... Кто-нибудь в курсе этой стороны Математики?

Возможно, Вы имеете в виду интеграцию с Wolfram Alpha. Или, может быть, возможность обрабатывать данные из внешних источников.
Автор: popkov
Дата сообщения: 18.03.2011 23:52
r_green

Цитата:
у меня на этой задаче 8-ка оказалась на 30% быстрее чем 7.01.

Приятно слышать. Интересно было бы сравнить производительность на более широком наборе тестовых задач.

Кстати, проверьте, пожалуйста, воспроизводится ли в 8-ке следующий глюк MemoryConstrained предыдущих версий:

In[1]:= [no]MaxMemoryUsed[]
MemoryConstrained[
Quiet@Module[{f, n = 0},
f[x_] := f[x + 1] + Plus @@ Table[Random[], {10^7}];
Block[{$RecursionLimit = 3000}, f[0]]];, 90000000];
MaxMemoryUsed[][/no]

Out[1]= 10757752

Out[3]= 291258232

(данный результат у меня получился в v.7.0.1).

Как видите, MathKernel в пике "отъедает" дополнительные 260 Мб памяти, хотя уже при попытке захватить дополнительные 90 Мб выполнение должно было бы быть абортировано. Этот глюк, вероятно, зависит от операционной системы. Если не воспроизводится с текущими значениями, можно попробовать изменить их, - например, увеличить второй параметр MemoryConstrained, сделав его ближе к 260 Мб. Или/и увеличить $RecursionLimit. Или заменить Table[Random[], {10^7}] на Table[Random[], {10^7}, {10}].
Автор: vikkiv
Дата сообщения: 19.03.2011 04:38
Moscow

И без Математики - альтернативных вариантов понятия "внешних источников" довольно много на самом-то деле на что и указал r_green ..

Можно разделить на пару основных групп:
1) На одном и том-же компьютере (на уровне файлов либо с выхода программ или примитивных интерфейсов/датчиков типа: термометр/манометр/тахометр/электро-импульсы и т.д.) - т.е. внешний только от самой математики, но в одной системе.
2) Вне персональной компьютерной системы - в основном сеть: интернет/локальная ..

Прище всего Математика работает с первым вариантом.

Для второго варианта для Математики - там разнится от взаимодействия через материнскую систему (Вольфрамoвские базы данных с которыми сама альфа работает и другие через функции GeodesyData[]/AstronomicalData[]/FinancialData[]/CountryData[]/CityData[]/WeatherData[]) и до того как сам запрограмируешь : сканирование+запросы с сайтов/страниц, использования внешних API (из популярных - Google очень развивается в этом плане), базы данных и пр.. самое простое по океанографии и метеорологии насколько я знаю они с сателитов и более земных датчиков просто на ftp сервера сбрасывают - а от туда исследователи уже массово считывают... например штатовкий центр ftp.opc.ncep.noaa.gov .. похожая система у NASA fтp 4 ( но у них там ограничения из-за системы информационной безопасности) и многих европейских центров... некоторые с логинами/закрытым доступом, некоторые с регистрацией, с запаздывающими данными, много открытых..

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


А "копать" нужно туда куда есть необходимость .. т.е. определится с целями .. а потом с ресурсами в виде исходных данных .. отсюда ставим задачу - что хотим проверить/показать .. и какие данные доступны, .. Математика как инструмент будет соединительным звеном..
Автор: lesnikforum
Дата сообщения: 19.03.2011 13:23
Не предполагал, что можно так совершенстововать. Казалось бы, используйте в текущей версии предыдущие библиотеки функций, если они более производительны, и вообще зачем всё переписывать?

А кто-нибудь пробовал работать с CUDA? Например, построить 100 точек сложной функции.

Может быть ещё подскажите, установил математику 8, а она на следующий день регистрироваться просит. Это можно как-то обойти?
Автор: r_green
Дата сообщения: 19.03.2011 13:31
popkov

Цитата:
Кстати, проверьте, пожалуйста, воспроизводится ли в 8-ке следующий глюк MemoryConstrained предыдущих версий


Похоже, исправлено. Вот что выдала у меня 8-ка:

Код:
Out[1]= 17 417 776
Out[3]= 17 952 712
Автор: popkov
Дата сообщения: 19.03.2011 17:28
r_green
Oliver Ruebenkoenig (Wolfram Research) в связи именно c этим багом написал:
Цитата:
For version 8 the memory allocator has been rewritten and improved.

(What a small sentence for such a huge endeavor and such a fine execution)
У меня нет возможности самому потестить, поэтому и попросил проверить с разными значениями второго параметра MemoryConstrained.

lesnikforum
Цитата:
Казалось бы, используйте в текущей версии предыдущие библиотеки функций, если они более производительны, и вообще зачем всё переписывать?
Типа появились "более совершенные" новые алгоритмы, так что от старых надо отказаться. Однако эти новые алгоритмы в некоторых ситуациях, когда старые выдавали ответ мгновенно, уходят в бесконечный цикл или же выдают неверный результат. Возможно также, что проблема не в самих алгоритмах, а в политике руководства Wolfram Research: в этой компании феодализация разработки разных аспектов системы (ядро, численные алгоритмы, графика и т.д.) так далеко зашла, что даже сами разработчики признают, что зачастую прогресс возможен только благодаря "старым связям", т.е. личному знакомству с разработчиками из других отделов компании, которые вообще-то не обязаны, но по старой дружбе раскрывают разработчикам-коллегам важные аспекты реализации встроенных функций, на которые те опираются в своей работе. Причем для такого выведывания нужны и знакомства, и такт, и время, и желание, что находится не у каждого. Поэтому бывает, что, реализовав какую-то новую функцию, уже на стадии окончательного релиза разработчик обнаруживает, что те функции, на которые он опирался в своей работе, уже "улучшены", и его код просто не работает!
С другой стороны, как уже давно повелось, разработчики никакой ответственности за качество своей продукции не несут, и все усовершенствования, исправления багов - исключительно их добрая воля, "хорошие манеры", т.е. они вовсе не обязаны исправить глюк, даже если он уже обнаружен. И не исправляют годами! Выходят новые версии, а старые глюки, давно уже известные, - тут как тут! По сути, разработчики работают для себя, в свое удовольствие, и им дела нет до потребностей пользователей, если только эти потребности их лично не касаются! "Слава богу" банкротство им не грозит.

Цитата:
А кто-нибудь пробовал работать с CUDA? Например, построить 100 точек сложной функции.
CUDA - больше понт, чем реальная возможность добиться большей производительности. Программирование под CUDA в Mathematica требует весьма значительного дополнительного вложения сил, оно плохо документировано, работает только под самые последние версии видеокарт. Кроме того, у CUDA масса ограничений, которые по сути сводят на нет его преимущества в подавляющем большинстве случаев. Вместо CUDA лучше обратите внимание на усоврешенствованный Compile с возможностью компиляции в код на C: CompilationTarget -> "C".

Цитата:
Может быть ещё подскажите, установил математику 8, а она на следующий день регистрироваться просит. Это можно как-то обойти?
С такими вопросами - в Варезник, здесь им не место. Рекомендую почитать шапку и последние несколько страниц темы - вероятно, вопрос отпадет сам собой.
Автор: lesnikforum
Дата сообщения: 21.03.2011 08:13
popkov
Не думаю, что алгоритмом, например, FindRoot занимаются несколько групп. При обращении к этой функции скорее всего запускается подпрограмма, написанная скорее всего на С, которую вовсе не обязательно менять от версии к версии. Может быть медленнее работает за счёт общей упаковки всей программы, хотя сомнительно.

Хотелось бы надеяться что с Кудой можной ускорить счёт. Постараюсь посмотреть, скажу.
Автор: r_green
Дата сообщения: 21.03.2011 09:58
lesnikforum

Цитата:
Не думаю, что алгоритмом, например, FindRoot занимаются несколько групп.

Алгоритмы FindRoot не самодостаточны - они могут использовать (как подпрограммы) алгоритмы других групп. Например, применять символьный анализ выражения.
Автор: lesnikforum
Дата сообщения: 23.03.2011 07:46
r_green

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


Может кто-нибудь подскажет. На какой ОС Математика быстрее/лучше работает, на ХР или 7? У компьютера 4 ядра, Вин7 в принципе может это использовать в смысле параллельной работы?
Автор: karl_karlsson
Дата сообщения: 23.03.2011 14:21
lesnikforum
Comparison of mathematical programs for data analysis
Видно, что Matlab и O-matrix где то быстрее для численных расчетах для несложных задачах. На более сложных разница иногда может достигнуть порядка.
Также, Mathematica 5 или даже 4 тоже быстрее.
Если написать программу на C, Fortran и т.д. (компилируемых языках) - будет еще на порядки быстрее Matlab. Но, конечно, размер кода будет на порядки больше и для написании (даже если готовые подпрограммы используются) будет занимать на порядки больше времени.

Добавлено:
От ОС большой зависимости не наблюдается, еще параллельной работы не для всех задач подходить.
Автор: vikkiv
Дата сообщения: 23.03.2011 17:17
lesnikforum
Кроме парралельности ещё наверное немаловажный момент - битность, 32 vs 64 , для ХР как известно 64 битных версий нет.

Edit:
karl_karlsson
Второй момент ..может стоит обратить внимание на стратегические перспективы .. с учётом агрессивной маркетинговой экспансии Математики в университеты как академические/студенческие лицензии думаю всё-таки они к нынешней своей доли рынка под себя ещё и существенное расширение сегмента на будующее готовят. Выпускнику для миграции между системами переучивать FrontEnd интерфейсы/комманды - всё-таки лишние временные и интеллектуальные затраты.. т.е. потеря эффективности. а когда этот-же студент становится тем кто принимает решения на какой системе базировать работу всей организации, и кого из сотрудников нанимать (знающих какие системы) .. тут путь развития несложно вывести .. т.е. какому из альтернативных продуктов будут отданы предпочтения .. Это относится как к внутренней так и к внешней системе организации, т.е. и к рынку труда.
K этому ещё такие продукты поддержки как Player/Alpha, Web-интеграция, серверные технологии .. документация и кол-во людей кто уже в теме по нюансам работы и реализации и может направить на нужный путь, подсказать как решить ту или иную задачу .. естественно речь в основном о массовых/ежедневных задачах а не о особенностях к-рые здесь иногда обсуждают но на практике редко кто встречается.
Автор: popkov
Дата сообщения: 24.03.2011 04:11
lesnikforum
Цитата:
Если счёт идёт около 10 минут (или даже минуту), то основное время приходится именно на основной алгоритм вычисления, а не вспомогательные алгоритмы, по-моему.
Дело в том, что основной алгоритм сам написан на языке Mathematica, и является по сути надстройкой над базовыми функциями, доступными в т.ч. и пользователю. При этом разработчики стремятся обеспечить максимум универсальности встроенных функций, из-за чего сильно страдает производительность (о которой в WR вообще не слишком заботятся в целом). Поэтому самостоятельно реализованный алгоритм под свою конкретную задачу может работать в десятки раз быстрее, чем встроенный. Причем разработчики рекомендуют именно так и поступать в случаях, когда встроенные функции оказываются слишком медленными.

Кроме того, все т.н. "числовые" функции в действительности по умолчанию используют символьный анализ, например NDSolve первым делом вызывает Solve. Ситуация была другой в версиях, предшествовавших Mathematica 6.
Автор: Moscow
Дата сообщения: 25.03.2011 22:10
Ребят, уже на втором компе, на одном стоит ХР, на другом 7 Стартер, после запуска Математика 8.0.1 пишет внизу экрана объявку

JLink`InstallJava::fail: A link to the Java runtime could not be established.

Это что значит? На что влияет?...
Автор: popkov
Дата сообщения: 25.03.2011 22:38
Moscow
В первую очередь на справку: она полностью зависит от Жабы. А вычисления выполняются (пример: выполнить 2+2), т.е. MathKernel подключается к FrontEnd?

Добавлено:
Возможно, проблему создает слишком агрессивно настроенный firewall (или антивирус). Попробуй отключить его.
Автор: popkov
Дата сообщения: 26.03.2011 07:42
TomasVercetti
Цитата:
В 5-7 версиях вложенные функции типа FindRoot[NIntegrate[]] могли выдавать ошибки (а могли и нет) типа NIntegrate::inumr, которые связаны с тем, что внутренняя функция рассчитвается (Evaluate) в первый раз перед расчётом внешней. Т.е., с символьными аргументами, так как численные значения внешней функции ещё не подставлены (нормальный порядок расчёта) При этом всё рассчитывалось нормально. В 8й версии при наличии таких ошибок FindRoot работает некорректно в принципе (ещё одно сообщение).

Полное «решение» проблемы — позволить внутренней (и, для вызова из других функций, внешней) функции быть рассчитываемой только с численными значениями. Например, InternalF[x_?NumericQ, y_?NumericQ]:=NIntegrate[x y z, {z,0,1}], WrappingF[x_?NumericQ]:=FindRoot[InternalF[x,y],{y,0,1}].

Только что прочитал объяснение сути проблемы:

1) FindRoot имеет атрибут HoldAll, поэтому неверно думать, что выполнение первого аргумента до присвоения числового значения локальной переменной (в данном случае y) является просто отражением стандартной последовательности выполнения выражения (The Standard Evaluation Sequence; см. в документации страницу tutorial/Evaluation).

2) В Mathematica 6 у некоторых числовых функций появилась недокументированная опция Evaluated. Она не заменяет отсутствующие Hold*-атрибуты функции, т.е. не предотвращает предварительное выполнение аргументов функции перед выполнением самой функции, но предотвращает выполнение аргумента самой функцией до того момента, когда локальной переменной будет присвоено конкретное значение. В Mathematica 5.x вместо этой опции вроде бы была другая, но заставить работать ее мне не удалось.

Пример использования:

In[1]:= FindRoot[NIntegrate[Exp[a x], {x, 0, 1}] == 2, {a, 1}, Evaluated -> False]

Out[1]= {a -> 1.25643}

(никаких сообщений об ошибке!)

Эта опция есть и у ряда других числовых функций:

In[2]:= Options[#, Evaluated] & /@ {ContourPlot, ContourPlot3D,
DensityPlot, FindRoot, ParametricPlot, ParametricPlot3D, Plot,
Plot3D, RegionPlot, RegionPlot3D}

Out[2]= {{Evaluated -> Automatic}, {Evaluated ->
Automatic}, {Evaluated -> Automatic}, {Evaluated ->
True}, {Evaluated -> Automatic}, {Evaluated ->
Automatic}, {Evaluated -> Automatic}, {Evaluated ->
Automatic}, {Evaluated -> Automatic}, {Evaluated -> Automatic}}

Использование этой недокументированной опции позволяет добиться заметного прироста скорости выполнения по сравнению с документированными методами:

In[1]:= ClearSystemCache[];
FindRoot[NIntegrate[Exp[a x], {x, 0, 1}] == 2, {a, 100},
Evaluated -> False] // Timing
Clear[internalF]; ClearSystemCache[];
internalF[a_?NumberQ] := NIntegrate[Exp[a x], {x, 0, 1}]
FindRoot[internalF[a] == 2, {a, 100}] // Timing
Clear[internalF]; ClearSystemCache[];
internalF[a : (_Real | _Integer)] := NIntegrate[Exp[a x], {x, 0, 1}]
FindRoot[internalF[a] == 2, {a, 100}] // Timing
Clear[internalF]; ClearSystemCache[];
internalF[a_?NumericQ] := NIntegrate[Exp[a x], {x, 0, 1}]
FindRoot[internalF[a] == 2, {a, 100}] // Timing
Clear[internalF]; ClearSystemCache[];
internalF[a_ /; NumericQ[a]] := NIntegrate[Exp[a x], {x, 0, 1}]
FindRoot[internalF[a] == 2, {a, 100}] // Timing

Out[2]= {1.342, {a -> 1.25643}}

Out[5]= {1.993, {a -> 1.25643}}

Out[8]= {1.983, {a -> 1.25643}}

Out[11]= {1.973, {a -> 1.25643}}

Out[14]= {2.023, {a -> 1.25643}}
Автор: popkov
Дата сообщения: 08.04.2011 04:46
amaggot
Может быть, ты используешь в качестве первого аргумента ParallelCombine определенную тобой функцию, для которой ты предварительно не выполнил DistributeDefinitions? Это стандартная ошибка: параллельные ядра просто ничего не знают о функции, которую ты определил только в Master Kernel.
Автор: vikkiv
Дата сообщения: 09.04.2011 17:13
Как перманентно (т.е. не на сессию а чтобы автоматом брала при каждом запуске)
перенастроить математику (февральская 8.0.1 или можно на предыдущих примерах)
на использование системной Java (_:\Program Files\Java\jdk1.6.0_24 | _:\Program Files\Java\jre6)
вместо той которая идёт с Математикой (_:\Program Files\Wolfram Research\Mathematica\8.0\SystemFiles\Java\Windows )
???

А то Java постоянно обновляется а Математика изпользует устаревшую версию (в 8.0.1 идёт "1.6.0_10") .. что немного неудобно и иногда рискованно если пробуешь сборку Математических пакетов использующих Java.
Автор: r_green
Дата сообщения: 09.04.2011 22:29
vikkiv

Цитата:
Как перманентно (т.е. не на сессию а чтобы автоматом брала при каждом запуске)
перенастроить математику (февральская 8.0.1 или можно на предыдущих примерах)
на использование системной Java

Создайте символическую ссылку

Код: Program Files\Wolfram Research\Mathematica\8.0\SystemFiles\Java\Windows -> Program Files\Java\jre6
Автор: LimonD
Дата сообщения: 11.04.2011 22:16
Доброго всем времени суток, возник следующий вопрос, найти ответ на который пока не самостоятельно не смог.

Допустим, имею простейший график:

In[1]:= spisok = {1, 2, 3, 4,}
ListPlot[spisok, Joined -> True]

Out[1]= {1, 2, 3, 4, Null}

Вопрос: Как мне дифференцировать данный график и отобразить результат операции? Понятно, что в моём случае это прямая, попрошу рассматривать как более сложный пример, допустим полином третьего порядка.
Автор: r_green
Дата сообщения: 11.04.2011 23:09
LimonD

Цитата:
Как мне дифференцировать данный график и отобразить результат операции?

Такой график всегда представляет собой ломанную (т.е. кусочно дифференцируемую ф-цию). Производная такой ф-ции (в табличном представлении):

spisok2 = Differences[spisok]
Отобразить можно так же, как и spisok.

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


Автор: Andrew10
Дата сообщения: 12.04.2011 11:58
LimonD
r_green

Если собираетесь дифференцировать результат, то лучше не интерполировать, а аппроксимировать, например, функцией Fit.
Автор: r_green
Дата сообщения: 12.04.2011 12:14
Andrew10
Да, Вы правы.
Автор: popkov
Дата сообщения: 16.04.2011 16:27
lesnikforum
Цитата:
Хотелось бы надеяться что с Кудой можной ускорить счёт. Постараюсь посмотреть, скажу.

Возможно, окажутся полезными только что выложенные на оффсайте материалы семинара "GPU Computation Using Mathematica and OpenCL":
http://library.wolfram.com/infocenter/Conferences/7801/

Добавлено:
А 4-го мая планируется бесплатный онлайновый семинар "Advanced GPU Programming Using Mathematica and CUDA":
http://www.wolfram.com/services/education/seminar.cgi

Страницы: 12345678910111213141516171819202122232425262728293031323334

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


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