0

次の機能を最小化しようとしました。

func <- function(qq){
  x <- qq[1]
  y <- qq[2]
  output <- 1 - 2 * x + x^2 - 2 * y + 2 * x * y + y^2
  return(output)
}

x+y=1 かつ 0<=x,y<=1 の場合。Rsolnp パッケージで gosolnp を使用するには、まず cons を定義して eqfun 引数で使用します。

cons <- function(qq)
  sum(qq)

次に、gosolnp 関数を適用しました。

install.packages("Rsolnp")
require(Rsolnp)
gosolnp(fun = func, LB = c(0, 0), UB = c(1, 1), eqfun = cons, eqB = 1)

res$pars
[1] 0.8028775 0.1971225
res$value
[1]  2.606528e-09 -5.551115e-17

答えは x = 0 および y = 1 である必要がありますが、gosolnp を実行するたびに試すことができるように、その時点で func がほぼ 0 である新しいポイントが得られます (厳密にはそうではありません)。Mathematica と Maple はこの関数の最適化を非常に高速に行い、x = 0 および y = 1 という真の答えを返しますが、代わりに R で実行するたびに、正しくない新しい解が得られます。

alabama または DEoptim で spg() などの別の最適化関数も試しましたが、問題は解決されませんでした。

だから私の質問は:

1-Rでfuncを最小化できる解決策はありますか?

2- R と Mathematica の精度に違いはありますか? Mathematica では正確な答えが得られるのに R では得られないのはなぜですか?

前もって感謝します

4

3 に答える 3

4

2 つの変数xyy = 1 - xある場合、実際には 1 つの変数だけに問題がありますx。関数を次のように再パラメータ化できることに注意してください

1 - 2 * x + x^2 - 2 * (1 - x) + 2 * x * (1 - x) + (1 - x)^2

代数を調べると、これが の関数として一定であることがわかりますx。したがって、(0、1)の任意の値は解であり、アルゴリズムが収束する値は基本的にランダムになります。数値の丸めと開始点の選択に基づいています。x

の戻り値が数値精度の範囲内でゼロであるという事実gosolnpは、ヒントであるか、単に曲線をプロットするだけである必要があります。

于 2014-02-13T00:26:50.783 に答える
2

これらの特定のパッケージについて話すことはできませんがnloptr(...)、パッケージ内でnloptrはうまく機能しているようです:

# Non-Linear Optimization (package::nloptr)
F <- function(v){  
  x=v[1]
  y=v[2]
  output <- 1 - 2 * x + x^2 - 2 * y + 2 * x * y + y^2
}
Hc <- function(v) return(1-sum(v))

library(nloptr)
opt <- nloptr(x0=c(1/2,1/2), eval_f=F, lb = c(0,0), ub = c(1,1), 
              eval_g_eq = Hc, 
              opts = list(algorithm="NLOPT_GN_ISRES",maxeval=1e6))
opt$solution
# [1] 0.0005506997 0.9994492982
于 2014-02-12T23:38:40.057 に答える
2

関数は同じように 0 に等しいため、最小化しようとしても意味がありません。

library(Ryacas)
x <- Sym("x")
y <- 1-x
Simplify( 1 - 2 * x + x^2 - 2 * y + 2 * x * y + y^2)

与える:

expression(0)
于 2014-02-13T00:58:51.070 に答える