2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Что сделать, чтобы Mathematica не зависала при вычислениях?
Сообщение15.02.2018, 15:54 
Заслуженный участник


02/08/11
7013
Вопрос что называется философский, но я всё же надеюсь получить конкретные рекомендации.
Когда я пытаюсь что-то посчитать с помощью Wolfram Mathematica, но это почти всегда оканчивается зависанием процесса вычислений.
Иногда это удаётся обойти, ещё чаще приходится воспользоваться другими средствами (грубо говоря "сделать самому").
Что нужно сделать, чтобы это исправить? Может почитать что-то о том, как устроена Mathematica? Если так, то что вы порекомендуете?

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

Итак, что я хочу сделать? Я хочу посчитать свёртку "тусовки дельта-функций" с прямоугольной ступенькой единичной площади и изобразить график результата. В коде ниже все строчки до той, где определяется points, просто формируют некий список чисел $x_i$, из которого затем получается функция $m(x)=\sum\limits_i \delta(x-x_i)$. В последней строке я пытаюсь посчитать свёртку этой функции с $10(\theta(x)-\theta(x-0.1))$ и получаю зависание. И я не понимаю почему.
Код:
f0[x_] = Exp[-4 x^2]
f0S = Integrate[f0[x], {x, -Infinity, Infinity}]
f0N[x_] = f0[x]/f0S
Plot[f0N[x], {x, -1, 1}]
points = #[[1]] & /@ Select[{2 #[[1]] - 1, #[[2]]} & /@ RandomPoint[Rectangle[], 5000], #[[2]] < f0N[#[[1]]] &]
m[x_] = Total[DiracDelta[x - #] & /@ points]
n[y_] = Convolve[m[x], 10 (HeavisideTheta[x] - HeavisideTheta[x - 0.1]), x, y]

 Профиль  
                  
 
 Re: Что сделать, чтобы Mathematica не зависала при вычислениях?
Сообщение15.02.2018, 19:47 
Заслуженный участник


25/02/11
1797
В этом примере она не зависает, а просто считает долго. Но слагаемых то много. В таких случаях можно попробовать запустить пример попроще и засечь время:

AbsoluteTiming@Convolve[DiracDelta[x - 0.5], 10 (HeavisideTheta[x] - HeavisideTheta[x - 0.1]), x, y]

Выдает около 0.07с. Поскольку слагаемых 2500, то время работы будет порядка 200с.

Иногда, конечно, может памяти не хватать или программа просто зацикливается в своих сложных алгоритмах.

 Профиль  
                  
 
 Re: Что сделать, чтобы Mathematica не зависала при вычислениях?
Сообщение15.02.2018, 20:08 
Заслуженный участник


02/08/11
7013
Vince Diesel в сообщении #1292705 писал(а):
В этом примере она не зависает, а просто считает долго. Но слагаемых то много.
Да, не ожидал, что такая простая операция, как свёртка Дирака с Хевисайдом, может занять столько времени.

 Профиль  
                  
 
 Re: Что сделать, чтобы Mathematica не зависала при вычислениях?
Сообщение15.02.2018, 20:22 
Аватара пользователя


11/06/12
10390
стихия.вздох.мюсли
Оно таки посчиталось? Из ваших слов не было понятно, зависала ли Математика в смысле зависания процессов напрочь или просто долго считала. Запустил ваш код у себя: начала считать, памяти взяла не то что бы оч. много, виснуть — не виснет, но ответа за двадцать минут пока не даёт ;-).

 Профиль  
                  
 
 Re: Что сделать, чтобы Mathematica не зависала при вычислениях?
Сообщение15.02.2018, 20:22 
Заслуженный участник
Аватара пользователя


30/01/06
72407
Vince Diesel в сообщении #1292705 писал(а):
Выдает около 0.07с. Поскольку слагаемых 2500, то время работы будет порядка 200с.

Лучше не так напрямую аппроксимировать, а сначала промерять 10, 30, 100 слагаемых. Мало ли из чего там складываются эти 0,07 с.

 Профиль  
                  
 
 Re: Что сделать, чтобы Mathematica не зависала при вычислениях?
Сообщение15.02.2018, 20:35 
Заслуженный участник


02/08/11
7013
Aritaborian в сообщении #1292712 писал(а):
апустил ваш код у себя: начала считать, памяти взяла не то что бы оч. много, виснуть — не виснет, но ответа за двадцать минут пока не даёт ;-).
После сообщения Vince Diesel я запустил ещё раз и дождался. У меня считает за несколько минут.

Несколько минут — это ещё ничего, но несколько часов без гарантии результата ждать не будешь.

 Профиль  
                  
 
 Re: Что сделать, чтобы Mathematica не зависала при вычислениях?
Сообщение15.02.2018, 21:11 
Аватара пользователя


11/06/12
10390
стихия.вздох.мюсли
Что касается гарантий, их может дать только страховой полис. Есть, как вам наверняка известно, всякие StepMonitor, EvaluationMonitor, ещё чегототам, но и они гарантировать ничего не могут. Математика в любом случае не относится к системам, производящим риал-тайм-вычисления. Вы получаете верный ответ, но иногда вам приходится ждать его неопределённое время, увы ;-)

 Профиль  
                  
 
 Re: Что сделать, чтобы Mathematica не зависала при вычислениях?
Сообщение15.02.2018, 21:57 
Заслуженный участник


25/02/11
1797
warlock66613 в сообщении #1292710 писал(а):
не ожидал, что такая простая операция, как свёртка Дирака с Хевисайдом, может занять столько времени.
Ну, может у программы нет готового ответа и она честно вызывает операцию интегрирования, та выбирает соотв. правила...

В таких случаях, когда все однотипно, можно определить функцию на одном слагаемом, а потом применить ко всему массиву:

h[y_,a_] = Convolve[DiracDelta[x - a], 10 (HeavisideTheta[x] - HeavisideTheta[x - 0.1]), x, y, Assumptions -> a \[Element] Reals]
n[y_]=Total[h[y, #] & /@ points];


Выдает ответ сразу.

 Профиль  
                  
 
 Re: Что сделать, чтобы Mathematica не зависала при вычислениях?
Сообщение15.02.2018, 22:11 
Заслуженный участник


02/08/11
7013
Vince Diesel в сообщении #1292727 писал(а):
В таких случаях, когда все однотипно, можно определить функцию на одном слагаемом, а потом применить ко всему массиву:
Да, это я уже сделал. (И отметил на будущее: упрощать отдельные операции как только возможно.)

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 9 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group