2016-09-11 5 views
1

Ich versuche, eine Funktion mit zwei Parametern zu optimieren (minimieren), die eine eindeutige Lösung haben sollten.Optimieren einer Funktion in R mit mehr als einer Lösung

foo <- function(x) { 
    x1 <- x[1] 
    x2 <- x[2] 
    t=5-sqrt((0-x1)^2+(0-x2)^2); 
    u=4-sqrt((0-x1)^2+(4-x2)^2); 
    v=3-sqrt((3-x1)^2+(0-x2)^2); 
    return(sum(t,u,v)) 
}  

optim(c(0,0), foo) 

Diejenigen, die Mittelschule Mathematik liebte die Formel für den Abstand zwischen zwei Punkten auf einer cartesianischen (x, y) Koordinatenebene kann erkennen. Die Funktion foo wird so geschrieben, dass x1 die x-Koordinate und x2 die y-Koordinate eines Punktes ist, den ich suche. In diesem Fall ist dieser Punkt (3,4). Jedoch bekomme ich eine whacky Ausgabe:

optim(c(0,0), foo) 
$par 
[1] -3.938866e+54 1.293779e+54 

$value 
[1] -1.243772e+55 

$counts 
function gradient 
    501  NA 

$convergence 
[1] 1 

$message 
NULL 

Irgendeine Idee, was schief geht?

+5

Raten Sie das Konzept der * Lösung * sind vermasselt (das heißt die Nullen einer Funktion zu finden) mit dem von der mimimum zu finden (oder Maximum) einer Funktion. "optim" tut letzteres, während ich denke, dass Sie an ersterem interessiert sind. – nicola

+0

Wenn Sie versuchen, das Minimum zu finden, sollten die Quadratwurzeln positiv und nicht negativ sein. Wenn negativ, ist das Minimum der am weitesten entfernte Punkt von diesen drei Punkten. –

Antwort

1

Ihre Funktion hat kein Minimum, da t, u und v kleiner werden, wenn x1 und x2 weiter von den drei festen Punkten (0,0), (0,4) und (3,0) entfernt sind.

Es scheint, dass Sie einen Punkt (x1, x2) finden möchten, der den Abstand zu diesen drei Punkten minimiert. Wenn das der Fall ist, sollten Sie definieren f als:

foo <- function(x) { 
    x1 <- x[1] 
    x2 <- x[2] 
    t = 5 + sqrt((0-x1)^2+(0-x2)^2); 
    u = 4 + sqrt((0-x1)^2+(4-x2)^2); 
    v = 3 + sqrt((3-x1)^2+(0-x2)^2); 
    return(sum(t,u,v)) 
} 

Beachten Sie, dass die einzige Änderung -sqrt-+sqrt ist.

Die Antwort ist nicht Punkt (3,4), wie Sie erwarten, das Minimum ist ein Punkt innerhalb des Dreiecks, die diese drei Punkte als Eckpunkt haben.

Lösung:

> z 
$par 
[1] 0.7510095 0.6954136 

$value 
[1] 18.76643 

$counts 
function gradient 
     59  NA 

$convergence 
[1] 0 

$message 
NULL 

Der rote Punkt ist die Lösung: Solution

1

Das Hauptproblem war, dass die 3 und 4 umgedreht wurden. Der andere war, dass deine Differenzen unterschrieben wurden. Aber auch die Routine kann auf ein lokales Minimum konvergieren, das nicht das absolute Minimum ist. Statt dessen:

foo <- function(x) { 
    t=5-sqrt((0-x[1])^2+(0-x[2])^2); 
    u=3-sqrt((0-x[1])^2+(4-x[2])^2); 
    v=4-sqrt((3-x[1])^2+(0-x[2])^2); 
    return(sum(abs(t),abs(u),abs(v))) 
}  

optim(c(4,0), foo) 
+0

Ich hätte Ihre x1 und x2 alleine lassen können, ich habe nur daran herumgebastelt, um zu sehen, ob sie einen Schreibfehler verursacht haben (das waren sie nicht). Die Ausgabe ist $ par [1] 3 4 $ Wert [1] 1.074521e-07 Zählungen $ Funktion gradient 125 NA $ Konvergenz [1] 0 $ message NULL –

+0

Dies ist hilfreich - danke. – Nick

Verwandte Themen