R中的三角精度

时间:2013-07-08 15:01:30

标签: r trigonometry dot-product

所以我遇到了以下问题:

  

“在抛物线y = x2 / k上,选择三个点A(a,a2 / k),B(b,b2 / k)和C(c,c2 / k)。

     

令F(K,X)为整数四元组(k,a,b,c)的数量,使得三角形ABC的至少一个角度为45度,其中1≤k≤K且-X ≤a< b&lt; c≤X。

     

例如,F(1,10)= 41并且F(10,100)= 12492。   找到F(106,109)。“

为了解决这个问题,我利用了点积的几何定义:theta = cos ^ -1((A点B)/(| A | * | B |)),其中A和B是欧几里德向量,| A |表示A的大小,θ是它们之间的角度。

我已多次阅读我的脚本,据我所知,导致FoKX = 22而不是FoKX = 41的唯一原因是三角测量精度或从弧度到度数的转换有误差。如果是这种情况,请告诉我,否则我在某处可能会犯错。非常感谢您的帮助!

K<-1
X<-10
FoKX<-0
for(l in 1:K){
  for(i in (-X):(X-2)){
    for(j in (i+1):(X-1)){
      for(k in (j+1):X){
        vecAB<-c(j-i,(j^2-i^2)/l)
        vecAC<-c(k-i,(k^2-i^2)/l)
        vecBA<--vecAB
        vecBC<-c(k-j,(k^2-j^2)/l)
        vecCA<--vecAC
        vecCB<--vecBC
        magAB<-sqrt(sum(vecAB^2))
        magAC<-sqrt(sum(vecAC^2))
        magBA<-magAB
        magBC<-sqrt(sum(vecBC^2))
        magCA<-magAC
        magCB<-magBC
        ABdotAC<-sum(vecAB*vecAC)
        BAdotBC<-sum(vecBA*vecBC)
        CAdotCB<-sum(vecCA*vecCB)
        angA<-acos(ABdotAC/(magAB*magAC))
        angB<-acos(BAdotBC/(magBA*magBC))
        angC<-acos(CAdotCB/(magCA*magCB))
        if(angA==pi/4||angB==pi/4||angC==pi/4){
          FoKX<-FoKX+1
        }
      }
    }
  }
}

2 个答案:

答案 0 :(得分:4)

不要比较与浮点的精确相等性。始终包含模糊因子。

        ....
        ....
        if(abs(angA - pi/4) < 1e-9 ||
           abs(angB - pi/4) < 1e-9 || 
           abs(angC - pi/4) < 1e-9){
          FoKX<-FoKX+1
        }
      }
    }
  }
}

FoKX
[1] 41

答案 1 :(得分:2)

在处理浮点平等时,我发现我的这个玩具很有帮助: (像啤酒一样免费,可根据需要随意修改,等等)

approxeq <- function(x, y, tolerance = .Machine$double.eps ^ 0.5,...) {
  #input validation 
  if (length(x) != length(y)) warning('x,y lengths differ. Will recycle.')
  #don't care about dimensions so long as you're smart about inputs
  checkit <- abs(x-y) < tolerance
  return(invisible(checkit))
}

这会返回一个逻辑向量,与内置all.equal不同,后者有自己的用途。