2016-01-20 9 views
1

Я хотел бы использовать команду multiroot в пакете rootSolve, чтобы найти b и m. Код приведен ниже. Я пробовал разные стартовые значения, но результат был либо NaN, либо NaNs produced.Поиск корней системы уравнений

n <- 23 
model <- function(theta){ 
    b <- theta[1] 
    m <- theta[2] 
    power <- exp(-(x-m)*b) 
    a <- -n/sum(log(1-power)) 
    betat <- apply(x,1,function(x) (x-m)*power/(1-power)) 
    mut <- apply(x,1, function(x) power/(1-power)) 
    F1 <- n/b-sum(x)+n*m+(a-1)*sum(betat) 
    F2 <- n*b-b*(a-1)*sum(mut) 
    c(F1=F1,F2=F2) 
} 
multiroot(f = model, start = c(.5, .5)) 

Так может кто-нибудь объяснить мне, где ошибка, пожалуйста?

+0

Вы уверены, что есть решение? Помимо этих нелинейных задач в целом трудно. Они могут быть очень разумными относительно стартовых значений, критериев конвергенции ... – jogo

+0

Я добавил систему и сообщил о решении – mert

+0

. Есть ошибки в публикации? – mert

ответ

0
library(rootSolve) 
x<- c(17.88,28.92,33,41.52,42.12,45.6,48.40,51.84,51.96,54.12,55.56,67.80, 
    68.64,68.64,68.88,84.12,93.12, 98.64,105.12,105.84,127.92,128.04,173.4) 
n <- length(x) 

model <- function(theta){ 
    b <- theta[1] 
    m <- theta[2] 
    power <- exp(-(x-m)*b) 
    a <- -n/sum(log(1-power)) 
    F1 <- n/b-sum(x-m) + (a-1)*sum((x-m)*power/(1-power)) 
    F2 <- n*b - b*(a-1)*sum(power/(1-power)) 
    c(F1=F1,F2=F2) 
} 
# model(c(b = 0.031, m = 4.748)) 
multiroot(f = model, start = c(.03, 5)) 

поэтому результат:

> multiroot(f = model, start = c(.03, 5)) 
$root 
[1] 0.03140027 4.55976021 

$f.root 
      F1   F2 
-2.046363e-12 -6.217249e-15 

$iter 
[1] 5 

$estim.precis 
[1] 1.02629e-12 
+0

. но проблема все еще остается. Небольшие изменения начальных значений дают NaN. Фактически я проверил эти результаты и сравнил их с оригинальной бумагой. эти результаты лучше, чем те. Но начальные значения - действительно большая проблема. – mert

+0

Если ничего другого не помогает, нужно выполнить поиск по сетке для начальных значений. – jogo