Как решить уравнения с комплексными коэффициентами, используя ode45 в MATLAB?

Я пытаюсь решить два уравнения с комплексными коэффициентами, используя ode45. Но я получаю сообщение об ошибке: «Входные данные должны быть с плавающей запятой, а именно одинарными или двойными».

X = sym(['[',sprintf('X(%d) ',1:2),']']);

Eqns=[-(X(1)*23788605396486326904946699391889*1i)/38685626227668133590597632 + (X(2)*23788605396486326904946699391889*1i)/38685626227668133590597632; (X(2)*23788605396486326904946699391889*1i)/38685626227668133590597632 + X(1)*(- 2500000 + (5223289665997855453060886952725538686654593059791*1i)/324518553658426726783156020576256)] ;

f=@(t,X)[Eqns];

[t,Xabc]=ode45(f,[0 300*10^-6],[0 1])

Как я могу это исправить ? Может ли кто-нибудь помочь мне?


person Bharath    schedule 31.07.2015    source источник
comment
Хммм... Можете ли вы отделить свое дифференциальное уравнение? на действительную и мнимую части и использовать ode45 на каждой отдельно?   -  person anon01    schedule 31.07.2015
comment
@ anon0909 Я не думаю, что проблема в комплексных числах, ode45 легко с ними справится.   -  person madbitloman    schedule 31.07.2015


Ответы (1)


Согласно группе поддержки MathWorks, "решатели ODE в MATLAB 5 (R12) и более поздние выпуски должным образом обрабатывают комплексные системы». Так что комплексные числа не проблема.

Ошибка «Входные данные должны быть с плавающей запятой, а именно одинарные или двойные». вытекает из вашего определения f с использованием символических переменных, которые, в отличие от комплексных чисел, не являются числами с плавающей запятой. Самый простой способ обойти это — вообще не использовать Symbolic Toolbox; просто делает Eqns анонимной функцией:

Eqns= @(t,X) [-(X(1)*23788605396486326904946699391889*1i)/38685626227668133590597632 + (X(2)*23788605396486326904946699391889*1i)/38685626227668133590597632; (X(2)*23788605396486326904946699391889*1i)/38685626227668133590597632 + X(1)*(- 2500000 + (5223289665997855453060886952725538686654593059791*1i)/324518553658426726783156020576256)] ;

[t,Xabc]=ode45(Eqns,[0 300*10^-6],[0 1]);

При этом я хотел бы отметить, что численное время интегрирования этой системы в течение 300 микросекунд (я предполагаю, что без указания единиц измерения) займет много времени, поскольку ваша матрица коэффициентов имеет мнимые собственные значения порядка 10E+10. Чрезвычайно короткая длина волны этих колебаний, скорее всего, будет разрешена с помощью адаптивных методов Matlab, и это займет некоторое время, чтобы решить временной интервал, всего на несколько порядков превышающий длину волны.

Поэтому я бы предложил аналитический подход к этой проблеме; если это не ступенька к другой проблеме, которая не может быть решена аналитически.


Системы обыкновенных дифференциальных уравнений вида

Уравнение линейной однородной системы обыкновенных дифференциальных уравнений с постоянными коэффициентами,

которая представляет собой линейную однородную систему с постоянной матрицей коэффициентов, имеет общее решение

Общее матричное экспоненциальное решение системы ОДУ,

где m-подстрочная экспоненциальная функция является матричной экспоненциальной. Следовательно, аналитическое решение системы может быть вычислено точно, если можно вычислить матричную экспоненту. В Matlab экспоненциальная матрица вычисляется с помощью функции expm. Следующий код вычисляет аналитическое решение и сравнивает его с числовым за короткий промежуток времени:

%   Set-up
A    = [-23788605396486326904946699391889i/38685626227668133590597632,23788605396486326904946699391889i/38685626227668133590597632;...
        -2500000+5223289665997855453060886952725538686654593059791i/324518553658426726783156020576256,23788605396486326904946699391889i/38685626227668133590597632];
Eqns = @(t,X) A*X;
X0   = [0;1];

%   Numerical
options = odeset('RelTol',1E-8,'AbsTol',1E-8);
[t,Xabc]=ode45(Eqns,[0 1E-9],X0,options);

%   Analytical
Xana = cell2mat(arrayfun(@(tk) expm(A*tk)*X0,t,'UniformOutput',false)')';

k = 1;
%   Plots
figure(1);
    subplot(3,1,1)
        plot(t,abs(Xana(:,k)),t,abs(Xabc(:,k)),'--');
        title('Magnitude');
    subplot(3,1,2)
        plot(t,real(Xana(:,k)),t,real(Xabc(:,k)),'--');
        title('Real');
        ylabel('Values');
    subplot(3,1,3)
        plot(t,imag(Xana(:,k)),t,imag(Xabc(:,k)),'--');
        title('Imaginary');
        xlabel('Time');

График сравнения:

Сравнение аналитических и численных решений

Выход ode45 очень хорошо соответствует величине и действительной части решения, но мнимая часть не совпадает по фазе ровно на . Однако, поскольку оценщик ошибок ode45 рассматривает только нормы, разница фаз не замечается, что может привести к проблемам в зависимости от приложения.

Следует отметить, что хотя матричное экспоненциальное решение намного дороже, чем ode45 для того же количества элементов вектора времени, аналитическое решение будет давать точное решение для любого вектора времени любой заданной плотности. . Таким образом, для долгосрочных решений матричную экспоненту можно рассматривать как улучшение в некотором смысле.

person TroyHaskin    schedule 31.07.2015
comment
Спасибо @TroyHaskin. Да, вы правы, я пытаюсь решить задачу атомной физики численно с точностью до 300 микросекунд. Фактическая система состоит из 625 связанных ODE, но трудно поместить длинный код, который я написал, и задать вопрос, я просто взял 2 уравнения и попытался решить их, где я получил то же сообщение об ошибке, что и для 625 уравнений . Поскольку такая большая система не может быть решена аналитически, я должен использовать только численный подход. Поэтому я выбрал ODE45. Да, сейчас на их решение уходит много времени. Не подскажете, как решить быстрее? Еще раз спасибо. - person Bharath; 01.08.2015
comment
@ user3218696 Система аналогична представленной, то есть линейной с постоянными коэффициентами? - person TroyHaskin; 02.08.2015
comment
Да, они линейны с постоянными коэффициентами, как и два приведенных выше уравнения... но они также являются комплексными числами в коэффициентах. - person Bharath; 02.08.2015
comment
@ user3218696 Я добавил к ответу. - person TroyHaskin; 04.08.2015