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 を学んでいますが、ここに私が思いついたものがあります..

まず、区分関数を定義します (Wikipedia のページの例を使用しています)。

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

piecewise_function

関数をプロットしましょう:

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

関数_プロット

それから、自分自身との畳み込みを定義する関数を書き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

ただし、積分を計算しようとすると、これを返すのにほぼ 1 分かかりました。

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

畳み込み

プロット(これも時間がかかりすぎた)

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

convolution_plot

次の構文を使用して、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 Symbolic Toolbox が必要です。これは基本的に、Matlab 用の Maple プラグインです。そこで知りたいのは、Maple でどのように機能するかです。

このリンク(ウィキブック)は、Matlab の MuPad の紹介に役立つ場合があります。

ボックス関数をMatlabの関数として実装しようとしました

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

ただし、これは t が ob シンボリック型の場合には機能しませんFunction 'gt' is not implemented for MuPAD symbolic objects

(matlab オンライン ヘルプ)fを参照して区分関数として宣言することもできますが、これは私の 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 に答える