实验三 数组的运算、求解方程(组)和函数极值、数值积分
【实验类型】验证性 【实验学时】2 学时 【实验目的】
1、掌握向量的四则运算和内积运算、矩阵的行列式和逆等相关运算; 2、掌握线性和非线性方程(组)的求解方法,函数极值的求解方法; 3、了解 R 中数值积分的求解方法。 【实验内容】
1、向量与矩阵的常见运算; 2、求解线性和非线性方程(组); 3、求函数的极值,计算函数的积分。 【实验方法或步骤】 第一部分、课件例题:
1. 向量的运算 x<-c(-1,0,2) y<-c(3,8,2) v<-2*x+y+1 v x*y x/y y^x
exp(x) sqrt(y)
x1<-c(100,200); x2<-1:6; x1+x2
2. x<-1:5
y<-2*1:5 x%*%y
crossprod(x,y) x%o%y
tcrossprod(x,y) outer(x,y)
3.矩阵的运算
A<-matrix(1:9,nrow=3,byrow=T);A A+1 #A的每个元素都加上1 B<-matrix(1:9,nrow=3); B
C<-matrix(c(1,2,2,3,3,4,4,6,8),nrow=3); C D<-2*C+A/B; D #对应元素进行四则运算
x<-1:9
A+x #矩阵按列与向量相加 E<-A%*%B; E #矩阵的乘法 y<-1:3
A%*%y #矩阵与向量相乘
crossprod(A,B) #A的转置乘以B tcrossprod(A,B) #A乘以B的转置
4. 矩阵的运算
A<-matrix(c(1:8,0),nrow=3);A t(A) #转置
det(A) #求矩阵行列式的值 diag(A) #提取对角线上的元素
A[lower.tri(A)==T]<-0;A #构造A对应的上三角矩阵
qr.A<-qr(A);qr.A #将矩阵A分解成正交阵Q与上三角阵R的乘积,该结果为一列表 Q<-qr.Q(qr.A);Q;R<-qr.R(qr.A);R #显示分解后对应的正交阵Q与上三角阵R det(Q);det(R);Q%*%R #A=Q*R qr.X(qr.A) #显示分解前的矩阵
5. 解线性方程组
A<-matrix(c(1:8,0),nrow=3,byrow=TRUE) b<-c(1,1,1)
x<-solve(A,b); x #解线性方程组Ax=b B<-solve(A); B #求矩阵A的逆矩阵B A%*%B #结果为单位阵
6. 非线性方程求根
f<-function(x) x^3-x-1 #建立函数
uniroot(f,c(1,2)) #输出列表中f.root为近似解处的函数值,iter为迭代次数,estim.prec为精度的估计值
uniroot(f,lower=1,upper=2) #与上述结果相同 polyroot(c(-1,-1,0,1)) #专门用来求多项式的根,其中c(-1,-1,0,1)表示对应多项式从零次幂项到高次幂项的系数
7.求解非线性方程组
(1)自编函数: (Newtons.R)
Newtons<-function (funs, x, ep=1e-5, it_max=100){ index<-0; k<-1
while (k<=it_max){ #it_max 表示最大迭代次数
x1 <- x; obj <- funs(x);
x <- x - solve(obj$J, obj$f); #Newton 法的迭代公式 norm <- sqrt((x-x1) %*% (x-x1))
if (norm list(root=x, it=k, index=index, FunVal= obj$f)} # 输出列表 (2)调用求解非线性方程组的自编函数 funs<-function(x){ f<-c(x[1]^2+x[2]^2-5, (x[1]+1)*x[2]- (3*x[1]+1)) # 定义函数组 J<-matrix(c(2*x[1], 2*x[2], x[2]-3, x[1]+1), nrow=2, byrow=T) # 函数组的 Jacobi 矩阵 list(f=f, J=J)} # 返回值为列表 : 函数值 f 和 Jacobi 矩阵 J source(\调用求解非线性方程组的自编函数 Newtons(funs, x=c(0,1))