How to solve equations with complex coefficients using ode45 in MATLAB?

时间:2015-07-31 19:55:03

标签: matlab ode ode45

I am trying to solve two equations with complex coefficients using ode45. But iam getting an error message as "Inputs must be floats, namely single or double."

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])

How can i fix this ? Can somebody can help me ?

1 个答案:

答案 0 :(得分:1)

根据MathWorks Support Team,“MATLAB 5(R12)及更高版本中的ODE求解器正确处理复杂值系统。”所以复杂的数字不是问题。

错误“输入必须是浮动的,即单个或双重。”源于你使用符号变量的f的定义,与复数不同,它不是浮点数。解决这个问题的最简单方法是根本不使用符号工具箱;只是让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微秒(我假设没有给出单位)将花费很长时间,因为你的系数矩阵具有{{1}的数量级的虚特征值}。这些振荡的极短波长很可能通过Matlab的自适应方法解决,并且需要一段时间来解决比波长大几个数量级的时间跨度。

因此,我建议对这个问题采取分析方法;除非它是踩踏石头的另一个非分析性可解决的问题。

形式的常微分方程组

Equation for a linear, homogenous, constant coefficient system of ordinary differential equations

是一个具有常系数矩阵的线性均匀系统,具有一般解

General matrix exponential solution to the system of ODEs

其中 m -subscripted指数函数是matrix exponential。 因此,可以精确计算系统的解析解,假设可以计算矩阵指数。 在Matlab中,矩阵指数通过expm函数计算。 以下代码计算分析解决方案,并将其与短时间范围内的数字解决方案进行比较:

10E+10

比较图是:

Comparison of analytical and numerical solutions

% 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 成本更高,而分析解决方案将随时生成精确解决方案赋予它的任何密度的向量。因此,对于长时间的解决方案,矩阵指数可以被视为某种意义上的改进。