найти касательную к кривой убывающей доходности - PullRequest
0 голосов
/ 20 мая 2018

Используя R, я хотел бы автоматически найти касательную к кривой убывающей отдачи для оптимального графического упражнения по поиску пищи.Кривая выглядит следующим образом:

ins <- 40
t <- 30
avg <- 30
curve(ins/2^(x/10+1-1),
    0,2*t,xlim=c(-2*t,2*t),ylim=c(ins,0),
    xlab="time",ylab="food",type="l",lty=1,col=4,lwd=3,axes=FALSE)
axis(1,pos=ins); axis(2,pos=0)

Касательная начинается в точках (-40,40), и в идеале я бы нашел точку на кривой, к которой касалась бы касательная.

По пробам иошибка должна выглядеть так:

segments(-ins,ins,38,0,col=4,lwd=3,lty=2)

1 Ответ

0 голосов
/ 21 мая 2018

Настройка:

ins <- 40
t <- 30
avg <- 30

deriv(...,function.arg=TRUE) возвращает функцию, которая дает значение функции в качестве основного результата и градиент в качестве атрибута.

FUN <- deriv(~ins/2^(x/10+1-1),"x",function.arg=TRUE)
curve(FUN(x),
      0,2*t,xlim=c(-2*t,2*t),
      ylim=c(ins,0),
      xlab="time",ylab="food",type="l",
      lty=1,col=4,lwd=3,axes=FALSE)
axis(1,pos=ins); axis(2,pos=0)

Нам нужночтобы решить уравнение ((40+x)*D(x)+40=f(x)) (где D(x) - градиент, а f(x) - значение функции):

Перевод этого уравнения в функцию, которая вернет 0, когда уравнение истинно:

rfun <- function(x) {
  f <- FUN(x)
  (40+x)*attr(f,"gradient")+40-f
} 
u1 <- uniroot(rfun,c(-40,60))

Производная в точке пересечения:

d1 <- attr(FUN(u1$root),"gradient")

Нарисуйте отрезок:

segments(x0=-40,y0=40,x1=40,y1=40+(40+40)*d1,
         col=4,lwd=3,lty=2)
...