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

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

Автор: KChernov
Дата сообщения: 07.09.2009 01:52

Цитата:
http://en.wikipedia.org/wiki/Sphere_packing

Тут наверное лучше написано, но сейчас разбираться нет времени.
Но по логике надо рассматривать варианты упаковки, заменяя круг многоугольниками: треугольник, квадрат (именно про него мне пришла в голову идея, когда я писал тот пост, но она оказалась не верная), пяти-, шести- и тд-угольник, и вообще говоря не обязательно правильными (по крайней мере сразу неочевидно, хотя и вероятно - или невероятно, если реально не решена).
Автор: rakis
Дата сообщения: 07.09.2009 09:42
В принципе, то что надо нашел (включая код)
Cubic Close Packing
Sphere Packing
Автор: kyznez1
Дата сообщения: 17.09.2009 19:53
а можно ли как-нибудь представить результат в виде обычных (не многоэтажных) дробей?
полазил по справке - ничего не нашел.
Автор: KChernov
Дата сообщения: 17.09.2009 23:26
kyznez1
Надо "посчитать" - N
Автор: TomasVercetti
Дата сообщения: 15.10.2009 12:08
Сейчас выбираю, скольки ядерный процессор (2/3/4) взять; основной критерий выбора — соотношение увеличения скорости расчётов именно в Mathematica с ценой. Какой прирост скорости даст каждое дополнительное ядро?

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

Может быть у кого-нибудь есть такой опыт? Или где-то в интернете есть тесты (я не нашёл)?

Спасибо!
Автор: popkov
Дата сообщения: 15.10.2009 18:13
TomasVercetti

Цитата:
Насколько хорошо Mathematica распараллеливает вычисления?
Не слишком хорошо: реализация распараллеливания выполнена простейшим и тупейшим способом. Распараллелить она может только то, что можно распараллелить вручную, запустив соответствующее количество копий Mathematica и в каждой выполняя соответствующую порцию кода. Такие функции, как NSolve, конечно, распараллелены быть не могут. Да и вообще: всё это встроенное распараллеливание - просто надстройка над встроенными функциями, ранее оно было отдельным пакетом, теперь он интегрирован в кернел.
С точки зрения эффективности намного лучше иметь один мощный процессор, чем 2 маломощных, поскольку это распараллеливание кушает само по себе немало процессорного времени. Для задач малого масштаба оно может приводить к снижению производительности, вместо роста (пример).

Автор: Griefin
Дата сообщения: 15.10.2009 18:32
У меня Mathematica 7 не распараллеливает даже вычисления таблиц (ParallelTable), где фигурируют функции, содержащие численные интегралы и суммы. Хотя казалось бы, что может быть проще: взять и разбить таблицу на части и каждую считать своим процессором.
Автор: popkov
Дата сообщения: 15.10.2009 18:35
Griefin
Думаю, эта проблема как раз решаема, если обойтись без ParallelTable, а использовать что-то вроде ParallelSubmit. Сам с распараллеливанием не работаю, поэтому большего не скажу.
Автор: Griefin
Дата сообщения: 15.10.2009 18:40
Кстати, странно, что там параллельных версий функций построения графиков нет. Вот уж что надо было в первую очередь сделать. ParallelSubmit наверное поможет, спасибо.
Автор: popkov
Дата сообщения: 15.10.2009 20:18
Griefin

Цитата:
Кстати, странно, что там параллельных версий функций построения графиков нет.

Как я уже сказал, все функции параллелизации - не более, чем обёртка над базовыми функциями. В случае Plot параллелизация невозможна, т.к. задачу построения Plot нельзя разбить на 2 задачи построения Plot (т.е. вручную с помощью ParallelSubmit можно, конечно, но число вычислений значений функции при этом увеличится).

