我有一组观察到的原始数据,并使用二阶ODE来拟合数据
y''+b1(t)y'+b0(t)y = 0
b1 和 b0 与时间有关,我使用主要差异分析(PDA)(R-package: fda ,功能: pda.fd )以获得 b1(t)和 b0(t)的估算值。
为了检查b1(t)和b0(t)估计的有效性,我使用搭配方法(R-package bvpSolve ,函数: bvpcol )来得到ODE的数值解,并将解与原始数据的平滑曲线拟合进行比较。
我的问题是,我从bvpcol得到的数值解可以拟合拟合曲线的形状,但不能用于函数的值。在一些常数倍数方面存在差异。
(由于我不允许发布图片,请参阅figure)
的链接查看输出图。 灰点是我的原始数据,红线是原始数据的傅立叶展开,绿线是bvpcol函数的数值解, 蓝线绿线/ 1.62。我们可以看到绿线可以捕获形状,但值是恒定的傅里叶展开时间。
我适合其他几个数据并且具有相似的情况但不同的常数。我想知道这是ODE的数值解决方案的问题或其他一些原因以及如何解决这个问题以获得数值解(绿色)和真正的傅里叶展开之间的良好一致性?
感谢任何帮助和想法!
这是原始数据和代码: RData就在这里
library(fda)
library(bvpSolve)
# load the data
load('y.RData')
tvec = 1:length(y)
tvec = (tvec-min(tvec))/(max(tvec)-min(tvec))
# create basis
fbasis = create.fourier.basis(c(0,1),nbasis=nbasis)
bbasis = create.bspline.basis(c(0,1),norder=8,nbasis=47)
bfdPar = fdPar(bbasis)
yfd = smooth.basis(tvec,y,fbasis)$fd
yfdlist = list(yfd)
bwtlist = rep(list(bfdPar),2)
# PDA fit
bwt = pda.fd(yfdlist,bwtlist)$bwtlist
# output of estimated coefficients
beta0.fd<-bwt[[1]]$fd
beta1.fd<-bwt[[2]]$fd
# define the vary-coef function in terms of t
fbeta0<-function(t)eval.fd(t,beta0.fd)
fbeta1<-function(t)eval.fd(t,beta1.fd)
# define 2nd order ODE
fun2 <- function(t,y,pars) {
with(as.list(c(y,pars)),{
beta0 = pars[[1]];
beta1 = pars[[2]];
dy1 = y[2]
dy2 = -beta1(t)*y[2]-beta0(t)*y[1]
return(list(c(dy1,dy2)))
})
}
# BVP
yinit<-c(p1[1],NA)
yend<-c(p1[length(p1)],NA)
t<-seq(tvec[1],tvec[length(tvec)],0.005)
col<-bvpcol(yini=yinit,yend=yend,x=t,func=fun2,parms=c(fbeta0,fbeta1),atol=1e-5,islin=T)
# plot output
plot(col[,1],col[,2],col='green',type='l')
points(tvec,p1,col='darkgray')
lines(yfd,col='red',lwd=2)
lines(col[,1],col[,2],col='green',type='l')
lines(col[,1],col[,2]/1.62,col='blue',type='l',lwd=2,lty=4)
legend('topleft',col=c('green','darkgray','red','blue'),
legend=c('ODE solution','raw data','basis curve fitting','ODE solution/1.62'),lty=1)