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 ?
答案 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的自适应方法解决,并且需要一段时间来解决比波长大几个数量级的时间跨度。
因此,我建议对这个问题采取分析方法;除非它是踩踏石头的另一个非分析性可解决的问题。形式的常微分方程组
是一个具有常系数矩阵的线性均匀系统,具有一般解
其中 m -subscripted指数函数是matrix exponential。
因此,可以精确计算系统的解析解,假设可以计算矩阵指数。
在Matlab中,矩阵指数通过expm
函数计算。
以下代码计算分析解决方案,并将其与短时间范围内的数字解决方案进行比较:
10E+10
比较图是:
% 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
成本更高,而分析解决方案将随时生成精确解决方案赋予它的任何密度的向量。因此,对于长时间的解决方案,矩阵指数可以被视为某种意义上的改进。