2016-02-03 3 views
0

Я хотел бы поместить экспоненциальные кривые в массивы данных вертикальных температурных профилей. Иногда экспоненциальная форма является положительной и в других случаях отрицательной в зависимости от условий температуры воздуха. В конце я хотел бы подгонять каждую кривую, а затем извлекать градиент и перехватывать для серии отдельных профилей температуры (сделать петлю фитинга и извлечения параметров)Экспоненциальная подгонка кривой и извлечения градиента и перехвата

Я пробовал несколько предложений по stackoverflow и Google и не может пройти мимо этапа «первоначальной догадки» ... Любая помощь будет оценена по достоинству.

Моя последняя и наиболее многообещающим попытка ниже (взято из примера на StackOverflow - (whuber):

Мои данные:

Temps1<-c(284.1875, 285.6550, 286.2342, 286.9142, 287.7900,   
290.3492,295.2517, 298.1608) 
Temps2<-c(275.6958, 275.0583, 274.7858, 274.4458, 273.9900, 273.1675, 
272.3225, 271.5875) 
Depths<-c(-100,-70,-56,-42,-28,-14,0,7) 

d <- data.frame(x = Temps1, y = Depths) 
c.0 <- min(d[,1]) * 0.5 
model.0 <- lm(log(Temps1) - c.0 ~ Depths, data=d) 
start <- list(a=exp(coef(model.0)[1]), b=coef(model.0)[2], c=c.0) 
model <- nls(d[,1]~ a * exp(b * Depths) + c, data = d, start = start) 

Я застрял с ошибкой: «Ошибка в nlsModel (формула, mf, start, wts): сингулярная градиентная матрица при начальных оценках параметров Кроме того: Предупреждающие сообщения: 1: In min (x): нет не пропускаемых аргументов до мин; возврат Inf 2: In max (x): нет аргументов без пропусков до max; r eturning -Inf "

+0

это первоначальное предположение, кажется, работает 'список (а = 1, Ь = 1, с = 1)' - <но не очень конструктивный комментарий> Также вам нужно передать имя переменной, а не в матрицу, из o: 'nls (x ~ a * exp (b * y) + c, data = d, start = list (a = 1, b = 1, c = 1)) ' – user20650

ответ

0

Предлагаем вам использовать алгоритм "plinear". Обратите внимание, что на выходе .lin1 находится a и .lin2 - c. Вам не нужно начальные значения для линейных параметров:

> nls(x ~ cbind(exp(b * y), 1), d, alg = "plinear", start = list(b = coef(model.0)[2])) 
Nonlinear regression model 
    model: x ~ cbind(exp(b * y), 1) 
    data: d 
     b  .lin1  .lin2 
    0.03831 10.42913 284.57042 
residual sum-of-squares: 1.061 

Number of iterations to convergence: 7 
Achieved convergence tolerance: 3.572e-06