R語言數值積分

  前兩天對學習了R裏面計算的基本範圍,以及一些求解方程的方法,今天來看看積分,其實上個學期學了數值分析,對這部分的算法是有所瞭解的,當時是用matlab寫了一遍,已經忘了怎麼實現的了,如今用R從新寫一遍吧,算法有梯形積分法,辛普森積分法,自適應積分法。git

  • 梯形積分法

    梯形積分法能夠用下圖很好的解釋算法

    就是將微積分的時候用的方法,取Δx,則一小塊面積就約等於f(x)*Δx,連續函數在Δx趨於0的時候,該公式會愈來愈精確。app

###設置小數位數
options(digits = 8)
func1 <- function(x) return(4*x^3)
###梯形積分法
tixing <- function(func, a, b, n=100){
  x <- 0
  h <- (b-a)/n
  for(i in 1:n){
    x <- h*func(a+i*h) + x
  }
  return(x)
}
tixing(func1,0,1,n=10000)

###能夠看到這種近似較爲粗糙,能夠稍微改進一些
tixing2 <- function(func, a, b, n=100){
  h <- (b-a)/n
  add_by <- seq(a,b,by=h)
  f_x <- sapply(add_by,func)
  x <- h*sum(f_x[1]/2,f_x[2:n],f_x[n+1]/2)
  return(x)
}
tixing2(func1,0,1,n=100)
  • 辛普森方法

    辛普森方法和梯形方法相似,可是作了改進,前面咱們改進的方法用的是梯形逼近,這樣子f(x)實際上是表示成了一段直線,辛普森方法使用拋物線來擬合,可              以下降偏差。函數

    這裏直接給出辛普森的計算公式學習

    S=h/3(f(x0)+4f(x1)+2f(x2)+4f(x3)+```+4f(xn-1)+f(xn))code

    

###辛普森方法
simpson <- function(func, a, b, n=100){
  h <- (b-a)/n
  
  ###奇數項
  add_by_1 <- seq(a+h,b-h,by=2*h)
  ###偶數項
  add_by_2 <- add_by_1+h
  add_by_2 <- add_by_2[-length(add_by_2)]
  x <- h/3*sum(func(a),4*sapply(add_by_1,func),2*sapply(add_by_2,func),func(b))
  return(x)
}

    目前爲止咱們指定了運算次數n,而不是指定偏差來計算,固然指定偏差也是能夠的,考慮一種循環,每次n都增長1,就能夠完成這個目標了,可是這樣運算            量會愈來愈大,因此推薦使用另外一種方法,即公式自己具備的偏差,能夠又其自己和其n階導數一塊兒表示出來,具體的見數值分析相關書籍。blog

  • 自適應積分法

    這種方法我之前也沒有過接觸,書上講它的基本思想是越是陡峭(導數大)的函數,須要的分割越細,越是平坦(導數小)的函數,須要的分割越少。詳細            的,在進行運算的時候,先限定一個偏差,而後將函數分割爲兩半,每邊的偏差均是偏差的一半。這種方法的程序我再思考一下,還沒想到怎麼實現較好。it

相關文章
相關標籤/搜索