MATLAB初心者はこちら。ヘヴィサイド関数を滑らかに近似しようとしていますheaviside(x)
。そのために、バンプ機能を備えた標準的な軟化手順を実行しています。これは、プロセスを実行する必要があると思われるネストされた関数smooth
です(エレガントでないソリューションである場合は申し訳ありません)。
function c = smooth(q,y,e)
c = e.^-1*int(igrand(q,y),y,-2,2);
igrand(q,y)
function i = igrand(q,y)
i = dbump(q)*heaviside(y);
dbump(q)
function d = dbump(q)
d = compose(nbump,quot,x,q);
nbump(x);
quot(x,y,e);
function n = nbump(x)
n = bump(x)*(ibump(x)).^-1;
ibump(x)
function i = ibump(x)
i = integral(@bump, -2, 2);
bump(x)
function b = bump(x)
region1 = abs(x) < 1;
b(region1) = (exp(-1./(1 - x(region1).^2)));
region2 = abs(x) >= 1;
b(region2) = 0;
function q = quot(x,y,e)
q = (x-y)./e;
end
end
end
end
end
end
end
また、私のフォーマットを許してください。最後のend
ものは、前のものの左側にある必要があります。また、 の定義はsmooth
、ボディの残りの部分の左側にある必要があります。
x = -2:.01:2
、e = .1
およびを選択しますsyms y real
。ただし、実行するplot(x, smooth(q,y,e))
と、次のエラーが発生します。
Error using smooth/igrand/dbump/nbump (line 16)
Not enough input arguments.
Error in smooth/igrand/dbump (line 10)
d = compose(nbump,quot,x,q);
Error in smooth/igrand (line 6)
i = dbump(q)*heaviside(y);
Error in smooth (line 2)
c = e.^-1*int(igrand(q,y),y,-2,2);
実際に関数を書いているときに表示される唯一のエラーはquot
、関数が使用されていない可能性があることを示す下線です。しかし、私はそれを構成していませんnbump
か?
編集:私はcompose(nbump,quot,x,q);
ちょうどnbump(quot(x,y,e));
に変更し、すべての変数を変更して、それらが整列するようにしました(qはもうありません)。を実行するplot(x,smooth(x,y,e))
と、しばらく実行された後、停止し、次のエラー メッセージが表示されます。
Error using symengine (line 58)
Unable to prove 'abs(10*y + 20) < 1' literally. To test the statement mathematically, use isAlways.
Error in sym/subsindex (line 1554)
X = find(mupadmex('symobj::logical',A.s,9)) - 1;
Error in sym>privformat (line 2357)
x = subsindex(x)+1;
Error in sym/subsref (line 1578)
[inds{k},refs{k}] = privformat(inds{k});
Error in bump (line 3)
b(region1) = (exp(-1./(1 - x(region1).^2)))
Error in smooth/igrand/dbump/nbump (line 16)
n = bump(x)*(ibump(x)).^-1;
Error in smooth/igrand/dbump (line 10)
d = nbump(quot(x,y,e));
Error in smooth/igrand (line 6)
i = dbump(x,y,e)*heaviside(y);
Error in smooth (line 2)
s = e.^-1*int(igrand(x,y,e),y,-2,2);