matlab 解矩阵的常微分方程

ode45不能直接把矩阵作为输入或输出,输入和返回值必须是列向量。
所以把矩阵的每一个元素作为一个状态变量,例如2 * 2矩阵p=[p1,p2;p3,p4],在输出时转换为4 * 1列向量 [p1,p2,p3,p4] 即可.

建立方程组,输入为y,输出为dy。
考虑复数矩阵微分方程

dp/dt=(p * H-H * p) /i
(p,H都为2 * 2矩阵,p(t)是t的函数,H是一个常数矩阵)

由于输入的矩阵 y 会被自动转换为列向量,先把y reshape为2 * 2矩阵,然后写出矩阵形式方程dy_mat=(Hy-yH)/i; 输出dy再reshape为列向量即可。其中H是一个常数矩阵,作为参数传入。

function dy =lindblad( t,y,H )
y=reshape(y,size(H));
dy_mat=(H*y-y*H)/i;
dy=reshape(dy_mat,[numel(H),1]);
end

解方程

 %设置时间区间0~5秒,251个时间点
t_sec=0:0.02:5;
%初始状态,设置y0为2*2零矩阵,传入函数时会自动变为4*1列向量
y0=zeros(size(H));
%解出y随t的变化
[t,y] = ode45(@(t,y) lindblad( t,y,H ), t_sec, y0); 

最后得到的y是251 * 4的矩阵。每一行代表此时刻的4 * 1列向量。总共有251个时间点。再提取y的每一行,reshape为2 * 2矩阵即得到矩阵随时间变化情况。

你可能感兴趣的:(matlab,线性代数)