इस अवसर पर optim
स्पष्ट रूप से काम नहीं करेगा क्योंकि आपके पास समानता बाधाएं हैं। constrOptim
इसी कारण से काम नहीं करेगा (मैंने समानता को दो असमानताओं में परिवर्तित करने की कोशिश की है यानी 15 से अधिक और कम से कम लेकिन यह constrOptim
के साथ काम नहीं करता है)।
हालांकि, इस तरह की समस्या के लिए समर्पित एक पैकेज है और यह Rsolnp
है।
आप इसे निम्नलिखित तरीके से उपयोग:
#specify your function
opt_func <- function(x) {
10 - 5*x[1] + 2 * x[2] - x[3]
}
#specify the equality function. The number 15 (to which the function is equal)
#is specified as an additional argument
equal <- function(x) {
x[1] + x[2] + x[3]
}
#the optimiser - minimises by default
solnp(c(5,5,5), #starting values (random - obviously need to be positive and sum to 15)
opt_func, #function to optimise
eqfun=equal, #equality function
eqB=15, #the equality constraint
LB=c(0,0,0), #lower bound for parameters i.e. greater than zero
UB=c(100,100,100)) #upper bound for parameters (I just chose 100 randomly)
आउटपुट:
> solnp(c(5,5,5),
+ opt_func,
+ eqfun=equal,
+ eqB=15,
+ LB=c(0,0,0),
+ UB=c(100,100,100))
Iter: 1 fn: -65.0000 Pars: 14.99999993134 0.00000002235 0.00000004632
Iter: 2 fn: -65.0000 Pars: 14.999999973563 0.000000005745 0.000000020692
solnp--> Completed in 2 iterations
$pars
[1] 1.500000e+01 5.745236e-09 2.069192e-08
$convergence
[1] 0
$values
[1] -10 -65 -65
$lagrange
[,1]
[1,] -5
$hessian
[,1] [,2] [,3]
[1,] 121313076 121313076 121313076
[2,] 121313076 121313076 121313076
[3,] 121313076 121313076 121313076
$ineqx0
NULL
$nfuneval
[1] 126
$outer.iter
[1] 2
$elapsed
Time difference of 0.1770101 secs
$vscale
[1] 6.5e+01 1.0e-08 1.0e+00 1.0e+00 1.0e+00
तो जिसके परिणामस्वरूप इष्टतम मान हैं:
$pars
[1] 1.500000e+01 5.745236e-09 2.069192e-08
जिसका अर्थ है कि पहले पैरामीटर है 15 और शेष शून्य और शून्य। यह वास्तव में आपके फ़ंक्शन में वैश्विक न्यूनतम है क्योंकि x2 फ़ंक्शन में जोड़ रहा है और 5 * x1 के परिणाम पर x3 की तुलना में बहुत अधिक (नकारात्मक) प्रभाव है। 15, 0, 0 की पसंद बाधाओं के अनुसार समाधान के लिए समाधान और वैश्विक न्यूनतम है।
समारोह बहुत अच्छा काम करता है!
अच्छा है! जब ओपी कहता है: "यह वास्तविक समस्या का एक सरल उदाहरण है" यह मुझे सोचता है कि वास्तविक समस्या nonlinear हो सकती है। तो, बस यह सुनिश्चित करने के लिए कि मैंने एक nonlinear विधि का सुझाव दिया है (जो कि धीमा होने पर भी काम करता है)। यदि गति एक मुद्दा है तो ढाल प्रदान करना (इस मामले के लिए सरल) इसे और भी तेज बनाता है। वैसे भी, मेरा मतलब बुरा नहीं है, यह वाकई अच्छा है कि आपने यह जवाब जोड़ा, निश्चित रूप से सहायक। – LyzandeR