R语言学习之科学计算——求导与积分

说明

R语言的版本为4.0.2,IDE为Rstudio,版本为1.3.959。学习过程中参考了以下文章:
R笔记(1):formula和Formula(CSDN)
R语言笔记.formula(知乎)
R语言进阶之五:表达式、数学公式与特殊符号(CSDN)
R语言的导数计算(CSDN)
积分_R(CSDN)

1 R中的表达式

要进行求导或者积分运算,首先需要有一个表达式,注意,是表达式,而不是实现了这个表达式的函数,这就要用到 expression 对象。
使用expression() 函数可以创建expression 对象,expression 对象实际上是以列表的形式储存表达式的,例如创建以下表达式:

y = x 3 + s i n ( x ) + e x   y = x^{3}+sin(x)+e^{x}\, y=x3+sin(x)+ex

当然除了使用 expression() 函数创建表达式之外,还可以使用formula() 函数创建公式,二者都可以当成参数进行求导和积分运算。

# f1,f2,f3分别创建了表达式、公式和函数
# 区别是函数可以传参并运行,前面两种不行
f1  <-  expression(y=x^3+sin(x)+exp(x))
f2 <- formula(y~x^3+sin(x)+exp(x))
f3 <- function(x) x^3 + sin(x) + exp(x)
mode(f1)
mode(f2)
mode(f3)

# 输出
# > mode(f1)
# [1] "expression"
# > mode(f2)
# [1] "call"
# > mode(f3)
# [1] "function"

2 求导

求导可以使用函数deriv() 来实现,可以用它来求

  1. 一阶导数
  2. 高阶导数
  3. 偏导数等
  4. ……

2.1 求一阶导数

用于求导的函数表达式为:

y = x 3 + s i n ( x ) + e x   y = x^{3}+sin(x)+e^{x}\, y=x3+sin(x)+ex

求一阶导数,可以直接使用deriv() 函数,或者使用D()函数,只是后者只支持传入expression不能传入formula,也不能设置让其返回函数用于计算,以下例子里面仅仅使用了deriv() 函数。

# f1,f2,f3分别创建了表达式、公式和函数
# 区别是函数可以传参并运行,前面两种不行
f1  <-  expression(y=x^3+sin(x)+exp(x))
f2 <- formula(y~x^3+sin(x)+exp(x))
f3 <- function(x) x^3 + sin(x) + exp(x)
mode(f1)
mode(f2)
mode(f3)

# 分别使用表达式、公式和手动编求导后的函数
# 验证求导结果,发现结果一致
df1 <- deriv(f1,"x",function.arg = TRUE)
df2 <- deriv(f2,"x",function.arg = TRUE)
df3 <- function(x) 3*x^2 + cos(x) + exp(x)
df1(1)
df2(1)
df3(1)

# 输出
# > df1(1)
# [1] 4.559753
# attr(,"gradient")
# x
# [1,] 6.258584
# > df2(1)
# [1] 4.559753
# attr(,"gradient")
# x
# [1,] 6.258584
# > df3(1)
# [1] 6.25858

2.2求高阶导数

用于求导的函数表达式依旧为:

y = x 3 + s i n ( x ) + e x   y = x^{3}+sin(x)+e^{x}\, y=x3+sin(x)+ex

求二阶导数可直接使用deriv3() 函数。

# f1,f2,f3分别创建了表达式、公式和函数
# 区别是函数可以传参并运行,前面两种不行
f1  <-  expression(y=x^3+sin(x)+exp(x))
f2 <- formula(y~x^3+sin(x)+exp(x))
f3 <- function(x) x^3 + sin(x) + exp(x)
mode(f1)
mode(f2)
mode(f3)

# 分别使用表达式、公式和手动编求二阶导数后的函数
# 验证求导结果,发现结果一致
df1 <- deriv3(f1,"x",function.arg = TRUE)
df2 <- deriv3(f2,"x",function.arg = TRUE)
df3 <- function(x) 6*x - sin(x) + exp(x)
df1(1)
df2(1)
df3(1)

# 输出
# > df1(1)
# [1] 4.559753
# attr(,"gradient")
# x
# [1,] 6.258584
# attr(,"hessian")
# , , x
# 
# x
# [1,] 7.876811
# 
# > df2(1)
# [1] 4.559753
# attr(,"gradient")
# x
# [1,] 6.258584
# attr(,"hessian")
# , , x
# 
# x
# [1,] 7.876811
# 
# > df3(1)
# [1] 7.876811

求更高阶导数则需要自己编一个函数,方便高阶求导

# f1,f2,f3分别创建了表达式、公式和函数
# 区别是函数可以传参并运行,前面两种不行
f1  <-  expression(y=x^3+sin(x)+exp(x))
f2 <- formula(y~x^3+sin(x)+exp(x))
f3 <- function(x) x^3 + sin(x) + exp(x)
mode(f1)
mode(f2)
mode(f3)

