问题:
我在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不敏感?
答案 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