Добавлено:
В общем, реализация параллелизации в Mathematica сделана тупейшим и наименее эффективным образом, прямо противоположно надеждам пользователей. Можно сказать, что разработчики прохалявили, поленились реализовать внутреннюю параллелизацию путём переписывания кода встроенных функций. И вряд ли сделают это в ближайшем будущем. Зато разрекламировали новую версию ещё и "встроенной параллелизацией", повышая продажи.
Автор: Griefin
Дата сообщения: 15.10.2009 23:34
popkov
Я не вижу принципиальных ограничений для параллелизма в функции Plot. Она делает фактически следующее: вычисляет таблицу значений {{x_1, f(x_1)},...,{x_2, f(x_2)}} и делает рекурсивные разбиения внутри интервалов, пока приращение функции f(x_n) - f(x_{n-1}) не будет меньше некоторой величины (скорее всего ее сравнивают с приращением аргумента) или пока число разбиений не станет равным MaxRecursion. Таблицу значений можно разрезать и раскидать на несколько процессоров, рекурсивные разбиения -- тоже.
Автор: popkov
Дата сообщения: 16.10.2009 06:26
Griefin
Можно. Но для этого надо модифицировать функцию Plot, добавив в неё параллелизацию. А с существующей версией единственное решение - разбитие интервала на 2 части и построение в каждом кернеле своего Plot'а, затем объединение. Однако, как я понимаю, при этом несколько возрастёт число вычислений значений функции (хотя при грамотном указании параметров, возможно, и нет). Алгоритмы очень многих, если не большинства функций Mathematica, допускают распараллеливание в принципе. Но пакет параллелизации вовсе не занимается добавлением в эти алгоритмы таких возможостей, а всего лишь подразбивает задачу на части, выполняемые разными ядрами, в тех случаях, когда это можно сделать очевидным образом.
Автор: TomasVercetti
Дата сообщения: 17.10.2009 08:30
Благодарю всех за ответы. Посмотрел ссылки, поискал ещё в интернете — на самом деле, встроенная реализация разочаровывает. Но, вроде бы, ручками можно распараллелить достаточно эффективно: как я понял, какое-либо вычисление можно отнести к конкретному ядру; поэтому, даже если M. не будет распараллеливать численное интегрирование и решение уравнения, куда входят эти интегралы, то эти вычисления для различных наборов параметров можно разнести по различным ядрам, а результаты записывать в один список. Или я не прав?
Автор: popkov
Дата сообщения: 17.10.2009 09:07
TomasVercetti

Цитата:
как я понял, какое-либо вычисление можно отнести к конкретному ядру; поэтому, даже если M. не будет распараллеливать численное интегрирование и решение уравнения, куда входят эти интегралы, то эти вычисления для различных наборов параметров можно разнести по различным ядрам, а результаты записывать в один список. Или я не прав?

Всё верно.
Автор: Griefin
Дата сообщения: 20.10.2009 23:30
Есть такая проблема. Хочу написать функцию, которая бы присваивала некой глобальной переменной значение только, если она ранее не была определена. Однако, такой код почему-то не работает
If[Definition[var]==Null, var = 3];
Definition[var]==Null всегда возвращает Indeterminate. Это странно.

