二次プログラムに関して、次のような目的関数をどのように設定しますか
min ∑a_i (x_i )^2
パッケージ「quadprog」または「limSolve」のマトリックス形式で(このパッケージでは、マトリックス形式にする必要があるかどうかわかりません)?
これまでの議論から、二次項の乗算はありませんでした。
二次プログラムに関して、次のような目的関数をどのように設定しますか
min ∑a_i (x_i )^2
パッケージ「quadprog」または「limSolve」のマトリックス形式で(このパッケージでは、マトリックス形式にする必要があるかどうかわかりません)?
これまでの議論から、二次項の乗算はありませんでした。
あなたが言及した形式の単純な線形制約付き二次プログラムを考えてみましょう:
min 0.5x^2 + 0.7y^2
s.t. x + y = 1
x >= 0
y >= 0
quadprog
パッケージによる解決quadprog
パッケージは、次の形式のモデルを受け入れます。
min −d'b + 1/2b'Db
s.t. A'b >= b0
問題をこの形式にするには、 を主対角とする行列と、3 つの制約と右辺を含む行列D
を作成する必要があります。(2*0.5 2*0.7)
A
b0
dvec <- c(0, 0)
Dmat <- diag(c(1.0, 1.4))
Amat <- rbind(c(1, 1), c(1, 0), c(0, 1))
bvec <- c(1, 0, 0)
meq <- 1 # The first constraint is an equality constraint
これを にフィードできますsolve.QP
:
library(quadprog)
solve.QP(Dmat, dvec, t(Amat), bvec, meq=meq)$solution
# [1] 0.5833333 0.4166667
limSolve
パッケージによる解決limSolve
パッケージの関数lsei
は、次の形式のモデルを受け入れます。
min ||Ax-b||^2
s.t. Ex = f
Gx >= h
目的関数を取得するには、主対角を0 ベクトルに設定した行列と、他の情報をエンコードする行列とベクトルをA
作成する必要があります。(sqrt(0.5) sqrt(0.7))
b
A <- diag(c(sqrt(0.5), sqrt(0.7)))
b <- c(0, 0)
E <- rbind(c(1, 1))
f <- 1
G <- diag(2)
h <- c(0, 0)
これで、この情報を にフィードできますlsei
:
library(limSolve)
lsei(A, b, E, f, G, h)$X
# [1] 0.5833333 0.4166667