Как рассчитать свертку функции с самим собой в MATLAB и WolframAlpha? - PullRequest
3 голосов
/ 14 сентября 2011

Я пытаюсь вычислить свертку

x(t) = 1, -1<=t<=1
x(t) = 0, outside

с самим собой, используя определение.

http://en.wikipedia.org/wiki/Convolution

Я знаю, как это сделать, используя функцию Matlab conv, но я хочу использовать интегральное определение. Мои знания о Matlab и WolframAlpha очень ограничены.

Ответы [ 3 ]

8 голосов
/ 14 сентября 2011

Я все еще изучаю Mathematica, но вот что я придумала ..

Сначала мы определим кусочную функцию (я использую пример со страницы Википедии)

f[x_] := Piecewise[{{1, -0.5 <= x <= 0.5}}, 0]

piecewise_function

Позволяет построить график функции:

Plot[f[x], {x, -2, 2}, PlotStyle -> Thick, Exclusions -> None]

function_plot

Затем мы пишем функцию, которая определяет свертку f с самим собой:

g[t_] = Integrate[f[x]*f[t - x], {x, -Infinity, Infinity}]

convolution_integral

и сюжет:

Plot[g[t], {t, -2, 2}, PlotStyle -> Thick]

convolution_plot


EDIT

Я пытался сделать то же самое в MATLAB / MuPad, но не так успешно:

f := x -> piecewise([x < -0.5 or x > 0.5, 0], [x >= -0.5 and x <= 0.5, 1])

func_def

plot(f, x = -2..2)

func_plot

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

g := t -> int(f(x)*f(t-x), x = -infinity..infinity)

convolution

сюжет (тоже занял слишком много времени)

plot(g, t = -2..2)

convolution_plot

Обратите внимание, что то же самое можно было сделать из MATLAB с помощью синтаксиса:

evalin(symengine,'<MUPAD EXPRESSIONS HERE>')
1 голос
/ 17 сентября 2011

Mathematica на самом деле выполняет функцию свертки. В документации есть несколько примеров:

http://reference.wolfram.com/mathematica/ref/Convolve.html?q=Convolve&lang=en

0 голосов
/ 14 сентября 2011

Я мало что знаю о Mathematica, поэтому могу помочь вам (частично) только в части Matlab.

Выполнение свертки с функциями функций Matlab означает, что вы делаете это численно. Что вы подразумеваете под интегральным определением, так это то, что вы хотите сделать это символически. Для этого вам понадобится Matlab Symbolic Toolbox. По сути, это плагин Maple для Matlab. Так что вы хотите знать, как это работает в Maple.

Вы можете найти эту ссылку полезной (wikibooks) для ознакомления с MuPad в Matlab.

Я пытался реализовать вашу функцию box как функцию в Matlab как

t = sym('t')
f =  (t > -1) + (t < 1) - 1

Однако это не работает, когда t является символьным типом Function 'gt' is not implemented for MuPAD symbolic objects.

Вы можете объявить f как кусочную функцию, см. (онлайн-справка по matlab) , это не сработало в моем Matlab. Все примеры имеют синтаксис Maple, поэтому они сразу же будут работать в Maple.

Чтобы обойти это, я использовал

t = sym('t')
s = sym('s')
f = @(t) heaviside(t + 1) - heaviside(t - 1)

К сожалению, это не удачно

I = int(f(s)*f(t-s),s, 0, t)

дает

Warning: Explicit integral could not be found.

и не дает явного результата. Вы все еще можете оценить это выражение, например,

>> subs(I, t, 1.5)

ans =
1/2

Но Matlab / MuPad не смогли дать вам и явного выражения в терминах t. Это не является неожиданным, поскольку функция f является прерывистой. Это не так просто для символических вычислений.

Теперь я пойду и помогу компьютеру, к счастью, пример, который вы задали, очень прост. Свертка в вашем примере это просто int_0^t BoxFunction(s) * BoxFunction(t - s) ds. Интегрант BoxFunction(s) * BoxFunction(t - s) снова является блочной функцией, просто не той, которая идет от [-1,1], а на меньший интервал (который зависит от t). Тогда вам нужно только интегрировать функцию f(x)=1 за этот меньший интервал.

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

Может быть, Matematica или Maple действительно могли бы решить эту проблему, помните, что MuPad, поставляемый с Matlab, является только урезанной версией Maple. Возможно, вышесказанное все еще может помочь вам, оно должно дать вам представление о том, как все работает вместе. Попробуйте добавить более приятную функцию для f, например полином, и вы должны заставить его работать.

...