2017-08-15 4 views
1

habe ich eine Funktion wie folgt:Konstruieren Sie eine inverse Regression über sapply und uniroot

V <- seq(50, 350, by = 1) 
> VK 
    Voltage^0  Voltage^1  Voltage^2  Voltage^3 
-1.014021e+01 9.319875e-02 -2.738749e-04 2.923875e-07 
> plot(x = V, exp(exp(sapply(0:3, function(x) V^x) %*% VK)), type = "l"); grid() 

Nun würde Ich mag eine inverse Regression auf diese bestimmte Funktion zu tun.

inverse = function (f, lower = -100, upper = 100) { function (y) uniroot((function (x) f(x) - y), lower = lower, upper = upper) 1 }

square_inverse = inverse(function (x) x^2, 0.1, 100)

square_inverse(4)

und ich versuche, es zu meinem Zwecke anzupassen, wie folgt:: Ich habe Solving for the inverse of a function in R gesehen

certain_function <- function(x=V) { exp(exp(sapply(0:3, function(x) V^x) %*% VK)) } 

inverse = function (f, lower = 50, upper = 350) { 
    function (y) uniroot((function (x) f(x) - y), lower = lower, upper = upper)[1] 
} 

inverse_regression = inverse(certain_function, 50, 350) 

inverse_regression(2) 

Leider ist diese Ausbeute:

Error in uniroot((function(x) f(x) - y), lower = lower, upper = upper) : 
    f() values at end points not of opposite sign In addition: Warning messages: 
1: In if (is.na(f.lower)) stop("f.lower = f(lower) is NA") : 
    the condition has length > 1 and only the first element will be used 
2: In if (is.na(f.upper)) stop("f.upper = f(upper) is NA") : 
    the condition has length > 1 and only the first element will be used 

Soweit ich verstanden : Der Fehler bedeutet, dass es mehr Wurzeln als nur einen gibt (Uniroot kann nur eine Wurzel handhaben), aber es sollte nicht mehr als eine Wurzel geben, da es sich um eine streng monoton steigende Funktion handelt. Die Warnungen verstehe ich nicht ..

edit: Ich versuche, dahinter zu bekommen .. ich beide Exponentialgrößen entfernt, die die folgende Handlung ergibt:

enter image description here

und dies erzeugt noch die folgende Fehler:

> inverse_regression(0.1) 

Error in uniroot((function(x) f(x) - y), lower = lower, upper = upper) : 
    f() values at end points not of opposite sign In addition: Warning messages: 
1: In if (is.na(f.lower)) stop("f.lower = f(lower) is NA") : 
    the condition has length > 1 and only the first element will be used 
2: In if (is.na(f.upper)) stop("f.upper = f(upper) is NA") : 
    the condition has length > 1 and only the first element will be used 

Warum ist das? Offensichtlich hat die Kurve an beiden Endpunkten entgegengesetzte Vorzeichen. Ich denke, Endpunkte bedeuten die Punkte links und rechts von der Wurzel?

+0

Ok, ich habe es gelöst. Ich weiß nicht, was es genau war, aber wenn ich das Matrix-Vektor-Produkt in eine reguläre Funktion umwandelte, funktioniert es :) – Ben

Antwort

0

Wahrscheinlich hat die inverse Regression aufgrund der Definition von "bestimmte_funktion" nicht funktioniert. Dies ist ein Matrix-Vektor-Produkt und das Ergebnis ist wieder ein Vektor. Daher habe ich dies in eine reguläre Funktion umgewandelt function(x) exp(exp(sum(x^0*VK[1],x^1*VK[2],x^2*VK[3],x^3*VK[4])) und jetzt funktioniert es. Daher sollte man sich die Grenzen jedes Mal im Allgemeinen bewusst sein.