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

后端 未结 2 740
你的背包
你的背包 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
    
    0 讨论(0)
  • 2021-01-15 19:12

    This may not be the solution you are looking for, but you could try this:

    # Create a new t vector but with more subdivisions
    t2 = seq(1,24,length.out = 10000)
    
    # Evaluate your model on this t2
    y2 = predict(reslm2, newdata = data.frame(t = t2))
    
    lines(t2[y2>=0],y2[y2>=0],col="red")
    
    # Estimate the area where the curve is greater than 0 
    sum(diff(t2)[1]*y2[y2>0])
    
    # Estimate the area where the curve is less than 0
    sum(diff(t2)[1]*y2[y2<0])
    
    0 讨论(0)
提交回复
热议问题