我有一个普遍的问题,就是我不能束手无策,也不确定这是否是一个合适的地方。 目前我一无所知,欢迎任何文献和建议。 我个人讨厌GSL,因为它们的示例完全无济于事,而对不同求解器的解释太笼统且缺少示例。 另一个有点烦人的地方是,每个GSL函数都需要一个指向其参数的指针,这迫使许多用户创建混乱的结构,但是(我认为)最巧妙的方法是创建一个类,然后简单地将该指针发送给它,使用reinterpet_cast(params)-我从一个同事那里听说后得知了这一点,在任何GSL示例中都绝对没有,初学者也不自然地想到这一点。

无论如何,我的问题是如何解决矩阵形式的一阶ODE系统? 我有900个一阶ODE的系统,矩阵形式为

y'=M*y

其中M是系统的900x900矩阵。 系统由复数组成,我正在使用矩阵M的犰狳库。我认为我的问题中的复数也可能很棘手,但是我认为GSL具有某些功能,或者可以通过分离实部和虚部来完成。

我的整个代码都是C ++,我通常在稳态下解决此问题(有一个标准化技巧,可以简单地将M取反,并避免det(M)= 0),但是我不知道如何使用GSL做到这一点。 那里的帮助页面根本没有帮助(因为它是针对二阶ODE的)。 我非常了解ODE求解器在Matlab中的工作方式,我看到了GSL版本背后的逻辑,但是我的问题是我需要将整个系统作为矩阵传递,而且我不知道如何获得Jacobian(如果我需要的话)它)。 到目前为止,我发现的所有示例都采用非常小的系统,在该系统中写下系统非常简单。 有人可以解释一下GSL的ode函数是如何推广到矩阵方法的吗?我认为它可能像这样简单:

int odefunc (double t, const double y[], double f[], void *params)
{
    p = reinterpert_cast<Whatever_class *>(params)
    cx_mat M = p->get_matrix_M();
    f=M*y; %Probably does not work since M is armadillo matrix and f needs 
            to be accessed as f[i]
    return GSL_SUCCESS;
}

幸运的是,时间t不在方程中显示,因此可以通过特征值和特征向量更简单地解决此问题,但是我真的很想知道如何使用GSL来实现。

对于我的问题,我实际上必须做的是将耦合系统求解为:

y'=M(x)*y
x'=G(y,t);

第一系统M的矩阵取决于另一个变量x,幸运的是,该变量也取决于时间,仅取决于一个微分方程。 问题是我真的想避免淘汰系统。 G(y,t)非常复杂,需要将向量y整形为矩阵,并使用另一个(恒定)矩阵寻找其踪迹,因此,只有在知道y是什么的情况下,我才能计算G(y,t)。 类似地,M(x)是通过非常复杂的矩阵变换(Khatri-Rao和Kronecker张量积)生成的。 对我来说很明显,解向量应为[y; x],但我不了解如何以GSL需要的方式填充系统。

是否可以使用GSL执行此操作,或者是否需要为此开发自定义数值方法?

  ask by Aleksandar Demić translate from so

本文未有回复,本站智能推荐:

2回复

GSL:求解具有时间相关系数的ODE

我有一个ODE类型: 我正在尝试解决。 唯一的GSL ODE示例不是很有帮助,因为唯一的系数(\\ mu)与时间无关。 该问题已在GSL邮件列表中得到解答,但是答案非常不清楚g(t)被忽略,并且尚未说明如何将a(t)合并到func (应该在*params传递它吗?)。 有没有我可以
1回复

直观的GSL刚性EDO

我需要解决一个行为僵硬的 ODE。 所述 ODE 将由 我不太习惯 C(虽然我习惯 C++),而且GSL 页面中关于微分方程的文档没有太多注释让我理解它。 我已经使用这篇文章来理解它(也是因为我只有 1 个 ode,而不是它们的系统),并且在某种程度上它很有用,但对我来说仍然有点困惑。 对于我的测试
1回复

GSLODE解决方案中的指针类型编译时错误

我正在使用GSL示例页面上的代码来尝试求解由四个微分方程组成的系统。 我一直在努力将五个参数传递给ODE系统,并最终遇到了一个(我希望!)编译时错误。 以下是摘要,给了我错误 对应于以gsl_odeiv2_system开头的行: 有什么想法吗? 非常感谢, 马克C.
1回复

GSL解决摆锤运动的ODE

考虑到钟摆的初始角度(x),重力加速度(g),线长(l)和时间步长(h),我试图解决钟摆运动的微分方程。 我已经使用Euler方法尝试了这一方法,一切都很好。 但是现在我要使用在GSL中实现的Runge-Kutta方法。 我尝试从gsl手册中学习实现它,但是我遇到了一个问题。 钟摆不想停
1回复

使用GSL的ODE解算器相当于什么“MaxSteps”?

我想重现使用Mathematica和GSL创建的ODE求解器。 这是使用NDSolve的Mathematica代码: 尝试使用GSL获得完全相同的内容: 其中nbins是提供给求解器的方程式数量, _h是当前步长。 我在这里没有提供方程式,但是我发现限制步数的唯一方法(如在Mat
2回复

使用GSL的双摆解决方案

我正在学习使用GSL解决ODE。 我想使用GSL ODE函数解决双摆问题。 我决定使用以下等式: (来源: http : //www.physics.usyd.edu.au/~wheat/dpend_html/ ) 我的代码: 输入什么参数真的无关紧要,我总是会报错: gs
1回复

GSL自适应集成给出无效指针错误

我正在尝试使用内置的 RK2imp 方法来解决GSL 示例中给出的 van der pol 问题的稍微修改版本,以使用自适应求解器进行积分。 但是,我不断收到此“错误:无效指针”。 我在这里附上我的代码 这是我得到的输出: 我知道我可能犯了一个非常简单(和愚蠢)的错误,但由于某种原因我看不到它。 我
2回复

使用GNUgsl编写的ODE是否优于Mathematica的NDSolve?

与Mathematica 8.0 NDSolve相比,使用GSL库用C语言编写的ODE求解器是否具有明显的速度优势? 在准确性方面如何公平? 我的理解是编译后的代码原则上可以更快,但是现在NDSolve已经以某种方式使用了很多已编译的代码本身? 还有任何选项可以使用MathLink或M