R 语言案例

函数知识

seq 函数

用于生成一段步长相等的序列,看例子即可理解

> seq(5)
[1] 1 2 3 4 5

> seq(2,5)
[1] 2 3 4 5

> seq(2,10,2)
[1] 2 4 6 8 10

sapply 函数

将列表或向量作为输入,并以向量或矩阵形式输出

# 先创建一个函数,这个函数的作用是让 x 除以 2
func1 <- function(x) x / 2

# 用 c() 函数创建向量,并赋值给 nums
nums <- c(10,8,6,4,2)

# sappky(x,y) 的 x 代表向量,y 代表函数
result <- sapply(nums,func1)

# 结果就是生成一个全部除以 2 了的序列
[1] 5 4 3 2 1

length 函数

# 第一个是一个普通的例子
> temp <- c(1,2,3,4,5)
> length(temp)
[1] 5

# 下面的例子比较特殊
> temp <- c(1,2,3,4,5)
> temp[2]
[1] 2
> temp[length(temp)]
[1] 5
# 这里相当于向量 temp 除去了 5,并打印剩下的序列
> temp[-length(temp)]
[1] 1 2 3 4

梯形积分法 与 Simpson

公式

复化梯形公式

若将区间 ([a, b] n) 等分, 有 (n+1) 个等距结点 (x_{k}), 在每一个小区间采用梯形公式可以得到:

[int_{a}^{b} f(x) mathrm{d} x=sum_{k=0}^{n-1} int_{x_{k}}^{x_{k+1}} f(x) mathrm{d} x approx frac{h}{2}[f(a)+f(b)]+h sum_{k=1}^{n-1} fleft(x_{k} ight)=T_{n} ]

复化辛卜生公式

若将区间 ([a, b] n) 等分, 有 (n+1) 个等距结点 (x), 在每一个小区间采用辛卜生公式可以得到:

[int_{a}^{b} f(x) mathrm{d} x=sum_{k=0}^{n-1} int_{x_{k}}^{x_{k+1}} f(x) mathrm{d} x approx frac{h}{6}left[f(a)+f(b)+2 sum_{k=1}^{n-1} fleft(x_{k} ight)+4 sum_{k=0}^{n-1} fleft(x_{k}+frac{h}{2} ight) ight] ]

全部代码

func1 <- function(x) sin(x) / x

# 梯形积分法
Trapezoid <- 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)
}

# Simpson
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)
}

代码逐步分析 -- 梯型积分法

Trapezoid <- function(func, a, b, n = 100)

Trapezoid 是梯型(函数名字),传入的函数 func(frac{sin left( x ight)}{x})(由 func1 <- function(x) sin(x) / x 可知)

h <- (b - a) / n

[h=frac{left( b-a ight)}{n} ]

add_by <- seq(a, b, by = h)

[add\_by = aquad a+hquad a+2hquad ...quad b ]

f_x <- sapply(add_by, func)

[f\_x = frac{sin left( a ight)}{a}quad frac{sin left( a+h ight)}{a+h}quad frac{sin left( a+2h ight)}{a+2h}quad ...quad frac{sin left( b ight)}{b} ]

x <- h * sum(f_x[1] / 2, f_x[2:n], f_x[n + 1] / 2)

[x=h*left( frac{sin left( a ight)}{2a}+frac{sin left( a+h ight)}{a+h}+frac{sin left( a+2h ight)}{a+2h}+...+frac{sin left( n ight)}{n}+frac{sin left( n+1 ight)}{2left( n+1 ight)} ight) ]

return(x)

返回结果 x

代码逐步分析 -- Simpson

Simpson <- function(func, a, b, n = 100)

Simpson 是辛卜生(函数名字),传入的函数 func(frac{sin left( x ight)}{x})(由 func1 <- function(x) sin(x) / x 可知)

h <- (b - a) / n

[h=frac{left( b-a ight)}{n} ]

# 奇数项
add_by_1 <- seq(a + h, b - h, by = 2 * h)

[add\_by\_1 = a+hquad a+3hquad a+5hquad ...quad b-h ]

# 偶数项
add_by_2 <- add_by_1 + h

[add\_by\_2 = a+2hquad a+4hquad a+6hquad ...quad b ]

add_by_2 <- add_by_2[-length(add_by_2)]

[length(add\_by\_2)quad代表quad add\_by\_2quad的长度,你可以思考为什么等于quadfrac{left( a+b ight)}{4h} ]

[add\_by\_2quad序列去掉quadfrac{left( a+b ight)}{4h} ]

x <- h / 3 * sum(func(a), 4 * sapply(add_by_1, func), 2 * sapply(add_by_2, func), func(b))

[x=frac{h}{3}*left( frac{sin left( a ight)}{a}+4*left( frac{sin left( a+h ight)}{a+h}+frac{sin left( a+3h ight)}{a+3h}+...+frac{sin left( b-h ight)}{b-h} ight) +2*left( frac{sin left( a+2h ight)}{a+2h}+frac{sin left( a+4h ight)}{a+4h}+...+frac{sin left( b ight)}{b} ight) +frac{sin left( b ight)}{b} ight) ]

最后的结果和公式不太一致,你可以思考为什么可以这样做?【提示:(frac{h}{2})

return(x)

返回结果 x

喜欢划水摸鱼的废人
原文地址:https://www.cnblogs.com/CourserLi/p/15426338.html