How to calculate the area under each end of a sine curve

后端 未结 2 741
你的背包
你的背包 2021-01-15 18:27

Given this data set:

y<-c(-13,16,35,40,28,36,43,33,40,33,22,-5,-27,-31,-29,-25,-26,-31,-26,-24,-25,-29,-23,4)
t<-1:24

My goal is to c

2条回答
  •  孤街浪徒
    2021-01-15 19:07

    First things first. To get an exact calculation, you will need to work with the exact function of the 2nd harmonic fourier. Secondly, the beauty of harmonics functions is that they are repetitive. So if you want to find where your function reaches 0, you merely need to expand your interval to so you can be sure to find more than 2 roots.

    First we get the exact function from the regression model

    fourierfnct <- function(t){
      fnct <- reslm2$coeff[1]+
        reslm2$coeff[2]*sin(2*pi/per*t)+
        reslm2$coeff[3]*cos(2*pi/per*t)+
        reslm2$coeff[4]*sin(4*pi/per*t)+
        reslm2$coeff[5]*cos(4*pi/per*t)
      return(fnct)
    }
    

    secondly,you can write a function which can find the roots (where the function is 0). R provides a uniroot function which you can use to find multiple roots in a loop.

    manyroots <- function(f,inter,period){
      roots <- array(NA, inter)
      for(i in 1:(length(inter)-1)){
        roots[i] <- tryCatch({
          return_value <- uniroot(f,c(inter[i],inter[i+1]))$root
        }, error = function(err) {
          return_value <- -1
        })
      }
      retroots <- roots[-which(roots==-1)]
      return(retroots)
    }
    

    then you simply calculate the roots, and use them to integrate the function across those boundaries.

    roots <- manyroots(fourierfnct,seq(0,25),per)
    integrate(fourierfnct, roots[1],roots[2])
    #300.6378 with absolute error < 3.3e-12
    integrate(fourierfnct, roots[2],roots[3])
    #-284.6378 with absolute error < 3.2e-12
    

提交回复
热议问题