我正在尝试计算的卷积
x(t) = 1, -1<=t<=1
x(t) = 0, outside
本身使用定义。
http://en.wikipedia.org/wiki/Convolution
我知道如何使用 Matlab 函数 conv,但我想使用积分定义。我对 Matlab 和 WolframAlpha 的了解非常有限。
我正在尝试计算的卷积
x(t) = 1, -1<=t<=1
x(t) = 0, outside
本身使用定义。
http://en.wikipedia.org/wiki/Convolution
我知道如何使用 Matlab 函数 conv,但我想使用积分定义。我对 Matlab 和 WolframAlpha 的了解非常有限。
我自己还在学习 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])
plot(f, x = -2..2)
但是,当我尝试计算积分时,花了将近一分钟才返回:
g := t -> int(f(x)*f(t-x), x = -infinity..infinity)
情节(也花了太长时间)
plot(g, t = -2..2)
请注意,可以在 MATLAB 内部使用以下语法进行相同的操作:
evalin(symengine,'<MUPAD EXPRESSIONS HERE>')
Mathematica 实际上有一个卷积函数。它的文档有许多不同的例子:
http://reference.wolfram.com/mathematica/ref/Convolve.html?q=Convolve&lang=en
我对 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 输入一个更好的函数,例如多项式,你应该让它工作。