- install.packageS(''TSA'')
- library(''TSA'')
- y<-numeric(lenth(x))
- y[x<0]<-1-x[x<0];y[x>=0]<-1+x[x>=0]
维数向量(dim属性) 默认按列排放
array(data=NA,dim=length(data),dimnames=NULL)
matrix(data=NA,nrow=1,ncol=1,byrow=F,dimnames=NULL) byrow=T数据按行放置
a[, ,]或a[ ] % 都表示整个数组
维数不一样的数组也可以进行四则运算,一般是将短向量循环使用
mode(类型)length(长度)
类型共有四种:数值型(numeric)、字符型(character)、逻辑型(logical)、负数型(complex)
- # 构造一个4阶的Hilbert矩阵
- n<-4;x<-array(0,dim=c(n,n))
- for (i in 1:n){
- for(j in 1:n){
- x[i,j]<-1/(i+j+1)
- }
- }
- x
- # 计算1000以内的Fibonacci数
- f<-1;f[2]<-1;i<-1
- while (f[i]+f[i+1]<1000){
- f[i+2]<-f[i]+f[i+1]
- i<-i+1
- }
- f
- f<-1;f[2]<-1;i<-1
- repeat{
- f[i+2]<-f[i]+f[i+1]
- i<-i+1
- if ((f[i]+f[i+1]>=1000)) break
- }
例:编写一个用二分法求解非线性方程根的函数,并求方程
在区间[1,2]上的根,精度要求
解:二分法计算过程如下:取中点,若f(a)与f(b)异号,则取b=x;否则a=x.
- fzero<-function(f,a,b,eps=1e-5){
- if (f(a)*f(b)>0)
- list(fail="finding root is fail!")
- else{
- repeat{
- if (abs(b-a)<eps) break
- x<-(a+b)/2
- if (f(a)*f(x)<0) b<-x else a<-x
- }
- list(root=(a+b)/2,fun=f(x))
- }
- }
- f<-function(x) x^3-x-1
- fzero(f,1,2)
- # 求一元方程根的函数uniroot()
- f<-function(x) x^3-x-1
- uniroot(f,c(1,2))
例:编写一个用Newton法求解非线性方程根的函数,并求方程
精度要求
- newton<-function(f,eplison,x0,iter_max){
- x=x0
- iter=0
- dx=D(f,'x')
- while (iter<=iter_max){
- ans=x-eval(f)/eval(dx)
- if (abs(x-ans)<eplison){
- break
- }
- else{
- x=ans
- }
- iter=iter+1
- }
- list(x,iter)
- }
- newton(expression(x^3-x-1),0.000001,1.5,100000) # 取初值=1.5
例:编写用Newton法求解非线性方程组解的程序,并求方程
取初始值,精度要求
- Newtons<-function(fun,x,ep=1e-5,it_max=100){
- index<-0;k<-1
- while (k<=it_max){
- x1<-x;obj<-fun(x);
- x<-x-solve(obj$J,obj$f);
- norm<-sqrt((x-x1) %*% (x-x1))
- if (norm<ep){
- index<-1;break
- }
- k<-k+1
- }
- obj<-fun(x);
- list(root=x,it=k,index=index,FunVal=obj$f)
- }
-
- 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)
- list(f=f,J=J)
- }
- Newtons(funs,c(0,1))
输出结果为:
$root [1] 1 2 $it [1] 6 $index [1] 1 $FunVal [1] 1.598721e-14 6.217249e-15