繁体   English   中英

用GSL解决大型ODE系统

Solving large system of ODE with GSL

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我有一个普遍的问题,就是我不能束手无策,也不确定这是否是一个合适的地方。 目前我一无所知,欢迎任何文献和建议。 我个人讨厌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执行此操作,或者是否需要为此开发自定义数值方法?

问题暂未有回复.您可以查看右边的相关问题.
1 在Matlab中解决大型ODE系统

我是Matlab的新手,正在尝试以数值方式解决以下系统: 我可以解决单个S的情况,但是我需要在N = 1000(我从1到N)的情况下进行处理,而且我不确定如何扩展代码。 在文件eom.m中 ...

2017-06-09 15:05:23 0 187   matlab
2 GSL解决摆锤运动的ODE

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

3 使用 GSL 减少 ODE 系统的编译资源

我正在使用 C++ 和 GSL(Gnu 科学库)将大型 ODE 系统与 4503 方程集成。 由于系统很僵硬,我需要为积分设置雅可比行列式,结果矩阵有大约 2000 万个条目。 为了初始化 ODE 系统和 Jacobian,GSL 需要使用具有特定签名的函数,即, 其中dydt[]和*dfdy ...

4 R通过Rcpp与c ++交互以解决大型ODE系统

我试图加快我的R代码的执行速度,这些代码使用C ++和Rcpp执行一些计算量大的任务。 我的问题涉及大约100个方程式的系统,因此欢迎任何提速计算的提示。 我需要将在R中创建的矩阵MX导入C ++脚本。 在ODE系统中,C ++脚本必须将MX行用作x0 ( x初始值)。 为了简化 ...

5 我可以从ODE系统开始解决DDE吗?

我有一个包含4个方程式和5个参数的系统,我想在ODE系统上包括一个时间延迟,但是如果我从已经拥有的ODE系统开始求解DDE系统,我认为更好。 有没有办法在MATLAB中连接这两个系统? 我尝试使用以下语法: 但是MATLAB每次都会标记错误。 ...

6 在C ++中使用gsl解决耦合的ODE

我必须在cpp中使用gsl解决一组三个耦合的二阶常微分方程。 我在gsl网站上找不到任何解决耦合ODE问题的示例。 我对gsl完全陌生。 有人可以请我参考一些例子。 谢谢 ...

2015-11-17 18:01:06 0 177   c++/ gsl
7 使用ODE45解决ODE系统

我正在尝试学习如何使用MATLAB求解微分方程组(Lorenz方程)并将每个解作为t的函数绘制 其中σ = 10 , β = 8/3和ρ = 28 ,以及x(0) = −8 , y(0) = 8和z(0) = 27 。 这是我正在使用的代码: 但是,这会产生错误,我该如何解 ...

8 使用Octave解决ODE系统

当我执行代码时,以上错误弹出。 x0 = [1.5 0 0 7]',并且t的范围是0到120。我保存了dxdt.m并选择了正确的目录。 有人会为代码有什么问题提供线索吗? 非常感谢! ...

2018-11-08 12:04:31 1 34   octave
9 用scipy减速解决ODE系统

我正在尝试使用adam或bdf方法解决使用scipy.integrate.ode的ODE系统。 当将ODE中的一些参数设置为零时,Scipy提供了良好且快速的结果,但是,在寻找解决方案时似乎存在巨大的减速。 我只是想知道导致这种放缓的原因是什么? 这个给定的代码将产生一个正确的正弦解 ...

10 用Python解决动态ODE系统

我正在尝试用三个状态变量V1,V2,I3解决一个动力学系统,然后将其绘制在3d图中。 到目前为止,我的代码如下: 打印应该包含解sol [:,0]等的数组表明,显然它不断地用初始值填充它。 有人可以帮忙吗? 谢谢! ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM