3

我正在尝试计算的卷积

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

本身使用定义。

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

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

4

3 回答 3

8

我自己还在学习 Mathematica,但这就是我想出的..

首先我们定义分段函数(我使用的是维基百科页面中的示例)

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

分段函数

让我们绘制函数:

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

功能图

然后我们编写定义f与自身卷积的函数:

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

卷积积分

和情节:

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

卷积图


编辑

我尝试在 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)

卷积

情节(也花了太长时间)

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

卷积图

请注意,可以在 MATLAB 内部使用以下语法进行相同的操作:

evalin(symengine,'<MUPAD EXPRESSIONS HERE>')
于 2011-09-14T17:23:54.593 回答
1

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

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

于 2011-09-16T20:29:48.527 回答
0

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

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

您可能会发现此链接对于在 Matlab 中介绍 MuPad很有用( wikibooks)。

我试图将你的盒子功能实现为 Matlab 中的一个函数

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

但是,当 t 是 ob 符号类型时,这不起作用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 可以真正解决这个问题,记住 Matlab 附带的 MuPad 只是 Maple 的精简版。也许以上内容可能仍然对您有所帮助,它应该让您了解事物如何协同工作。尝试为 f 输入一个更好的函数,例如多项式,你应该让它工作。

于 2011-09-13T22:42:27.200 回答