atan(c * tan(x))不考虑x> pi / 2

时间:2014-06-17 11:39:06

标签: matlab arguments

问题:

我在Matlab中遇到一个问题,它有一个函数的一部分来计算

的值
atan(c*tan(x)).

对于某些真实的c和x,其中x是一个角度。通常这会在-pi / 2和pi / 2之间返回一些值,但我想要注意"角度绕过的频率&#34 ;:例如,对于c = 1,我们得到x = pi的相同结果/ 2且x = 3 * pi / 2。

这是我想要避免的,在这种情况下我希望它计算x = 3 * pi / 2的值3 * pi / 2(我知道对于c = 1 atan而tan会取消,但对于任意真实的c,他们没有)。

换句话说,我想让atan(c * tan(x))在x中的R上连续。

我是如何尝试修复的:

我只是添加了一个关注tangens论证的函数:

atan(c*tan(x))+pi.*(floor((x./pi)+(1/2)))

这适用于不太接近切线函数极点的值,但一旦x位于!非常!在它附近发生故障(观察到高度跳跃)。这对于我的计算尤其是一个问题,因为x始终接近其中一个极点。

似乎还有什么问题:

Imho的问题是,tangens具有更高的分辨率"靠近它的两极而不是地板功能"使其跳跃过早/过迟以进行校正功能。

我的问题:

是否还有另一种可能性来解决这个问题,即对切线两极附近的x不敏感?

1 个答案:

答案 0 :(得分:2)

此问题有多种可能的解决方案。一个简单的例子就是在pi + k * pi / 2附近使用x的特殊情况,让atan(c * tan(x))= + - pi / 2取决于x是稍微小一点,还是稍微大于pi / 2分别。

function Out = ContTangents(In,RidgeParam)
InOverPi = In./pi; 
Rounded = round(InOverPi); 
CloseRounded = round(InOverPi+1/2)-1/2; 

ArctanResult = zeros(size(In)); 
IsCloseVal = abs(InOverPi - CloseRounded) < 0.00001; 
CloseVal = sign(RidgeParam*(CloseRounded-InOverPi)) * pi/2; 
NotCloseVal = atan(RidgeParam*tan(In)); 

ArctanResult(IsCloseVal) = CloseVal(IsCloseVal); 
ArctanResult(~IsCloseVal) = NotCloseVal(~IsCloseVal); 

Out = ArctanResult + pi*(Rounded + 1/2); 

这个解决方案似乎可以产生漂亮的曲线,据我所知它可以避免不连续性和奇点。至少,当我跑

时似乎很好
figure, plot(ContTangents(-10:.001*pi:10,2))

编辑:修改了该功能的某些部分。当运行ContTangents(pi/2-exp(-36),2)(下面的OP示例中的问题值)时,我发现了这种非常特殊的行为。这是Matlab中的错误吗?

K>> InOverPi<0.5
ans =
     1
K>> round(InOverPi)
ans =
     1

这可以通过重新定义自己的round函数来解决,该函数在点.5-eps(.25)处不会失败。事实上,由于浮动点的极限娱乐行为,您甚至无法定义该数字,但您必须按照以下步骤进行操作。

format hex
(pi/2-exp(-36))/pi
ans =
   3fdfffffffffffff
-eps(.25)+.25+.25
ans =
   3fdfffffffffffff