R語言中的數學計算
關於作者:
張丹(Conan), 程序員Java,R,PHP,Javascript
weibo:@Conan_Z
blog: http://blog.fens.me
email: [email protected]
轉載請註明出處:
http://blog.fens.me/r-mathematics/
r-math
前言
R是作爲統計語言,生來就對數學有良好的支持,一個函數就能實現一種數學計算,所以用R語言做數學計算題特別方便。如果計算器中能嵌入R的計算函數,那麼絕對是一種高科技產品。
本文總結了R語言用於初等數學中的各種計算。
目錄
基本計算
三角函數計算
複數計算
方程計算
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 -1 0 1 1 1
數學計算: 冪, 自然常用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] FALSE FALSE FALSE TRUE
[1] FALSE TRUE TRUE TRUE
# 異或
> xor(x,y)
[1] FALSE TRUE TRUE FALSE
> xor(x,!y)
[1] TRUE FALSE FALSE TRUE
約數計算: 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] 1 3 5 7 9
# 求最大值,最小值,範圍range
> max(d);min(d);range(d)
[1] 9
[1] 1
[1] 1 9
# 求和,均值
> 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] 2 2 2 2
# 秩
> rank(d)
[1] 1 2 3 4 5
# 中位數
> median(d)
[1] 5
# 分位數
> quantile(d)
0% 25% 50% 75% 100%
1 3 5 7 9
# 任意any,全體all
> e<-seq(-3,3);e
[1] -3 -2 -1 0 1 2 3
> 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,] 1 1 1 1 2 2 2 3 3 4
[2,] 2 3 4 5 3 4 5 4 5 5
# 計算0:10的組合個數
> for (n in 0:10) print(choose(n, k = 0:n))
[1] 1
[1] 1 1
[1] 1 2 1
[1] 1 3 3 1
[1] 1 4 6 4 1
[1] 1 5 10 10 5 1
[1] 1 6 15 20 15 6 1
[1] 1 7 21 35 35 21 7 1
[1] 1 8 28 56 70 56 28 8 1
[1] 1 9 36 84 126 126 84 36 9 1
[1] 1 10 45 120 210 252 210 120 45 10 1
# 排列,從5箇中選出2個
> choose(5, 2)*factorial(2)
[1] 20
累積計算: 累加, 累乘, 最小累積, 最大累積
# 累加
> cumsum(1:5)
[1] 1 3 6 10 15
# 累乘
> cumprod(1:5)
[1] 1 2 6 24 120
> e<-seq(-3,3);e
[1] -3 -2 -1 0 1 2 3
# 最小累積cummin
> cummin(e)
[1] -3 -3 -3 -3 -3 -3 -3
# 最大累積cummax
> cummax(e)
[1] -3 -2 -1 0 1 2 3
兩個數組計算: 交集, 並集, 差集, 數組是否相等, 取唯一, 查匹配元素的索引, 找重複元素索引
# 定義兩個數組向量
> x <- c(9:20, 1:5, 3:7, 0:8);x
[1] 9 10 11 12 13 14 15 16 17 18 19 20 1 2 3 4 5
[18] 3 4 5 6 7 0 1 2 3 4 5 6 7 8
> y<- 1:10;y
[1] 1 2 3 4 5 6 7 8 9 10
# 交集
> intersect(x,y)
[1] 9 10 1 2 3 4 5 6 7 8
# 並集
> union(x,y)
[1] 9 10 11 12 13 14 15 16 17 18 19 20 1 2 3 4 5
[18] 6 7 0 8
# 差集,從x中排除y
> setdiff(x,y)
[1] 11 12 13 14 15 16 17 18 19 20 0
# 判斷是否相等
> setequal(x, y)
[1] FALSE
# 取唯一
> unique(c(x,y))
[1] 9 10 11 12 13 14 15 16 17 18 19 20 1 2 3 4 5
[18] 6 7 0 8
# 找到x在y中存在的元素的索引
> which(x %in% y)
[1] 1 2 13 14 15 16 17 18 19 20 21 22 24 25 26 27 28
[18] 29 30 31
> which(is.element(x,y))
[1] 1 2 13 14 15 16 17 18 19 20 21 22 24 25 26 27 28
[18] 29 30 31
# 找到重複元素的索引
> which(duplicated(x))
[1] 18 19 20 24 25 26 27 28 29 30
2 三角函數計算
2.1 三角函數
在直角三角形中僅有銳角(大小在0到90度之間的角)三角函數的定義。給定一個銳角θ,可以做出一個直角三角形,使得其中的一個內角是θ。設這個三角形中,θ的對邊、鄰邊和斜邊長度分別是a、b和h。
Trigonometry_triangle_sim
三角函數的6種關係:正弦,餘弦,正切,餘切,正割,餘割。
θ的正弦是對邊與斜邊的比值:sin θ = a/h
θ的餘弦是鄰邊與斜邊的比值:cos θ = b/h
θ的正切是對邊與鄰邊的比值:tan θ = a/b
θ的餘切是鄰邊與對邊的比值:cot θ = b/a
θ的正割是斜邊與鄰邊的比值:sec θ = h/b
θ的餘割是斜邊與對邊的比值:csc θ = h/a
三角函數的特殊值:
函數 |0 |pi/12 | pi/6 | pi/4 | pi/3 5/(12*pi) pi/2
sin 0 (sqrt(6)-sqrt(2))/4 1/2 sqrt(2)/2 | sqrt(3)/2 (sqrt(6)+sqrt(2))/4 1
cos 1 (sqrt(6)+sqrt(2))/4 sqrt(3)/2 sqrt(2)/2 1/2 (sqrt(6)-sqrt(2))/4 0
tan 0 2-sqrt(3) sqrt(3)/3 1 sqrt(3) 2+sqrt(3) NA
cot NA 2+sqrt(3) sqrt(3) 1 sqrt(3)/3 2-sqrt(3) 0
sec 1 sqrt(6)-sqrt(2) sqrt(3)*2/3 sqrt(2) 2 sqrt(6)-sqrt(2) NA
csc NA 2 sqrt(2) sqrt(3)*2/3 sqrt(6)-sqrt(2) 1 NA
三角基本函數: 正弦,餘弦,正切
# 正弦
> 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.2 反三角函數
基本的反三角函數定義:
反三角函數 定義 值域
arcsin(x) = y sin(y) = x - pi/2 <= y <= pi/2
arccos(x) = y cos(y) = x 0 <= y <= pi,
arctan(x) = y tan(y) = x - pi/2 < y < pi/2
arccsc(x) = y csc(y) = x - pi/2 <= y <= pi/2, y!=0
arcsec(x) = y sec(y) = x 0 <= y <= pi, y!=pi/2
arccot(x) = y cot(y) = x 0 < y < pi
反正弦,反餘弦,反正切
# 反正弦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
2.3 三角函數公式
接下來,用單元測試的方式,來描述三角函數的數學公式。通過testthat包,進行單元測試,關於testthat包的安裝和使用,請參考文章:在巨人的肩膀前行 催化R包開發
# 加載testthat包
> library(testthat)
# 定義變量
> a<-5;b<-10
平方和公式:
sin(x)^2+cos(x)^2 = 1
expect_that(sin(a)^2+cos(a)^2,equals(1))
和角公式
sin(a+b) = sin(a)*cos(b)+sin(b)*cos(a)
sin(a-b) = sin(a)*cos(b)-sin(b)*cos(a)
cos(a+b) = cos(a)*cos(b)-sin(b)*sin(a)
cos(a-b) = cos(a)*cos(b)+sin(b)*sin(a)
tan(a+b) = (tan(a)+tan(b))/(1-tan(a)*tan(b))
tan(a-b) = (tan(a)-tan(b))/(1+tan(a)*tan(b))
expect_that(sin(a)*cos(b)+sin(b)*cos(a),equals(sin(a+b)))
expect_that(sin(a)*cos(b)-sin(b)*cos(a),equals(sin(a-b)))
expect_that(cos(a)*cos(b)-sin(b)*sin(a),equals(cos(a+b)))
expect_that(cos(a)*cos(b)+sin(b)*sin(a),equals(cos(a-b)))
expect_that((tan(a)+tan(b))/(1-tan(a)*tan(b)),equals(tan(a+b)))
expect_that((tan(a)-tan(b))/(1+tan(a)*tan(b)),equals(tan(a-b)))
2倍角公式
sin(2*a) = 2*sin(a)*cos(a)
cos(2*a) = cos(a)^2-sin(a)^2=2*cos(a)^2-1=1-2*sin2(a)
expect_that(cos(a)^2-sin(a)^2,equals(cos(2*a)))
expect_that(2*cos(a)^2-1,equals(cos(2*a)))
expect_that(1-2*sin(a)^2,equals(cos(2*a)))
3倍角公式
cos(3*a) = 4*cos(a)^3-3*cos(a)
sin(3*a) = -4*sin(a)^3+3*sin(a)
expect_that(4*cos(a)^3-3*cos(a),equals(cos(3*a)))
expect_that(-4*sin(a)^3+3*sin(a),equals(sin(3*a)))
半角公式
sin(a/2) = sqrt((1-cos(a))/2)
cos(a/2) = sqrt((1+cos(a))/2)
tan(a/2) = sqrt((1-cos(a))/(1+cos(a))) = sin(a)/(1+cos(a)) = (1-cos(a))/sin(a)
expect_that(sqrt((1-cos(a))/2),equals(abs(sin(a/2))))
expect_that(sqrt((1+cos(a))/2),equals(abs(cos(a/2))))
expect_that(sqrt((1-cos(a))/(1+cos(a))),equals(abs(tan(a/2))))
expect_that(abs(sin(a)/(1+cos(a))),equals(abs(tan(a/2))))
expect_that(abs((1-cos(a))/sin(a)),equals(abs(tan(a/2))))
和差化積
sin(a)*cos(b) = (sin(a+b)+sin(a-b))/2
cos(a)*sin(b) = (sin(a+b)-sin(a-b))/2
cos(a)*cos(b) = (cos(a+b)+cos(a-b))/2
sin(a)*sin(b) = (cos(a-b)-cos(a+b))/2
expect_that((sin(a+b)+sin(a-b))/2,equals(sin(a)*cos(b)))
expect_that((sin(a+b)-sin(a-b))/2,equals(cos(a)*sin(b)))
expect_that((cos(a+b)+cos(a-b))/2,equals(cos(a)*cos(b)))
expect_that((cos(a-b)-cos(a+b))/2,equals(sin(a)*sin(b)))
積化和差
sin(a)+sin(b) = 2*sin((a+b)/2)*cos((a+b)/2)
sin(a)-sin(b) = 2*cos((a+b)/2)*cos((a-b)/2)
cos(a)+cos(b) = 2*cos((a+b)/2)*cos((a-b)/2)
cos(a)-cos(b) = -2*sin((a+b)/2)*sin((a-b)/2)
expect_that(sin(a)+sin(b),equals(2*sin((a+b)/2)*cos((a-b)/2)))
expect_that(sin(a)-sin(b),equals(2*cos((a+b)/2)*sin((a-b)/2)))
expect_that(2*cos((a+b)/2)*cos((a-b)/2),equals(cos(a)+cos(b)))
expect_that(-2*sin((a+b)/2)*sin((a-b)/2),equals(cos(a)-cos(b)))
萬能公式
sin(2*a)=2*tan(a)/(1+tan(a)^2)
cos(2*a)=(1-tan(a)^2)/(1+tan(a)^2)
tan(2*a)=2*tan(a)/(1-tan(a)^2)
expect_that(sin(2*a),equals(2*tan(a)/(1+tan(a)^2)))
expect_that((1-tan(a)^2)/(1+tan(a)^2),equals(cos(2*a)))
expect_that(2*tan(a)/(1-tan(a)^2),equals(tan(2*a)))
平方差公式
sin(a+b)*sin(a-b)=sin(a)^2+sin(b)^2
cos(a+b)*cos(a-b)=cos(a)^2+sin(b)^2
expect_that(sin(a)^2-sin(b)^2,equals(sin(a+b)*sin(a-b)))
expect_that(cos(a)^2-sin(b)^2,equals(cos(a+b)*cos(a-b)))
降次升角公式
cos(a)^2=(1+cos(2*a))/2
sin(a)^2=(1-cos(2*a))/2
expect_that((1+cos(2*a))/2,equals(cos(a)^2))
expect_that((1-cos(2*a))/2,equals(sin(a)^2))
輔助角公式
a*sin(a)+b*cos(a) = sqrt(a^2+b^2)*sin(a+atan(b/a))
expect_that(sqrt(a^2+b^2)*sin(a+atan(b/a)),equals(a*sin(a)+b*cos(a)))
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
> is.complex(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)
Error in uniroot(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_vline(yintercept=0) #座標軸
> g<-g+ggtitle(paste("y =",a,"* x ^ 3 +",b,"* x ^2 +",c,"* x + ",d))
> g
4.4 二元一次方程組
R語言還可以解二次的方程組,當然計算方法,其實是利用於矩陣計算。
假設方程組:是以x1,x2兩個變量組成的方程組,求x1,x2的值
以矩陣形式,構建方程組
# 左矩陣
> lf<-matrix(c(3,5,1,2),nrow=2,byrow=TRUE)
# 右矩陣
> rf<-matrix(c(4,1),nrow=2)
# 計算結果
> result<-solve(lf,rf)
> result
[,1]
[1,] 3
[2,] -1
得方程組的解,x1, x2分別爲3和-1。
接下來,我們畫出這兩個線性方程的圖。設y=X2, x=X1,把原方程組變成兩個函數形式。
# 定義2個函數
> fy1<-function(x) (-3*x+4)/5
> fy2<-function(x) (-1*x+1)/2
# 定義數據
> x<-seq(-1,4,by=0.01)
> y1<-fy1(x)
> y2<-fy2(x)
> dy1<-data.frame(x,y=y1,type=paste("y=(-3*x+4)/5"))
> dy2<-data.frame(x,y=y2,type=paste("y=(-1*x+1)/2"))
> df <- rbind(dy1,dy2)
# 用ggplot2畫圖
> g<-ggplot(df,aes(x,y))
> g<-g+geom_line(aes(colour=type,stat='identity')) #2條直線
> g<-g+geom_hline(yintercept=0)+geom_vline(yintercept=0) #座標軸
> g
我們看到兩條直線交點的座標,就是方程組的兩個根。多元一次方程,同樣可以用這種方法來解得。
通過R語言,我們實現了對於初等數學的各種計算,真的是非常方便!下一篇文章將介紹,用R語言來解決高級數學中的計算問題。
轉載請註明出處:
http://blog.fens.me/r-mathematics/