首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带约束的NLS优化:曲线下等面积

带约束的NLS优化:曲线下等面积
EN

Stack Overflow用户
提问于 2019-09-09 11:05:48
回答 1查看 114关注 0票数 2

我有一条曲线,中间有一个扰动(在t=9),这会导致我的数据出现衰退(t<9)和上升(t>9)。我想拟合一个指数函数,并增加一个约束,即两者的面积(衰退和上升)相等。

见图:

我可以使用optim对曲线进行拟合,但我无法计算出约束。这应该是这样的:

其中f(x)是指数函数。

我尝试过constrOptim,但我也愿意使用其他的解决方法。

代码语言:javascript
复制
y <-c(170, 160, 145, 127, 117, 74, 76, 78, 101, 115, 120, 70, 64, 65)
t <- seq(1,14,1)

# starting values:
lm <-lm(log(y) ~ log(t))

# Exp. Least-Squares minimization:
func <-function(pars) {
  a <- pars["a"]
  b <- pars["b"]
  fitted <- a*exp(b*t)
  sum((y-fitted)^2)  
} 

a <-lm$coefficients[[1]]
b <-lm$coefficients[[2]]
c <- 

result <- optim(c(a=a, b=b), func)

# final parameters:
a <- result$par["a"]
b <- result$par["b"]


# predict values:
pred <- a*exp(b*t)
dat = data.frame(y=y, t=t, pred=pred)

library(ggplot2)
ggplot(dat, aes(x=t, y=y)) +
  geom_line() +
  geom_line(data=dat, aes(x=t, y=pred), color='blue')

编辑:

我知道我需要在上面的优化中添加约束。就像这样:

代码语言:javascript
复制
i = 6:12

result <- optim(c(a=a, b=b), func, sum(y[i]-a*exp(b*t[i])=0)

但这似乎行不通。optim不允许这类约束。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-09 11:30:57

我可以建议将扰动建模为正弦波吗?

代码语言:javascript
复制
fit <- nls(y ~ a * exp(b * t) + ifelse(d*(t - m) < 0 | d*(t - m) > 2 * pi, 0 , c * sin(d*(t - m))), 
           start = list(a = 170, b = -0.1, c = -20, d = 1, m = 5))
summary(fit)

dat <- data.frame(y=y, t=t)
preddat <- data.frame(t = seq(min(t), max(t), length.out = 100))
preddat$y <- predict(fit, preddat)
preddat$y1 <- coef(fit)[["a"]] * exp(coef(fit)[["b"]] * preddat$t)


library(ggplot2)
ggplot(dat, aes(x=t, y=y)) +
  geom_line() +
  geom_line(data=preddat, color='blue') +
  geom_line(data=preddat, aes(y = y1), color='red', linetype = 2)

我相信有信号处理背景的人会想出比丑陋的ifelse黑客更好的东西。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57852749

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档