问题标签 [sundials]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
134 浏览

c - 在计算 SUNDIALS/CVODES 中的伴随灵敏度时,如何处理正解中的不连续性?

我正在使用 CVODES 来计算一个非常基本的方程的伴随灵敏度,该方程在 t=1 处具有解不连续性。在积分正向解决方案时,我在循环中使用CVodeF()in模式在每个间隔上积分,调用以在不连续处重新开始积分。这产生了正确的正向解决方案。然后我呼吁对伴随敏感性分析进行后向整合。CV_ONE_STEPCVodeReInit()CVodeB()

我的问题是关于前向集成的重新启动以及在后向集成期间如何处理它们。在我的程序开始时,我CVodeAdjInit()用调用Nd = 1,所以我相信我在每个集成步骤都保存了检查点。但是,在检查检查点并尝试CVodeGetAdjY()在 t=1 及其前后调用前向解决方案(带有 )时,我没有在正确的时间看到正确的跳跃不连续性。

这些重启是否明确保存(在检查点方案或其他地方)?我是否应该调用其他 CVODES 函数来通知向后积分器这些重新启动?任何使用 CVODES 进行伴随灵敏度分析的一般指导(在存在正解不连续性的情况下)都将不胜感激。

我已经包含了说明这一点的示例代码。我们将 dy/dt = -0.05*y 从 t = 0 积分到 t = 2,在 t = 1 处施加 0.1 的脉冲。在这个例子中,我没有对伴随状态 lambda 做任何事情——主要目的是说明在后向积分过程中如何调用前向解 y。

在前向积分期间,我们有输出(大约 t = 1)

在后向阶段(这里,y 是通过 获得的CVodeGetAdjY),

在 t = 1.00197548 处召回的 y 值当时是正确的(这是在前向积分期间采取的脉冲之后的第一步),但是如果我随后在脉冲附近查询 y(再次使用CVodeGetAdjY):

冲动不明显。在 t = 1.0 时调用的 y 是前脉冲值。看起来好像,即使CVodeReInit()在前向积分期间在脉冲之后立即调用,在后向积分期间也没有“看到”后脉冲 y。此外,如果后向积分器需要检查点之间的任何步骤,则 1.00197548 和 t = 1.0 之间的插值 y 可能会关闭。

换句话说,我的问题是:在重新启动转发问题之后,有没有办法确保这样的重新启动被保存并可以从检查点数据访问?