筱团Blog筱团のBlog

R 语言案例

筱团·2021-10-19 20:52·453 次阅读

R 语言案例

函数知识#

seq 函数#

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

Copy
> 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 函数#

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

Copy
# 先创建一个函数,这个函数的作用是让 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 函数#

Copy
# 第一个是一个普通的例子 > 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 个等距结点 xk, 在每一个小区间采用梯形公式可以得到:

abf(x)dx=k=0n1xkxk+1f(x)dxh2[f(a)+f(b)]+hk=1n1f(xk)=Tn

复化辛卜生公式#

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

abf(x)dx=k=0n1xkxk+1f(x)dxh6[f(a)+f(b)+2k=1n1f(xk)+4k=0n1f(xk+h2)]

全部代码#

Copy
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) }

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

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

Trapezoid 是梯型(函数名字),传入的函数 funcsin(x)x(由 func1 <- function(x) sin(x) / x 可知)

Copy
h <- (b - a) / n

h=(ba)n

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

add_by = aa+ha+2h...b

Copy
f_x <- sapply(add_by, func)

f_x = sin(a)asin(a+h)a+hsin(a+2h)a+2h...sin(b)b

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

x=h(sin(a)2a+sin(a+h)a+h+sin(a+2h)a+2h+...+sin(n)n+sin(n+1)2(n+1))

Copy
return(x)

返回结果 x

代码逐步分析 -- Simpson#

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

Simpson 是辛卜生(函数名字),传入的函数 funcsin(x)x(由 func1 <- function(x) sin(x) / x 可知)

Copy
h <- (b - a) / n

h=(ba)n

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

add_by_1 = a+ha+3ha+5h...bh

Copy
# 偶数项 add_by_2 <- add_by_1 + h

add_by_2 = a+2ha+4ha+6h...b

Copy
add_by_2 <- add_by_2[-length(add_by_2)]

length(add_by_2)add_by_2(a+b)4h

add_by_2(a+b)4h

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

x=h3(sin(a)a+4(sin(a+h)a+h+sin(a+3h)a+3h+...+sin(bh)bh)+2(sin(a+2h)a+2h+sin(a+4h)a+4h+...+sin(b)b)+sin(b)b)

最后的结果和公式不太一致,你可以思考为什么可以这样做?【提示:h2

Copy
return(x)

返回结果 x

posted @   筱团  阅读(453)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
点击右上角即可分享
微信分享提示
目录