如何在MATLAB和WolframAlpha中计算函数与自身的卷积?

时间:2011-09-13 22:37:48

标签: matlab wolfram-mathematica wolframalpha

我正在尝试计算

的卷积
x(t) = 1, -1<=t<=1
x(t) = 0, outside

自己使用定义。

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

我知道如何使用Matlab函数转换,但我想使用积分定义。我对Matlab和WolframAlpha的了解非常有限。

3 个答案:

答案 0 :(得分:8)

我自己还在学习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


修改

我尝试在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 :(得分:1)

Mathematica实际上有一个卷积函数。它上面的文档有很多不同的例子:

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

答案 2 :(得分:0)

我对Mathematica了解不多,所以我只能帮助你(部分)了解Matlab部分。

使用Matlab进行卷积转换函数意味着您可以用数字方式进行卷积。你对积分定义的意思是你想象征性地做它。为此,您需要Matlab Symbolic Toolbox。这本质上是Matlab的Maple插件。所以你想知道的是它在Maple中是如何工作的。

您可能会发现此链接有用(wikibooks),以便在Matlab中对MuPad进行介绍。

我尝试将你的盒子函数实现为Matlab中的函数

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

但是当t是ob符号类型Function 'gt' is not implemented for MuPAD symbolic objects时,这不起作用。

您可以将f声明为分段函数,请参阅(matlab online help),但这在我的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实际上可以解决这个问题,请记住,Matlab附带的MuPad只是Maple的精简版本。也许以上可能仍然可以帮助你,它应该让你了解事情是如何协同工作的。尝试为f添加更好的功能,例如一个多项式,你应该让它工作。