我想在R(这是一个圆圈)中找到两个球体的交点,并在该圆圈上找到坐标的最大值和最小值。 领域是:
S1:x ^ 2 + y ^ 2 + z ^ 2 = 16
S2:(x + 1)^ 2 +(y + 1)^ 2 +(z + 1)^ 2 = 27
library(rgl)
s1 =spheres3d(x = 0, y = 0, z = 0, radius = 4)
s2 =spheres3d(x = -1, y = -1, z = -1, radius = sqrt(27))
我认为圆圈所在的平面将是:( R有什么方法可以从S1& S2中找到它?)。
P1:x + y + z = 4
所以现在我有一个最大化问题(P1受S1和S2影响):所以我做了这个代码:
eval_f <- function( x ) {
return( list( "objective" = (x[1]+x[2]+x[3])-4,
"gradient" = c(1,1,1) ))}
# constraint functions
eval_g_eq <- function( x ) {
constr <- cbind(c( (x[1]+1)^2 + (x[2]+1)^2 + (x[3]+1)^2 - 27) , c(x[1]^2+x[2]^2+x[3]^2-16))
grad <- cbind ( c( 2.0*(x[1]+1),
2.0*(x[2]+1),
2.0*(x[3]+1)
),c(2*x[1],2*x[2],2*x[3]) )
return( list( "constraints"=constr, "jacobian"=grad ) )
}
# initial values
x0 <- c( 0, 0, 0 )
local_opts <- list( "algorithm" = "NLOPT_LD_MMA",
"xtol_rel" = 1.0e-7 )
opts <- list( "algorithm" = "NLOPT_LD_AUGLAG",
"xtol_rel" = 1.0e-7,
"maxeval" = 1000,
"local_opts" = local_opts )
res <- nloptr( x0=x0,
eval_f=eval_f,eval_g_eq=eval_g_eq,
opts=opts)
print( res )
链接到手册 - nloptr功能。
但我认为有一个错误!