2016-05-23 5 views
1

Предположим, что мы имеем этот гамильтониан:система обыкновенного дифференциального уравнения в Matlab

n = 10; 
H = ones(n,n); 

матрица плотности:

Ro = sym('r',[n,n]);%Density matrix 

Уравнение движения:

H*Ro-Ro*H 

выше уравнение движения - правая часть уравнения, левая часть - производная по времени матрицы плотности.

Как я могу решить уравнение движения в Matlab без символической математической панели инструментов? Мне нужно изменить значение n. Это может быть до 100.

+0

Под «решающим» вы подразумеваете интеграцию системы в течение конечного времени 'T' из некоторых начальных условий' x0'? – Geoff

+0

Да, я имею в виду. Начальным условием может быть матрица, в которой только ее (1,1) элемент не равен нулю и равен единице. – MOON

ответ

0

В вашей динамической функции переформатируйте между векторами и матрицами, чтобы использовать MATLAB's standard ode functions, которые (насколько мне известно) требуют ввода векторов. Обратите внимание: символическая панель инструментов не используется нигде в этом решении. R может быть любого размера n-by-n, в пределах ограничений памяти вашего компьютера.

function dR = dynfun(R,H) 
           %// R = n^2-by-1 vector 
           %// H = n-by-n matrix 
    n = sqrt(length(R));  
    R = reshape(R,[n,n]);  %// reshape R to n-by-n matrix 
    dR = H*R-R*H;    
    dR = dR(:);     %// reshape dR to n^2-by-1 vector 


end 

Вызов ОДА решатель:

[tout,Rout] = ode45(@(t,R) dynfun(R,H), [0,T], R0(:)); 

где T окончательное время, R0 является n-by-n начального условия, tout шагов времени вывода и Rout является траекторией решения. Примечание из-за перестройки, Rout будет k-by-n^2, где k - это количество шагов времени. Вам нужно будет изменить каждую строку Rout, если вы хотите иметь фактические матрицы с течением времени.