2017-05-02 7 views
1

ich eine Funktion auf meine Daten angepasst haben:Wo Funktion gleich bestimmten Wert hat

BCF.plot <- function(x) { 
    vv[2] +((vv[3]/(2*(1-vv[4])))*(cos(x-vv[1])-vv[4]+abs(cos(x-vv[1])-vv[4]))) 
} 

Es ist eine Kosinuswelle Basislinie (b), das heißt eine Basislinie mit einer Kosinuswelle oben drauf. Jetzt habe ich einen bestimmten Wert auf der Y-Achse (dlmo_val) und möchte wissen, welcher x-Wert damit übereinstimmt. Ich habe so etwas wie dies versucht:

BCF.dlmo <- function(x, dlmo_val = 0) { 
    vv[2] +((vv[3]/(2*(1-vv[4])))*(cos(x-vv[1])-vv[4]+abs(cos(x-vv[1])-vv[4])))-b-dlmo_val ## find point where function minus baseline & dlmo_val is 0 
} 

vv = c(2.3971780, 2.0666526, 11.1775231, 0.7870128) 
b = 2.066653 
H = 11.17752 

dlmo_val = 0.4*H ## dlmo*peak height above baseline, H is result from optimisation 
uniroot(BCF.dlmo, c(0.2617994, 6.021386), dlmo_val=dlmo_val) ## lower & upper are min(x) and max(x) 

jedoch uniroot sagt mir

"...values at end points not of opposite sign" 

Ich bin nicht wirklich sicher, wie um dies zu realisieren. Alle Empfehlungen sind mehr als willkommen!

+1

Was sind 'b' und 'H 'gleich? –

+0

Ah Entschuldigung, habe ich vergessen und den Beitrag entsprechend bearbeitet ... –

+0

'curve (BCF.dlmo (x, dlmo_val = dlmo_val), von = 0.2617994, bis = 6.021386)' zeigt, dass es zwei Punkte gibt, an denen deine Funktion gleich Null ist- Willst du beide finden? Nur einer? –

Antwort

1

As described in this post, uniroot() ist für das Finden nur einer Null in einer Funktion entwickelt, während Sie zwei Nullen haben. Man könnte es auf einem kleineren Intervall nennen:

uniroot(BCF.dlmo, c(0.2617994, 2.5), dlmo_val = dlmo_val)$root 
# [1] 1.886079 

Da dieser Beitrag beschreibt, Sie stattdessen die unitroot.all Funktion im rootSolve package beide Nullen finden verwenden können:

library(rootSolve) 
uniroot.all(BCF.dlmo, c(0.2617994, 6.021386), dlmo_val = dlmo_val) 
# [1] 1.886084 2.908276 
+0

Sie können 'uniroot' mit dem Argument' extendInt = "yes" 'verwenden und es wird eine Null außerhalb des angegebenen Anfangsbereichs gefunden, indem das Intervall erweitert wird. Aber auch dieser Prozess hat seine Mängel. – Spacedman

Verwandte Themen