基于反三角函数的成本函数
Cost function based on inverse trigonometric functions
我有两个点,分别命名为 source
和 target
。我知道源的坐标(例如 [-1 1]
),问题是确定目标的位置(例如 [1 -1]
)。
我有一些测量值,其中之一是从目标指向源的箭头角度(即 135 deg
)。
为了找到目标的位置,我定义了一个误差函数来最小化;我正在使用梯度下降算法,所以我有一个符号误差函数,例如;
syms xs ys xt yt
z(xs,ys,xt,yt) = theta - asin((ys - yt)/((xs - xt)^2 + (ys - yt)^2)^.5);
其中theta
为测量角度,135 deg
(对于理想解z
,误差为零,135 - 135 = 0
)
还有其他测量值,我计算了这些误差函数的雅可比行列式并将误差最小化。
无论如何,问题在于此示例中的 theta
是 135 deg
,但据我们所知,asin
的输出是 [-90 90]
,对于此示例,它是asin(1/2^.5) = 45 deg
。所以对于正确的答案,我的错误函数 z
不会为零,我需要更改我的错误函数,我应该使用什么?
我只需要一个误差函数,让我的 theta
在 [0 360]
范围内变化,而 asin
和 atan
的范围是 [-90 90]
,我可以由于符号函数,不要使用 if
语句。
Matlab 定义 sym/atan2(Y,X)
如果没有,您可以使用
创建它
function [ theta ] = atan2( dy,dx )
%ATAN2 Four Quadrant Arc Tangent Function
%
if dx>0
theta = atan(dy/dx);
elseif dx<0
theta = atan(dy/dx)+sign(dy)*pi;
else
theta = sign(dy)*pi/2;
end
end
终于可以像
一样使用它了
z = theta - atan2(ys - yt, xs - xt);
正如@LuisMendo 指出的那样。
更新
Wikipedia 提到
atan2(y,x) = 2*atan(y/(sqrt(x^2+y^2)+x));
令phi
表示箭头从源到目标的角度。您需要一个非负且单峰的误差函数,仅 theta==phi
的值为零。
函数满足此条件
z = (cos(theta) - cos(phi))^2 + (sin(theta) - sin(phi))^2;
或等效地,使用 xs
、ys
、xt
、yt
而不是 phi
、
z = (cos(theta) - (xs-xt)/((xs - xt)^2 + (ys - yt)^2)^.5)^2 + ...
(sin(theta) - (ys-yt)/((xs - xt)^2 + (ys - yt)^2)^.5)^2;
这个误差函数有以下解释:如果角度theta
和phi
表示为单位圆中的点,z
就是的平方长度连接这两点的和弦。
当然,可以通过简单地将 sqrt
应用于上面的表达式来根据长度(而不是平方长度)来定义误差;并且可以通过除以 2
在 0
和 1
之间归一化。
我有两个点,分别命名为 source
和 target
。我知道源的坐标(例如 [-1 1]
),问题是确定目标的位置(例如 [1 -1]
)。
我有一些测量值,其中之一是从目标指向源的箭头角度(即 135 deg
)。
为了找到目标的位置,我定义了一个误差函数来最小化;我正在使用梯度下降算法,所以我有一个符号误差函数,例如;
syms xs ys xt yt
z(xs,ys,xt,yt) = theta - asin((ys - yt)/((xs - xt)^2 + (ys - yt)^2)^.5);
其中theta
为测量角度,135 deg
(对于理想解z
,误差为零,135 - 135 = 0
)
还有其他测量值,我计算了这些误差函数的雅可比行列式并将误差最小化。
无论如何,问题在于此示例中的 theta
是 135 deg
,但据我们所知,asin
的输出是 [-90 90]
,对于此示例,它是asin(1/2^.5) = 45 deg
。所以对于正确的答案,我的错误函数 z
不会为零,我需要更改我的错误函数,我应该使用什么?
我只需要一个误差函数,让我的 theta
在 [0 360]
范围内变化,而 asin
和 atan
的范围是 [-90 90]
,我可以由于符号函数,不要使用 if
语句。
Matlab 定义 sym/atan2(Y,X)
如果没有,您可以使用
创建它function [ theta ] = atan2( dy,dx )
%ATAN2 Four Quadrant Arc Tangent Function
%
if dx>0
theta = atan(dy/dx);
elseif dx<0
theta = atan(dy/dx)+sign(dy)*pi;
else
theta = sign(dy)*pi/2;
end
end
终于可以像
一样使用它了z = theta - atan2(ys - yt, xs - xt);
正如@LuisMendo 指出的那样。
更新 Wikipedia 提到
atan2(y,x) = 2*atan(y/(sqrt(x^2+y^2)+x));
令phi
表示箭头从源到目标的角度。您需要一个非负且单峰的误差函数,仅 theta==phi
的值为零。
函数满足此条件
z = (cos(theta) - cos(phi))^2 + (sin(theta) - sin(phi))^2;
或等效地,使用 xs
、ys
、xt
、yt
而不是 phi
、
z = (cos(theta) - (xs-xt)/((xs - xt)^2 + (ys - yt)^2)^.5)^2 + ...
(sin(theta) - (ys-yt)/((xs - xt)^2 + (ys - yt)^2)^.5)^2;
这个误差函数有以下解释:如果角度theta
和phi
表示为单位圆中的点,z
就是的平方长度连接这两点的和弦。
当然,可以通过简单地将 sqrt
应用于上面的表达式来根据长度(而不是平方长度)来定义误差;并且可以通过除以 2
在 0
和 1
之间归一化。