-
Notifications
You must be signed in to change notification settings - Fork 9
/
Copy patheigen.pda.R
90 lines (70 loc) · 2.31 KB
/
eigen.pda.R
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
eigen.pda = function(pdaList,plotresult=TRUE,npts=501,...)
{
rangval = pdaList$resfdlist[[1]]$basis$rangeval
m = length(pdaList$resfdlist)
tfine = seq(rangval[1],rangval[2],length.out=npts)
bwtlist = pdaList$bwtlist
awtlist = pdaList$awtlist
ufdlist = pdaList$ufdlist
if(m == 1){
d = length(bwtlist)
xlabstr = names(bwtlist[[1]]$fd$fdnames)[[1]]
betamat = array(0,c(npts,d,d))
for(i in 1:d){
betamat[,1,d-i+1] = -eval.fd(tfine,bwtlist[[i]]$fd)
if(i < d) betamat[,i+1,i] = 1
}
if(!is.null(awtlist)){
umat = matrix(0,npts,d)
for(i in 1:length(awtlist)){
umat[,1] = umat[,1] +
eval.fd(tfine,awtlist[[i]]$fd)*eval.fd(tfine,ufdlist[[i]])
}
}
}
else{
d = length(bwtlist[[1]][[1]])
xlabstr = names(bwtlist[[1]][[1]][[1]]$fd$fdnames)[[1]]
# betamat = array(0,c(npts,m,m,d))
betamat = array(0,c(npts,m*d,m*d))
for(k in 1:d){
for(j in 1:m){
for(i in 1:m){
# betamat[,i,j,k] = eval.fd(tfine,bwtlist[[i]][[j]][[k]]$fd)
if(!is.null(bwtlist[[i]][[j]][[k]]))
betamat[,j,m*(d-k)+i] = -eval.fd(tfine,bwtlist[[i]][[j]][[k]]$fd)
}
if(k < d){
betamat[,m*k+j,m*(k-1)+j] = 1
}
}
}
if(!is.null(awtlist)){
umat = matrix(0,npts,m*d)
for(k in 1:d){
for(i in 1:length(awtlist[[k]])){
if(!is.null(awtlist[[k]][[i]]))
umat[,k] = umat[,k] +
eval.fd(tfine,awtlist[[k]][[i]]$fd)*eval.fd(tfine,ufdlist[[k]][[i]])
}
}
}
}
eigvals = matrix(0,npts,m*d)
limvals = matrix(0,npts,m*d)
for(i in 1:npts){
eigvals[i,] = eigen(betamat[i,,])$values
if(!is.null(awtlist)) limvals[i,] = solve(betamat[i,,],umat[i,])
}
if(plotresult){
if(!is.null(awtlist)) par(mfrow=c(3,1))
else par(mfrow=c(2,1))
matplot(tfine,Re(eigvals),type='l',xlab=xlabstr,ylab='Real',main='Eigenvalues',...)
abline(h = 0)
matplot(tfine,Im(eigvals),type='l',xlab=xlabstr,ylab='Imaginary',...)
abline(h = 0)
if(!is.null(awtlist))
matplot(tfine,limvals[,1:d],type='l',xlab=xlabstr,ylab='Fixed Point',main='Instantaneous Limits',...)
}
return(list(argvals=tfine,eigvals=eigvals,limvals=limvals))
}