Solving C++ Complex Array with Time-Dependent Schrodinger Equation

3 replies · 34K views · last reply
castusalbuscor
Messages
15
Reaction score
0
Hi, I've been trying to write a program to solve a propagation of a wave packet using the time dependent Schrödinger equation.
and I noticed I would need to use complex numbers.

I know that I need to use #include<complex>

I declare my array, and I started with a simple 1-d array.
complex<double>a[2]
When inputting data to the array I know that I would need something like this:
a[0] = (1,5);
a[1] = (2,8);


however when I output the data I only get:

a[0] = (5,0)
a[1] = (8,0)


Any idea how I can get around it?

And what about taking the complex conjugate of an array?
 
Unfortunately, it did exactly what you asked it to!

The (default) comma operator is defined to:
(1) Evaluate its first argument
(2) Discard the result
(3) Evaulate and return its second argument


So, the expression (1, 5) correctly evaluates to 5. For example, try this statement:

std::count << (1, 5) << std::endl


Your problem is that you wanted to assign a complex number into the array, and so you must create the one you want to put into the array. An example of invoking the two-argument constructor to create a complex number is the expression

complex<double>(1, 5)

which evaluates to the complex number 1+5i.
 
Hurkyl said:
Unfortunately, it did exactly what you asked it to!

The (default) comma operator is defined to:
(1) Evaluate its first argument
(2) Discard the result
(3) Evaulate and return its second argument


So, the expression (1, 5) correctly evaluates to 5. For example, try this statement:

std::cout << (1, 5) << std::endl


Your problem is that you wanted to assign a complex number into the array, and so you must create the one you want to put into the array. An example of invoking the two-argument constructor to create a complex number is the expression

complex<double>(1, 5)

which evaluates to the complex number 1+5i.

Yeah, I just tried it and it did not work.

using cout << complex<double>(1,5) does indeed output (1,5).

However, when I use
Code:
complex<double> a;
a = complex<double>(1,5);
cout << a;

I get (5,0). And when I use std::cout << (1, 5) << std::endl I still get (5,0)
 
Are you sure you doing it right? It works fine here.

Code:
#include <iostream>
#include <complex>

int main()
{
    std::cout << std::complex<double>(1.0, 5.0) << std::endl;

    std::complex<double>a[2];
    a[0] = std::complex<double>(2.0, 4.0);
    a[1] = std::complex<double>(3.0, 3.0);

    std::cout << a[0] << '\n' << a[1] << std::endl;

    std::complex<double> b;
    b = std::complex<double>(4.0, 2.0);
    std::cout << b << std::endl;

    return 0;
}
gives
(1,5)
(2,4)
(3,3)
(4,2)