の畳み込みを計算しようとしています
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 を学んでいますが、ここに私が思いついたものがあります..
まず、区分関数を定義します (Wikipedia のページの例を使用しています)。
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)
ただし、積分を計算しようとすると、これを返すのにほぼ 1 分かかりました。
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 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 に入れてみてください。機能するはずです。