带复数的java ODE

带复数的java ODE,java,apache,math,complex-numbers,ode,Java,Apache,Math,Complex Numbers,Ode,我目前正在尝试使用ApacheCommons数学库see在java中计算ODE,以便在hadoop上运行该函数。问题是,作为我的ODE的一部分,它使用复数,并且在这个框架内似乎没有任何处理复数的方法。org.apache.commons.math3.ODE.firstOrderDifferentialsequations的输入和输出都是简单的双值 问题是,有没有其他库可以用复数执行这样的任务,或者有没有一种方法可以用来将真正的集成转换为复杂的集成 以下是matlab代码中的最后3个ODE,其中u

我目前正在尝试使用ApacheCommons数学库see在java中计算ODE,以便在hadoop上运行该函数。问题是,作为我的ODE的一部分,它使用复数,并且在这个框架内似乎没有任何处理复数的方法。org.apache.commons.math3.ODE.firstOrderDifferentialsequations的输入和输出都是简单的双值

问题是,有没有其他库可以用复数执行这样的任务,或者有没有一种方法可以用来将真正的集成转换为复杂的集成

以下是matlab代码中的最后3个ODE,其中u2是复杂的

function dy = pricing_odes(tau, y , u1 , u2 , sigma_c , kappa_g , theta , kappa_psi , sigma_cpsi , sigma_cg , phi)

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

alpha = y(1,:);
beta3 = y(2,:);
beta4 = y(3,:);
beta5 = y(4,:);
beta6 = y(5,:);
beta7 = y(6,:);

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


% d beta5 / d tau
dy(4,:) = 2 * sigma_cpsi^2 * beta5^2 + (-2*kappa_psi - 2*sigma_cpsi * u2) * beta5 ...
+ 2 * sigma_cg * sigma_cpsi * beta5 * beta7 + 0.5 * sigma_cg * beta7^2 - sigma_cg * u2 * beta7 + ...
0.5*u2*(u2-1);

% d beta6 /d tau
dy(5,:) = 2 * sigma_cg^2 * beta6^2 - 2 * kappa_g * beta6 + kappa_psi * phi * beta7 + 2 * sigma_cg * sigma_cpsi * beta6 * beta7 ...
+ 0.5 * sigma_cpsi^2 * beta7^2;

% d beta7 /d tau
dy(6,:) = sigma_cg * sigma_cpsi * beta7^2 + (-kappa_g - kappa_psi - sigma_cpsi * u2) * beta7 + ...
2 * kappa_psi * phi * beta5 + 4 * sigma_cg * sigma_cpsi * beta5 * beta6 + 2 * sigma_cpsi^2 * beta5 * beta7 + ...
2 * sigma_cg^2 * beta6 * beta7 - 2 * sigma_cg * u2 * beta6;

这仅仅是一个表示问题,实际的集成例程不需要关心数字是简单的还是复杂的。为了用apache框架解决上述问题,我必须将我的FirstOrderDifferentialsequations对象的维数加倍,现在我将实部和虚部作为单独的元素存储在double[]y和double[]yDot参数reali=y[i*2]和imagi=y[i*2+1]中。然后,在每次迭代中,我可以使用类似的方法创建复杂的实例并执行实际的复杂算法。然后,这些ODE的结果需要以类似的方式存储回yDot。在matlab中对该方法进行仿真时,输出结果与直接使用复数相同。因此,当移植到java时,集成的结果也在公差范围内一些微小的差异+-1e-8,这可能是由于实现了积分器和FP问题。

这些类型的ODE可以分别解决实部和虚部吗?还是两者不独立?也许你可以包括一个你必须求解的典型ODE的例子。不幸的是,这些是riccati方程,如果我理解正确的话,由于它们的非线性,这意味着实部和虚部是相互依赖的。我已经添加了最后3个ODE,正如它们出现在matlab中一样。变量u2是复杂的