我正在尝试计算
的卷积x(t) = 1, -1<=t<=1
x(t) = 0, outside
自己使用定义。
http://en.wikipedia.org/wiki/Convolution
我知道如何使用Matlab函数转换,但我想使用积分定义。我对Matlab和WolframAlpha的了解非常有限。
答案 0 :(得分: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])
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>')
答案 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添加更好的功能,例如一个多项式,你应该让它工作。