Добавлено:
Условие NumberQ[var] работает только если переменной присвоено число, а если var является функцией, не помогает.
Автор: popkov
Дата сообщения: 21.10.2009 07:12
Griefin
Дело в том, что Definition[var] возвращает не Null, а InterpretationBox:
Cell[BoxData[
InterpretationBox["Null",
Definition[$CellContext`var],
Editable->False]], "Output",
CellChangeTimes->{3.4650867423239994`*^9,
3.465086783839624*^9}]

Следующий код работает правильно:
ToString[Definition[f]] === "Null"

Но это, конечно, обходной путь. "Красивое" решение могут подсказать в группе новостей.
Автор: exTail
Дата сообщения: 02.11.2009 10:41
Здравствуйте!

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

f[a_, b_] := NIntegrate[a*x + b, {x, 0, 1}];
g[a_] := NIntegrate[f[a, y]/(1 + f[a, y]), {y, -1, 1}];

При попытке счета, получаем:

In[23]:=
g[2]

From In[23]:=
NIntegrate::inum: Integrand 2 x + y is not numerical at {x} = {0.5`}.

Out[23]=
0.901388

Т.е. судя по в функцию f передается не кокретное значение b, а y, как параметр... Что делать? По советам, найденным в сети вставил проверку переменных в определние функции f:
f[(a_)?NumericQ, (b_)?NumericQ] := NIntegrate[a*x + b, {x, 0, 1}]

Результат тот же...

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

Спасибо за ответы!
Автор: popkov
Дата сообщения: 02.11.2009 13:43
exTail
Попробуй так:
f[(a_)?NumericQ, (b_)?NumericQ] := NIntegrate[a*x + b, {x, 0, 1}];
g[a_] := NIntegrate[Hold[f[a, y]/(1 + f[a, y])], {y, -1, 1}];

In[3]:= g[2]

Out[3]= 0.901388

У меня работает без ошибок...
Автор: exTail
Дата сообщения: 02.11.2009 14:19

Цитата:
Попробуй так:
f[(a_)?NumericQ, (b_)?NumericQ] := NIntegrate[a*x + b, {x, 0, 1}];
g[a_] := NIntegrate[Hold[f[a, y]/(1 + f[a, y])], {y, -1, 1}];
У меня работает без ошибок...

Спасибо!

Не понимаю, правда, почему заработало - вроде бы, Hold должна препятствовать преобразованиям того, что стоит у нее в аргументе, но не значения переменных. Т.е. если в функцию передается что-то символьное, числа из символьного значения Hold сделать не может...
Автор: popkov
Дата сообщения: 02.11.2009 15:09
exTail
Странно, но выполнение следующего кода у меня вовсе не приводит к сообщению об ошибке (хотя ранее, вроде, приводило):

f[(a_)?NumericQ, (b_)?NumericQ] := NIntegrate[a*x + b, {x, 0, 1}];
g[a_] := NIntegrate[f[a, y]/(1 + f[a, y]), {y, -1, 1}];
g[2]

То ли ошибки и не было, то ли я не знаю...
Автор: Gittle_Leya
Дата сообщения: 15.11.2009 21:17
Люди,помогите,кто может.Такая проблема: использую NMinimize и в нем в качестве одного из условий записан текст функции (иначе не получается), так вот, нужно,чтобы это условие вычислялось только тогда,когда будет найдено конкретное значение переменных,а не в общем виде, иначе просто не хватает памяти.Пробовала с помощью Evaluate задать порядок вычисления, но,видимо, для такого случая оно не работает
Подскажите,плиз,что делать.
Для наглядности хоть на таком примере вида:
NMinimize[{
x1^2 - (x2 - 1)^2, (Print["x1=", x1, " x2=", x2];
x1^2 + x2^2 <= 4)}, {x1, x2}]

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

Автор: popkov
Дата сообщения: 21.11.2009 18:53

Цитата:
Для наглядности хоть на таком примере вида:

Пример не слишком нагляден. Непонятно, зачем внутрь минимизируемой функции засовывать Print[]?!
Тем не менее, даже такую кривую задачу можно решить, например, так:
[no]f[x1_?NumericQ, x2_?NumericQ] := (Print["x1=", x1, " x2=", x2];
x1^2 + x2^2 <= 4; x1^2 - (x2 - 1)^2)
NMinimize[{f[x1, x2]}, {x1, x2}][/no]
Понимаю, что это почти бред, но интерпретировать вашу задачу разумным образом крайне сложно. Если функция просто должна выдавать разные значения в зависимости от аргументов - используйте кусочно-заданные функции. Если нужно печатать промежуточные значения - отталкивайтесь от моего решения или используйте EvaluationMonitor.
А вообще, свою цель следует формулировать яснее...
Автор: Griefin
Дата сообщения: 22.11.2009 05:29
Есть такой вопрос насчет вычисления функций, которые переданы как параметр. Простой пример: хочу написать функцию ExportFunction, которая строит и экспортирует массив в формате x,y. В качестве аргумента у нее будут произвольная функция f[..., x,...], ее аргумент x, интервал и еще какие-то параметры.

ExportFunction[f_, {x_, x1_, x2_, n_}, file_] := Export[file, Table[{p, f /. x->p}, {p, x1, x2, (x2 - x1)/n}] // N, "Table"]

Такой код проходит для простых функций. Однако, если функция f достаточно сложная, например, содержит аргумент как предел численного интегрирования, то этот код не работает. Если не передавать функцию в качестве аргумента, а делать все руками на встроенных функциях:
Export["filename", Table[{x,f}, {x, x1, x2}]]
то все нормально. Вопрос: как нужно вычислять функцию, передаваемую в качестве параметра? HoldAll[f] /. x->p, Block[{x=p}, f] не помогают.
Автор: popkov
Дата сообщения: 22.11.2009 11:52
Griefin
А если завернуть эту функцию в Evaluate[]?
Автор: Griefin
Дата сообщения: 22.11.2009 16:05
Evaluate тоже не помогает, по-прежнему сыпятся ошибки о нечисловом пределе в NIntegrate. По идее, нужно так, чтобы ReplaceAll не делала над функцией никаких преобразований, а просто подставляла итератор таблицы вместо аргумента. Посмотреть бы как реализована функция Plot, ведь она фактически делает то же самое.
Автор: valeryvb
Дата сообщения: 25.11.2009 09:45
Уважаемые!
Глупый (?) вопрос по Математике

Можно ли сделать так, чтобы выражения (уравнения) можно было вводить в естественном (математическом) виде - так, как на сайте WolframAlpha

Например, y'(x)=sin y(x), y(0)=1

Дальше Enter и решение на экране y(x)=2 arccot...
Автор: S4astliff4ik
Дата сообщения: 25.11.2009 10:46
Приветствую!!! Ребят,а есть какие-нибудь проги по решению :

1. Найти наименьшее и наибольшее значение функции f(x,y) в замкнутой области D , заданной системой неравенств...
2. В повторном интеграле изменить порядок интегрирования...
3. Найти момент инерции плоской однородной пластинки D относительно оси ОХ . При вычислении двойного интеграла перейти к полярным координатам....
4. С помощью тройного интеграла вычислить объём тела G ,заданного неравенствами...
5. Найти дивергенцию и ротор векторного поля ,задаваемого векторным произведением...
6. Вычислить криволинейный интеграл по замкнутому контору L,пробегаемому против часовой стрелки двумя способами : непосредственно и по формуле Грина...
7. Найти поток векторного поля через замкнутую поверхность, ограничивающую указанное тело G,в направлении внешней нормали к поверхности. Задачу решить двумя способами : непосредственно,вычислив поток через все гладкие куски поверхности,и с помощью теоремы Гаусса-Острадского.
Автор: SergunBooker
Дата сообщения: 26.11.2009 14:20
Подскажите пожалуйста, можно ли, как нибудь у Arg[z] изменить диапазон значений, вместо [-Pi,Pi], а то графики обрезаются.
Автор: zepterman
Дата сообщения: 26.11.2009 23:26
Подскажите, какие программы могут искать из заданных чисел необходимую сумму.

Пример.
Есть множество чисел 10,20,50,4,10,6,...
Мне в итоге нужно получить число 90.
И программа выдает все возможные варианты:
10,20,50,10
10,20,50,4,6
Автор: popkov
Дата сообщения: 30.11.2009 15:40
zepterman
Задача решается элементарно:

[no]list = {10, 20, 50, 4, 10, 6};
Select[Subsets[list], Total[#] == 90 &] // Column[/no]

Добавлено:
S4astliff4ik
По поводу п.1: NMinimize в Mathematica как раз для этого. По поводу остального: надо выписывать формулы ручками.

Страницы: 12345678910111213141516171819202122232425262728293031323334

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


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