2017-08-15 3 views
1

J'ai une fonction comme suit:une régression inverse Construct par sapply et 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() 

Maintenant, je voudrais faire une régression inverse sur cette certaine fonction. Je l'ai vu Solving for the inverse of a function in R:

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)

et je suis en train de l'adapter à mes besoins comme suit:

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) 

Malheureusement, ce rendement:

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 

Pour autant que je compris : L'erreur signifie qu'il y a plus de racines qu'une seule (uniroot ne peut gérer qu'une racine) mais il ne devrait pas y avoir plus d'une racine car c'est une fonction strictement monotone. Les avertissements que je ne comprends pas ..

modifier: Je suis en train de se placer derrière elle .. je l'ai enlevé les deux exponentielles qui donne le tracé suivant:

enter image description here

et cela génère encore les éléments suivants erreur:

> 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 

Pourquoi est-ce? Évidemment, la courbe a des signes opposés aux deux extrémités. Je suppose que les points extrêmes signifient les points gauche et droite à la racine?

+0

Ok, je l'ai résolu. Je ne sais pas ce que c'était exactement mais quand j'ai transformé le produit de matrice-vecteur à une fonction régulière cela fonctionne :) – Ben

Répondre

0

Probablement la régression inverse n'a pas fonctionné en raison de la définition de «certaine_fonction». C'est un produit matriciel-vectoriel et le résultat est à nouveau un vecteur. Par conséquent, j'ai transformé cela en une fonction régulière function(x) exp(exp(sum(x^0*VK[1],x^1*VK[2],x^2*VK[3],x^3*VK[4])) et maintenant il fonctionne. Par conséquent, il faut être conscient des limites à chaque fois en général.