在 C++ 和 Armadillo 中将 sqrt(-1) 乘以矩阵
multiply sqrt(-1) to matrix in c++ and Armadillo
我对 c++ 完全陌生,编写了以下程序:
#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).....
另一方面,我想知道如何在 Armadillo 中将 sqrt(-1) 乘以矩阵。
sqrt(-1)
不能表示为 double
(模拟实数)。 sqrt(-1)
的结果是 NaN(不是数字),不是你期望的复数。
要使 Armadillo 处理复数,请在所有地方使用 cx_mat
而不是 mat
,并使用 std::complex<double>(0, 1)
而不是 sqrt(-1)
,或者,如果您可以依赖C++14,using namespace std::literals;
和 1i
.
我对 c++ 完全陌生,编写了以下程序:
#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).....
另一方面,我想知道如何在 Armadillo 中将 sqrt(-1) 乘以矩阵。
sqrt(-1)
不能表示为 double
(模拟实数)。 sqrt(-1)
的结果是 NaN(不是数字),不是你期望的复数。
要使 Armadillo 处理复数,请在所有地方使用 cx_mat
而不是 mat
,并使用 std::complex<double>(0, 1)
而不是 sqrt(-1)
,或者,如果您可以依赖C++14,using namespace std::literals;
和 1i
.