1

我想实现一个分段周期函数,它应该在某些间隔内为零,并且在其他地方看起来像一个测试函数(例如exp(a^2/(abs(x)^2-a^2))forabs(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

我在执行向量化计算时使用的一个技巧是使用条件来修改问题值,其中存在被零除或相关错误的风险。例如,假设您想反转向量中的所有条目,但将零保留为零(并将 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),然后乘以零,得到零值。如果分母内没有条件,它将在 value 为零时计算 1/value,从而得到 inf...,然后将 inf 乘以零,得到 NaN。

同样的技术应该适用于您更复杂的匿名函数。

于 2013-03-17T02:50:07.567 回答