如何在R中求解带时变参数的随机微分方程(SDE)方程组
求解带时变参数h的SDE方程组解决方案
错误原因
你之前的修改存在两个核心问题:
- 你在R侧定义的
signal是R语言函数,Julia求解SDE的进程无法直接调用R侧的自定义函数,因此会报变量/函数未定义的错误 SDEProblem接口本身没有signal这个传入参数,你额外追加的参数无法被传递到漂移函数中使用
最简修改方案
由于你的h参数规则非常明确(仅t∈[50,70]时取值为1,其余时间为0),直接在Julia侧的漂移函数内部实现时变逻辑即可,不需要额外在R侧定义插值函数:
- 删掉你之前新增的R侧
signal定义、julia_assign("signal", signal)、以及SDEProblem构造时额外加的signal=signal参数 - 修改漂移函数
f的定义如下:
## 漂移部分修改后的代码 f <- JuliaCall::julia_eval(" function f(dy,y,p,t) # 直接在Julia函数内实现h的时间依赖规则 h = (t >= 50.0 && t <= 70.0) ? 1.0 : 0.0 dy[1] = -y[1]*p[1] + (y[2]-y[1])*p[2] + h dy[2] = -y[2]*p[1] + (y[1]-y[2])*p[2] end")
- 调整参数定义,将a修正为你需要的0.3:
## 参数修正 a=0.3; b=0.2; g=1; p<-c(a, b, g)
其余代码保持你最开始h恒定版本的写法即可,正常运行就能得到符合时变h要求的求解结果。
复杂forcing场景通用方案
如果你后续需要使用更复杂的时变参数(比如多段连续变化、实验观测得到的时序forcing),可以把forcing的时间点序列、对应值序列作为参数追加到p向量/数组中,在Julia漂移函数内调用Julia原生的插值函数完成取值即可,避免跨语言调用函数的兼容问题。
内容的提问来源于stack exchange,提问作者14thTimeLord
相关产品推荐
相关产品推荐

