Решение уравнения с использованием uniroot в R
Error in uniroot(f.mu3, interval = c(lower, upper)) :
f.upper = f(upper) is NA
In addition: Warning message:
In sqrt((d[4] * mvec[4] * n - m * mu)^2 - 4 * d[4] * nvec[4] * n * :
NaNs produced
Я пытаюсь найти решение сложной функции, используя
uniroot
. Но я не понимаю вышеуказанную ошибку (как и предупреждение!). кто-нибудь знает, как это исправить. Вот полный код R :
Что такое
f.lower
а также
f.upper
?
Примечание: в последней строке моей функции, если я изменю знак с -ve на +ve, я не получу никакого предупреждения!
f.mu3<-function(mu){
d=c(1, -1, -1, 1)
nvec<-c(9,27,37,47)
mvec<-c(70,35,24,6)
n=sum(nvec)
m=sum(mvec)
m*n+d[1]*sqrt((d[1]*mvec[1]*n-m*mu)^2 - 4*d[1]*nvec[1]*n*m*mu)
-m*n+d[2]*sqrt((d[2]*mvec[2]*n-m*mu)^2 - 4*d[2]*nvec[2]*n*m*mu)
+m*n+d[3]*sqrt((d[3]*mvec[3]*n-m*mu)^2 - 4*d[3]*nvec[3]*n*m*mu)
-m*n+d[4]*sqrt((d[4]*mvec[4]*n-m*mu)^2 - 4*d[4]*nvec[4]*n*m*mu)
}
a1<-(n/m)*(mvec[1]+2*nvec[1] - 2*sqrt(nvec[1]^2 + nvec[1]*mvec[1]))
a2<-(n/m)*(mvec[2]+2*nvec[2] - 2*sqrt(nvec[2]^2 + nvec[2]*mvec[2]))
a3<-(n/m)*(mvec[3]+2*nvec[3] - 2*sqrt(nvec[3]^2 + nvec[3]*mvec[3]))
a4<-(n/m)*(mvec[4]+2*nvec[4] - 2*sqrt(nvec[4]^2 + nvec[4]*mvec[4]))
lower=-min(a2, a3)
upper=min(a1, a4)
uniroot(f.mu3, interval = c(lower, upper))
1 ответ
f.mu3(верхний) (верхний = 0,1601443) возвращает NAN, потому что (d[4]mvec[4] нм mu)^2 - 4 d [4]nvec[4]n m mu) <0
> (d[4]*mvec[4]*n-m*upper)^2 - 4*d[4]*nvec[4]*n*m*upper
[1] -1.228182e-08
, поэтому ошибка возникает, когда
uniroot(f.mu3, interval = c(lower, upper))