1

特定の間隔でゼロになり、他の場所ではテスト関数のように見える区分的周期関数を実装したいと思います(たとえばexp(a^2/(abs(x)^2-a^2))abs(x)< aそれ以外の場合はゼロ)。
私は試した

nu = @(x) ((8*10^(-4)/exp(1)*exp(30^2./(abs(mod(x,365)-31).^2-30.^2))).* ... 
        and((1<mod(x,365)),(mod(x,365)<61)) + ...
      (8*10^(-4)/exp(1)*exp(10^2./(abs(mod(x,365)-300).^2-10.^2))).* ...
        and((290<mod(x,365)),(mod(x,365)<310)));

それぞれ

nu = @(x) ((0*x).* and((0<=mod(x,365)),(mod(x,365)<=1)) + ...
      (8*10^(-4)/exp(1)*exp(30^2./(abs(mod(x,365)-31).^2-30.^2))).* ... 
        and((1<mod(x,365)),(mod(x,365)<61)) + ...
      (0*x).* and((61<=mod(x,365)),(mod(x,365)<=290)) + ...
      (8*10^(-4)/exp(1)*exp(10^2./(abs(mod(x,365)-300).^2-10.^2))).* ...
        and((290<mod(x,365)),(mod(x,365)<310)) + ...
      (0*x).* and((310<=mod(x,365)),(mod(x,365)<365)));

これは同じように動作するはずです。目的は [0,365) の周期を持つことです。したがって、モジュロです。

今私の問題はそれnu(1)=nu(61)=nu(290)=nu(310)=NaNであり、それらの小さな近所でもありますnu(0.99)=NaN。しかし、指数関数からこれらのポイントを除外しました。これが問題を引き起こす可能性があります。また、指数関数 ((2,60) と (291,309) など) に小さい間隔を使用してもNaN、同じポイントで受け取ります。

何か案は?アドバイスありがとう!

4

1 に答える 1

0

ゼロ除算または関連するエラーのリスクがあるベクトル化された計算を実行するときに使用する1つのトリックは、条件を使用して問題の値を変更することです。たとえば、ベクトル内のすべてのエントリを反転したいが、ゼロはゼロのままにしておきたいとします(たとえば、1e-8内の任意の値もゼロに設定します)。あなたはこれをするでしょう:

outVect = 1./(inVect+(abs(inVect)<=1e-8)).*(abs(inVect)>1e-8);

abs(value)> 1e-8の条件を満たす値の場合、これは1/valueを計算します。abs(value)<= 1e-8の場合、実際には1 /(value + 1)を計算し、次にゼロを掛けて、ゼロ値になります。分母の内部に条件がない場合、値がゼロのときに1 / valueを計算し、結果としてinf ...になり、次にinfにゼロを掛けてNaNになります。

同じ手法が、より複雑な無名関数でも機能するはずです。

于 2013-03-17T02:50:07.567 に答える