R 变系数常微分方程的求解

R 变系数常微分方程的求解,r,numerical-methods,ode,R,Numerical Methods,Ode,我有一组观察到的原始数据,并使用二阶ODE来拟合数据 y''+b1(t)y'+b0(t)y = 0 b1和b0是时间相关的,我使用主微分分析pda R-package:fda,function:pda.fdt来获得b1t和b0t的估计值 为了检验b1t和b0t估计的有效性,我使用配置方法R-package bvpSolve,function:bvpcol获得ODE的数值解,并将该解与原始数据的平滑曲线拟合进行比较 我的问题是,我从bvpcol得到的数值解可以得到拟合曲线的形状,但不能得到函数

我有一组观察到的原始数据,并使用二阶ODE来拟合数据

 y''+b1(t)y'+b0(t)y = 0
b1和b0是时间相关的,我使用主微分分析pda R-package:fda,function:pda.fdt来获得b1t和b0t的估计值

为了检验b1t和b0t估计的有效性,我使用配置方法R-package bvpSolve,function:bvpcol获得ODE的数值解,并将该解与原始数据的平滑曲线拟合进行比较

我的问题是,我从bvpcol得到的数值解可以得到拟合曲线的形状,但不能得到函数的值。就某些常数倍数而言,它们是不同的

由于我不允许发布图片,请查看链接以了解更多信息

请参见我的输出图。灰点是我的原始数据,红线是原始数据的傅里叶展开,绿线是bvpcol函数的数值解,蓝线是绿线/1.62。我们可以看到绿线可以捕捉形状,但其值是傅里叶展开的常数倍

我拟合了其他几个数据,情况相似,但常数不同。我想知道这是常微分方程数值解的问题还是其他原因,以及如何解决这个问题以使数值解格林展开和真傅里叶展开很好地一致

任何帮助和想法都将不胜感激

以下是原始数据和代码: 在这儿吗


最好不要双重张贴。另外,你的问题应该有可复制的R代码,并且是关于在这个网站上编程的。在没有代码的情况下,我最好的猜测是,你没有把你的边界条件代入你的函数中,所以它们仍然在某个微光微分区域中浮动code@DWin我在bvpcol函数中使用了边界条件。
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)