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:
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?
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