2014-12-29 4 views
0

В настоящее время я пытаюсь вычислить ODE в java, используя математическую библиотеку apache commons (см. http://commons.apache.org/proper/commons-math/userguide/ode.html), чтобы я мог запускать функцию на hadoop. Проблема заключается в том, что в рамках моего ODE он использует комплексные числа и, похоже, не существует способа обработки сложных чисел в рамках этой структуры (как входы, так и выходы org.apache.commons.math3.ode.FirstOrderDifferentialEquations являются простыми двойными значения).java ODE с комплексными числами

Вопрос в том, есть ли другие библиотеки, которые выполняют такую ​​задачу с комплексными числами, или есть метод, который я могу использовать для перевода реальной интеграции в сложные?

Следующие 3 ODE в коде MATLAB, где 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; 
+0

Являются ли эти виды ОДУ, где вы могли бы решить отдельно для реальной части и мнимой части? Или два не являются независимыми? Возможно, вы могли бы включить пример типичного ODE, который вам нужно будет решить. –

+0

К сожалению, это уравнения риккати, которые, если я правильно понимаю, из-за их нелинейности, означает, что действительная и мнимая части зависят друг от друга. –

+0

Я добавил последние 3 ODE, как они появляются в Matlab. переменная u2 сложна –

ответ

0

Оказывается, что это просто вопрос представления и фактические процедуры интеграции не нужно заботиться ли числа являются простыми или сложными. Чтобы решить вышеизложенное с помощью инфраструктуры apache, мне пришлось удвоить размерность моего объекта FirstOrderDifferentialEquations, благодаря чему я теперь сохраняю реальные и мнимые компоненты как отдельные элементы в двойных параметрах double [] y и double [] yDot (скажем, real (i) = y [i * 2] и imag (i) = y [i * 2 + 1]). Затем на каждой итерации i можно использовать что-то вроде http://commons.apache.org/proper/commons-math/apidocs/org/apache/commons/math3/complex/Complex.html для создания сложных экземпляров и выполнения реальной сложной арифметики. Затем результаты этих ODE должны быть сохранены обратно в yDot аналогичным образом. При моделировании этого подхода в Matlab выходы идентичны непосредственным использованием комплексных чисел. Следовательно, при переносе в java результаты интеграции также находятся в пределах допуска (некоторые незначительные различия (+ - 1e-8) из-за возможной реализации интегратора и вопросов FP).

Смежные вопросы