# 创建数据点
> 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=\点 > g<-g+geom_hline(yintercept=0)+geom_vline(yintercept=0) #坐标轴 > g<-g+ggtitle(paste(\> 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(\> 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(\> 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(\> dy2<-data.frame(x,y=y2,type=paste(\> 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语言来解决高级数学中的计算问题。
前言
高等数学是每个大学生都要学习的一门数学基础课,同时也可能是考完试后最容易忘记的一门知识。
我在学习高数的时候绞尽脑汁,但始终都不知道为何而学。生活和工作基本用不到,就算是在计算机行业和金融行业,能直接用到高数的地方也少之又少,学术和实际应用真是相差太远了。
不过,R语言为我打开了一道高数应用的大门,R语言不仅能方便地实现高等数学的计算,还可以很容易地把一篇论文中的高数公式应用于产品的实践中。 因为R语言我重新学习了高数,让生活中充满数学,生活会变得更有意思。 本节并不是完整的高数计算手册,仅介绍了导数计算和偏导数计算的R语言实现。 目录 1. 2. 3. 4.
导数计算
初等函数的导数公式 二阶导数计算 偏导数计算
1. 导数计算
导数(Derivative)是微分学的基本概念,用于计算函数的极值。导数的定义为,当函数y=f(x)在x0的某个领域内有定义,当自变量x在x0处取得增加Δx(点x0+Δx仍在该邻域内)时,相应的函数取得增量Δy=f(x0+Δx)-f(x0);如果Δy与Δx之比当Δx趋于0时的极限存在,则称函数y=f(x)在点x0处可导,并称这个极限为函数y=f(x)在点x0处的导数,记为f`(x0),即
也记作 y’|x=x0 ,dy/dx|x=x0 或 df(x)/dx|x=x0。