# 自定义的求高阶导数的函数,设置order值以确定求导阶数
DD <- function(expr, name, order = 1,function.arg = FALSE) {
  if(order < 1) stop("'order' must be >= 1")
  if(order == 1) deriv(expr, name, function.arg = function.arg)
  else DD(D(expr, name), name, order - 1, function.arg)
}

# 分别使用表达式、公式和手动编求3阶导数后的函数
# 验证求导结果,发现结果一致
df1 <- DD(f1,"x",3,function.arg = TRUE)
df3 <- function(x) 6 - cos(x) + exp(x)
df1(1)
df3(1)

# 输出
# [1] 7.876811
# attr(,"gradient")
# x
# [1,] 8.17798
# > df3(1)
# [1] 8.17798

2.3 求偏导数

对以下函数求偏导数:
f ( x , y ) = x 3 y + s i n ( x y 3 ) + e x y   f(x,y) = \frac{x^{3}}{y}+sin(xy^{3})+e^{xy}\, f(x,y)=yx3+sin(xy3)+exy

f1  <-  expression(f=x^3/y+sin(x*y^3)+exp(x*y))
f2 <- function(x,y) x^3/y+sin(x*y^3)+exp(x*y)

# 分别使用表达式和手动编求偏导数后的函数
# 验证求导结果,发现结果一致
df1xy <- deriv(f1,c("x","y"),function.arg = TRUE)
df2x <- function(x,y) 3*x^2/y+cos(x*y^3)*y^3+y*exp(x*y)
df2y <- function(x,y) -x^3/y^2+3*cos(x*y^3)*y^2+x*exp(x*y)
df1xy(1,1)
df2x(1,1)
df2y(1,1)

# 输出
# [1] 4.559753
# attr(,"gradient")
# x        y
# [1,] 6.258584 3.339189
# > df2x(1,1)
# [1] 6.258584
# > df2y(1,1)
# [1] 3.339189

3 积分

对于积分而言,有以下几种形式:

  1. 定积分
  2. 不定积分
  3. 多元函数积分
  4. ……

3.1 定积分

求定积分可以使用integrate() 函数,该函数要求传入的是仅有单变量的函数而非表达式,因此只能求一元函数定积分,对以下函数求定积分:

y = x 3 + s i n ( x ) + e x   y = x^{3}+sin(x)+e^{x}\, y=x3+sin(x)+ex

# 定义一个用于积分的单变量函数,和积分之后的函数
f  <-  function(x) x^3 + sin(x) + exp(x)
If <- function(x) x^4/4-cos(x) +exp(x)

# 计算区间(12)上的积分
# 并手动验证,发现一致,误差很小
integrate(f, 1,2)
If(2)-If(1)

# 输出
# > integrate(f, 1,2)
# 9.377223 with absolute error < 1e-13
# > If(2)-If(1)
# [1] 9.377223

3.2 不定积分

暂时还不知道和不定积分相关的包有哪些,日后找到再补上。

  • 26
    点赞
  • 156
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
R语言是数据科学中非常流行和强大的一种编程语言,用于数据分析和数据挖掘。尽管它提供了丰富的功能和包,但在使用R进行数据挖掘时,仍然存在一些常见的问题。 首先,R语言学习曲线相对陡峭,尤其对于初学者来说。R语言的语法和概念与其他编程语言有所不同,需要一定的时间和精力来掌握。因此,在开始使用R进行数据挖掘之前,建议用户先学习基本的R语言知识和技能。 其次,R语言的数据处理速度相对较慢。由于R是一种解释型语言,对于大型数据集的处理可能会显得比较缓慢。为了提高数据挖掘的效率,可以使用一些优化技巧,如向量化、使用并行计算等。此外,R在内存管理方面也有一些限制,处理大型数据集时可能会导致内存溢出等问题。 另外,R语言社区的包和函数数量庞大,但质量参差不齐。用户在进行数据挖掘时,可能会遇到某些包或函数不兼容、文档不全面等问题。为了解决这些问题,用户可以仔细查看包的文档和说明,寻求社区的帮助和讨论,或者使用经过广泛测试和应用的常用包。 此外,数据挖掘分析中常涉及到特征选择、数据清洗、模型选择和调参等问题。这些问题需要专业背景和经验支持。对于初学者或者没有相关领域知识的人来说,可能需要花费更多的时间和精力来理解和解决这些问题。 总之,虽然R语言在数据挖掘领域有着广泛的应用,但在实际操作中也存在一些常见的问题。通过学习和积累经验,用户可以更好地应对和解决这些问题,提高数据挖掘的效率和准确性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值