R语言的数学基础.docx
《R语言的数学基础.docx》由会员分享,可在线阅读,更多相关《R语言的数学基础.docx(50页珍藏版)》请在冰豆网上搜索。
R语言的数学基础
1.基本计算
2.三角函数计算
3.复数计算
4.方程计算
1基本计算
四则运算:
加减乘除,余数,整除,绝对值,判断正负
>a<-10;b<-5
#加减乘除
>a+b;a-b;a*b;a/b
[1]15
[1]5
[1]50
[1]2
#余数,整除
>a%%b;a%/%b
[1]0
[1]2
#绝对值
>abs(-a)
[1]10
#判断正负
>sign(-2:
3)
[1]-1-10111
数学计算:
幂,自然常用e的幂,平方根,对数
>a<-10;b<-5;c<-4
#幂
>c^b;c^-b;c^(b/10)
[1]1024
[1]0.0009765625
[1]2
#自然常数e
>exp
(1)
[1]2.718282
#自然常数e的幂
>exp(3)
[1]20.08554
#平方根
>sqrt(c)
[1]2
#以2为底的对数
>log2(c)
[1]2
#以10为底的对数
>log10(b)
[1]0.69897
#自定义底的对数
>log(c,base=2)
[1]2
#自然常数e的对数
>log(a,base=exp
(1))
[1]2.302585
#指数对数操作
>log(a^b,base=a)
[1]5
>log(exp(3))
[1]3
比较计算:
==,>,<,!
=,<=,>=,isTRUE,identical
>a<-10;b<-5
#比较计算
>a==a;a!
=b;a>b;a=c
[1]TRUE
[1]TRUE
[1]TRUE
[1]FALSE
[1]FALSE
[1]TRUE
#判断是否为TRUE
>isTRUE(a)
[1]FALSE
>isTRUE(!
a)
[1]FALSE
#精确比较两个对象
>identical(1,as.integer
(1))
[1]FALSE
>identical(NaN,-NaN)
[1]TRUE
>f<-function(x)x
>g<-compiler:
:
cmpfun(f)
>identical(f,g)
[1]TRUE
逻辑计算:
&,|,&&,||,xor
>x<-c(0,1,0,1)
>y<-c(0,0,1,1)
#只比较第一个元素&&,||
>x&&y;x||y
[1]FALSE
[1]FALSE
#S4对象的逻辑运算,比较所有元素&,|
>x&y;x|y
[1]FALSEFALSEFALSETRUE
[1]FALSETRUETRUETRUE
#异或
>xor(x,y)
[1]FALSETRUETRUEFALSE
>xor(x,!
y)
[1]TRUEFALSEFALSETRUE
约数计算:
ceiling,floor,trunc,round,signif
#向上取整
>ceiling(5.4)
[1]6
#向下取整
>floor(5.8)
[1]5
#取整数
>trunc(3.9)
[1]3
#四舍五入
>round(5.8)
#四舍五入,保留2位小数
>round(5.8833,2)
[1]5.88
#四舍五入,保留前2位整数
>signif(5990000,2)
[1]6e+06
数组计算:
最大,最小,范围,求和,均值,加权平均,连乘,差分,秩,,中位数,分位数,任意数,全体数
>d<-seq(1,10,2);d
[1]13579
#求最大值,最小值,范围range
>max(d);min(d);range(d)
[1]9
[1]1
[1]19
#求和,均值
>sum(d),mean(d)
[1]25
[1]5
#加权平均
>weighted.mean(d,rep(1,5))
[1]5
>weighted.mean(d,c(1,1,2,2,2))
[1]5.75
#连乘
>prod(1:
5)
[1]120
#差分
>diff(d)
[1]2222
#秩
>rank(d)
[1]12345
#中位数
>median(d)
[1]5
#分位数
>quantile(d)
0%25%50%75%100%
13579
#任意any,全体all
>e<-seq(-3,3);e
[1]-3-2-10123
>any(e<0);all(e<0)
[1]TRUE
[1]FALSE
排列组合计算:
阶乘,组合,排列
#5!
阶乘
>factorial(5)
[1]120
#组合,从5个中选出2个
>choose(5,2)
[1]10
#列出从5个中选出2个的组合所有项
>combn(5,2)
[,1][,2][,3][,4][,5][,6][,7][,8][,9][,10]
[1,]1111222334
[2,]2345345455
#计算0:
10的组合个数
>for(nin0:
10)print(choose(n,k=0:
n))
[1]1
[1]11
[1]121
[1]1331
[1]14641
[1]15101051
[1]1615201561
[1]172135352171
[1]18285670562881
[1]193684126126843691
[1]1104512021025221012045101
#排列,从5个中选出2个
>choose(5,2)*factorial
(2)
[1]20
累积计算:
累加,累乘,最小累积,最大累积
#累加
>cumsum(1:
5)
[1]1361015
#累乘
>cumprod(1:
5)
[1]12624120
>e<-seq(-3,3);e
[1]-3-2-10123
#最小累积cummin
>cummin(e)
[1]-3-3-3-3-3-3-3
#最大累积cummax
>cummax(e)
[1]-3-2-10123
两个数组计算:
交集,并集,差集,数组是否相等,取唯一,查匹配元素的索引,找重复元素索引
#定义两个数组向量
>x<-c(9:
20,1:
5,3:
7,0:
8);x
[1]9101112131415161718192012345
[18]34567012345678
>y<-1:
10;y
[1]12345678910
#交集
>intersect(x,y)
[1]91012345678
#并集
>union(x,y)
[1]9101112131415161718192012345
[18]6708
#差集,从x中排除y
>setdiff(x,y)
[1]111213141516171819200
#判断是否相等
>setequal(x,y)
[1]FALSE
#取唯一
>unique(c(x,y))
[1]9101112131415161718192012345
[18]6708
#找到x在y中存在的元素的索引
>which(x%in%y)
[1]12131415161718192021222425262728
[18]293031
>which(is.element(x,y))
[1]12131415161718192021222425262728
[18]293031
#找到重复元素的索引
>which(duplicated(x))
[1]18192024252627282930
2三角函数计算
2.1三角函数
在直角三角形中仅有锐角(大小在0到90度之间的角)三角函数的定义。
给定一个锐角θ,可以做出一个直角三角形,使得其中的一个内角是θ。
设这个三角形中,θ的对边、邻边和斜边长度分别是a、b和h。
三角函数的6种关系:
正弦,余弦,正切,余切,正割,余割。
∙θ的正弦是对边与斜边的比值:
sinθ=a/h
∙θ的余弦是邻边与斜边的比值:
cosθ=b/h
∙θ的正切是对边与邻边的比值:
tanθ=a/b
∙θ的余切是邻边与对边的比值:
cotθ=b/a
∙θ的正割是斜边与邻边的比值:
secθ=h/b
∙θ的余割是斜边与对边的比值:
cscθ=h/a
三角函数的特殊值:
函数0pi/12pi/6pi/4pi/35/(12*pi)pi/2
sin0(sqrt(6)-sqrt
(2))/41/2sqrt
(2)/2sqrt(3)/2(sqrt(6)+sqrt
(2))/41
cos1(sqrt(6)+sqrt
(2))/4sqrt(3)/2sqrt
(2)/21/2(sqrt(6)-sqrt
(2))/40
tan02-sqrt(3)sqrt(3)/31sqrt(3)2+sqrt(3)NA
cotNA2+sqrt(3)sqrt(3)1sqrt(3)/32-sqrt(3)0
sec1sqrt(6)-sqrt
(2)sqrt(3)*2/3sqrt
(2)2sqrt(6)-sqrt
(2)NA
cscNA2sqrt
(2)sqrt(3)*2/3sqrt(6)-sqrt
(2)1NA
三角基本函数:
正弦,余弦,正切
#正弦
>sin(0);sin
(1);sin(pi/2)
[1]0
[1]0.841471
[1]1
#余弦
>cos(0);cos
(1);cos(pi)
[1]1
[1]0.5403023
[1]-1
#正切
>tan(0);tan
(1);tan(pi)
[1]0
[1]1.557408
[1]-1.224647e-16
接下来,我们用ggplot2包来画出三角函数的图形。
#加载ggplot2的库
>library(ggplot2)
>library(scales)
三角函数画图
#x坐标
>x<-seq(-2*pi,2*pi,by=0.01)
#y坐标
>s1<-data.frame(x,y=sin(x),type=rep('sin',length(x)))#正弦
>s2<-data.frame(x,y=cos(x),type=rep('cos',length(x)))#余弦
>s3<-data.frame(x,y=tan(x),type=rep('tan',length(x)))#正切
>s4<-data.frame(x,y=1/tan(x),type=rep('cot',length(x)))#余切
>s5<-data.frame(x,y=1/sin(x),type=rep('sec',length(x)))#正割
>s6<-data.frame(x,y=1/cos(x),type=rep('csc',length(x)))#余割
>df<-rbind(s1,s2,s3,s4,s5,s6)
#用ggplot2画图
>g<-ggplot(df,aes(x,y))
>g<-g+geom_line(aes(colour=type,stat='identity'))
>g<-g+scale_y_continuous(limits=c(0,2))
>g<-g+scale_x_continuous(breaks=seq(-2*pi,2*pi,by=pi),labels=c("-2*pi","-pi","0","pi","2*pi"))
>g
2.1反三角函数
基本的反三角函数定义:
反三角函数定义值域
arcsin(x)=ysin(y)=x-pi/2<=y<=pi/2
arccos(x)=ycos(y)=x0<=y<=pi,
arctan(x)=ytan(y)=x-pi/2arccsc(x)=ycsc(y)=x-pi/2<=y<=pi/2,y!
=0
arcsec(x)=ysec(y)=x0<=y<=pi,y!
=pi/2
arccot(x)=ycot(y)=x0反正弦,反余弦,反正切
#反正弦asin
>asin(0);asin
(1)
[1]0
[1]1.570796#pi/2=1.570796
#反余弦acos
>acos(0);acos
(1)
[1]1.570796#pi/2=1.570796
[1]0
#反正切atan
>atan(0);atan
(1)
[1]0
[1]0.7853982#pi/4=0.7853982
反三角函数画图
#x坐标
>x<-seq(-1,1,by=0.005)
#y坐标
>s1<-data.frame(x,y=asin(x),type=rep('arcsin',length(x)))
>s2<-data.frame(x,y=acos(x),type=rep('arccos',length(x)))
>s3<-data.frame(x,y=atan(x),type=rep('arctan',length(x)))
>s4<-data.frame(x,y=1/atan(x),type=rep('arccot',length(x)))
>s5<-data.frame(x,y=1/asin(x),type=rep('arcsec',length(x)))
>s6<-data.frame(x,y=1/acos(x),type=rep('arccsc',length(x)))
>df<-rbind(s1,s2,s3,s4,s5,s6)
#用ggplot2画图
>g<-ggplot(df,aes(x,y))
>g<-g+geom_line(aes(colour=type,stat='identity'))
>g<-g+scale_y_continuous(limits=c(-2*pi,2*pi),breaks=seq(-2*pi,2*pi,by=pi),labels=c("-2*pi","-pi","0","pi","2*pi"))
>g
3复数计算
复数,为实数的延伸,它使任一多项式都有根。
复数中的虚数单位i,是-1的一个平方根,即i^2=-1。
任一复数都可表达为x+yi,其中x及y皆为实数,分别称为复数之“实部”和“虚部”。
3.1创建一个复数
#直接创建复数
>ai<-5+2i;ai
[1]5+2i
>class(ai)
[1]"complex"
#通过complex()函数创建复数
>bi<-complex(real=5,imaginary=2);bi
[1]5+2i
>plex(bi)
[1]TRUE
#实数部分
>Re(ai)
[1]5
#虚数部分
>Im(ai)
[1]2
#取模
>Mod(ai)
[1]5.385165#sqrt(5^2+2^2)=5.385165
#取辐角
>Arg(ai)
[1]0.3805064
#取轭
>Conj(ai)
[1]5-2i
3.2复数四则运算
∙加法公式:
(a+bi)+(c+di)=(a+c)+(b+d)i
∙减法公式:
(a+bi)-(c+di)=(a-c)+(b-d)i
∙乘法公式:
(a+bi)(c+di)=ac+adi+bci+bidi=ac+bdi^2+(ad+bc)i=(ac-bd)+(ad+bc)i
∙除法公式:
(a+bi)/(c+di)=((ac+bd)+(bc-ad)i)/(c^2+d^2)
#定义系数
a<-5;b<-2;c<-3;d<-4
#创建两个复数
ai<-complex(real=a,imaginary=b)
bi<-complex(real=c,imaginary=d)
expect_that(complex(real=(a+c),imaginary=(b+d)),equals(ai+bi))
expect_that(complex(real=(a-c),imaginary=(b-d)),equals(ai-bi))
expect_that(complex(real=(a*c-b*d),imaginary=(a*d+b*c)),equals(ai*bi))
expect_that(complex(real=(a*c+b*d),imaginary=(b*c-a*d))/(c^2+d^2),equals(ai/bi))
3.3复数开平方根
#在实数域,给-9开平方根
>sqrt(-9)
[1]NaN
#在复数域,给-9开平方根
>sqrt(complex(real=-9))
[1]0+3i
4方程计算
方程计算是数学计算的一种基本形式,R语言也可以很方便地帮助我们解方程,下面将介绍一元多次的方程,和二元一次方程的解法。
解一元多次方程,可以用uniroot()函数!
4.1一元一次方程
一元一次方程:
a*x+b=0,设a=5,b=10,求x?
#定义方程函数
>f1<-function(x,a,b)a*x+b
#给a,b常数赋值
>a<-5;b<-10
#在(-10,10)的区间,精确度为0.0001位,计算方程的根
>result<-uniroot(f1,c(-10,10),a=a,b=b,tol=0.0001)
#打印方程的根x
>result$root
[1]-2
一元一次方程非常容易解得,方程的根是-2!
以图形展示方程:
y=5*x+10
#创建数据点
>x<-seq(-5,5,by=0.01)
>y<-f1(x,a,b)
>df<-data.frame(x,y)
#用ggplot2来画图
>g<-ggplot(df,aes(x,y))
>g<-g+geom_line(col='red')#红色直线
>g<-g+geom_point(aes(result$root,0),col="red",size=3)#点
>g<-g+geom_hline(yintercept=0)+geom_vline(yintercept=0)#坐标轴
>g<-g+ggtitle(paste("y=",a,"*x+",b))
>g
4.2一元二次方程
一元二次方程:
a*x^2+b*x+c=0,设a=1,b=5,c=6,求x?
>f2<-function(x,a,b,c)a*x^2+b*x+c
>a<-1;b<-5;c<-6
>result<-uniroot(f2,c(0,-2),a=a,b=b,c=c,tol=0.0001)
>result$root
[1]-2
把参数带入方程,用uniroot()函数,我们就解出了方程的一个根,改变计算的区间,我们就可以得到另一个根。
>result<-uniroot(f2,c(-4,-3),a=a,b=b,c=c,tol=0.0001)
>result$root
[1]-3
方程的两个根,一个是-2,一个是-3。
由于uniroot()函数,每次只能计算一个根,而且要求输入的区间端值,必须是正负号相反的。
如果我们直接输入一个(-10,0)这个区间,那么uniroot()函数会出现错误。
>result<-uniroot(f2,c(-10,0),a=a,b=b,c=c,tol=0.0001)
Errorinuniroot(f2,c(-10,0),a=a,b=b,c=c,tol=1e-04):
位于极点边的f()值之正负号不相反
这应该是uniroot()为了统计计算对一元多次方程而设计的,所以为了使用uniroot()函数,我们需要取不同的区别来获得方程的根。
以图形展示方程:
y=x^2+5*x+6
#创建数据点
>x<-seq(-5,1,by=0.01)
>y<-f2(x,a,b,c)
>df<-data.frame(x,y)
#用ggplot2来画图
>g<-ggplot(df,aes(x,y))
>g<-g+geom_line(col='red')#红色曲线
>g<-g+geom_hline(yintercept=0)+geom_vline(yintercept=0)#坐标轴
>g<-g+ggtitle(paste("y=",a,"*x^2+",b,"*x+",c))
>g
我们从图,并直接的看到了x的两个根取值范围。
4.3一元三次方程
一元二次方程:
a*x^3+b*x^2+c*x+d=0,设a=1,b=5,c=6,d=-11,求x?
>f3<-function(x,a,b,c,d)a*x^3+b*x^2+c*x+d
>a<-1;b<-5;c<-6;d<--11
>result<-uniroot(f3,c(-5,5),a=a,b=b,c=c,d=d,tol=0.0001)
>result$root
[1]0.9461458
如果我们设置对了取值区间,那么一下就得到了方程的根。
以图形展示方程:
y=x^2+5*x+6
#创建数据点
>x<-seq(-5,5,by=0.01)
>y<-f3(x,a,b,c,d)
>df<-data.frame(x,y)
#用ggplot2画图
>g<-ggplot(df,aes(x,y))
>g<-g+geom_line(col='red')#3次曲线
>g<-g+geom_hline(yintercept=0)+geom_vlin