2015-05-29 2 views
0

Я абсолютно новый в C++ и написал следующую программу:умножить SQRT (-1) к матрице в C++ и Armadillo

#include <iostream> 
#include <armadillo> 

using namespace std; 
using namespace arma; 

mat tens(mat A,mat B,mat C){ 
    mat E = kron(kron(A,B),C); 
    return E; 
} 

mat ii(2,2,fill::eye);// make a 2*2 identify matrix 

mat ee = ii.col(0); // extract a column vector 
mat gg = ii.col(1); 

mat a1=tens(ee,gg,gg); 
mat a2=tens(gg,ee,gg); 
mat a3=tens(gg,gg,ee); 
mat s23=a3*a2.t(); 
mat H=a1*a1.t()+a2*a2.t()+a2*a1.t()+a1*a2.t(); 

mat rhot(float t,mat y){ 
    return sqrt(-1)*(-H*y+y*H)+0.5*(2*s23*y*s23.t()-s23.t()*s23*y- y*s23.t()*s23); 
} 

int rk4(mat y,float dt,float tmax){ 
    float t = 0.; 
    mat ydot1, ydot2, ydot3, ydot4; 
    while (t < tmax) 
    { 
     ydot1 = rhot(t, y); 
     ydot2 = rhot(t+0.5*dt, y+0.5*dt*ydot1); 
     ydot3 = rhot(t+0.5*dt, y+0.5*dt*ydot2); 
     ydot4 = rhot(t+dt, y+dt*ydot3); 
     cout<< t<< " "<< a3.t()*y*a3 <<endl; 
     y=y+ (dt/6.0)*(ydot1 + 2.0*ydot2 + 2.0*ydot3 + ydot4); 
     t=t+ dt; 
    } 
    return 0; 
} 

int main()//int argc, char** argv) 
{ 
    rk4(tens(ee,gg,gg)*tens(ee,gg,gg).t(),0.01,4.); 
    return 0; 
} 

Проблема в SQRT (-1) в сильфона функции:

mat rhot(float t,mat y){ 
    return sqrt(-1)*(-H*y+y*H)..... 

С другой стороны, я хочу знать, как можно умножить sqrt (-1) на матрицу в Armadillo.

+0

Чтобы добавить к запросу Wintermute. Вышеуказанная функция 'tens()' неэффективна, так как она копирует входные матрицы. В C++ все аргументы функций по умолчанию передаются по значению, что по сути означает копирование. Чтобы предотвратить это, измените объявление «десятки (мат A, мат B, мат C)» на 'десятки (const mat & A, const mat & B, const mat & C)'. «&» Имеет решающее значение. Вы можете использовать функцию 'tens()', как и раньше, т.е. 'tens (ee, gg, gg)' – mtall

+0

Большое спасибо. Поскольку я новичок в C++, я не знаю много проблем. – user3109979

ответ

2

sqrt(-1) не может быть представлен как double (который моделирует реальные цифры). Результатом sqrt(-1) является NaN (не число), а не комплексное число i, которое вы ожидаете.

Для Armadillo работы с комплексными числами, используйте cx_mat вместо mat везде, и вместо sqrt(-1), используйте std::complex<double>(0, 1) или, если вы можете полагаться на C++ 14, using namespace std::literals; и 1i.

+0

Благодарим вас за быстрый, маленький и, конечно же, полезный коментарий! – user3109979

Смежные вопросы