Инициализировать комплекс & lt; double & gt; массив

Я пытаюсь решить систему сложных дифференциальных уравнений. Я хотел бы заполнить комплексный вектор xi [n] гауссовозначной функцией.
Но когда я проверяю выходной файл, он дает мне много нулей. Я дал входные значения с помощью функции cin, и она сработала … в чем проблема в этом коде ????

using namespace std;

int main()
{
int  n;
int tmax;
int tt = 5000;                   // number of first-order equations
double ti, tf, dt, sigma,mu,z,q,N ;
complex<double> xi[n], xf[n], eta[tt];
double  j;
int i, y,d;
int m=0;

ofstream file;
file.open ("provavet11(om100(2g))).dat");

printf("Number of equations\n");
scanf("%d", &n);
printf("Particles in central cav.\n");
scanf("%d", &N);
printf("Sigma\n");
scanf("%d", &q);
/* initial information */

ti = 0.0;
// initial value for variable t
for(y=0; y<=n-1; y++)
{
//scanf("%f\n", xi[y]);
//cin >> xi[2*y]
//   }
xi[y]=  N*exp(-pow((y-(n-1)/2.),2)/(2*q*q));
}

-2

Решение

Есть несколько вещей, которые являются предметом спора с вашим кодом.

Во-первых, вы используете n до его инициализации. Это может быть 0, 10, 323432, -234, кто знает.

int  n;
complex<double> xi[n], xf[n], eta[tt];  // <-- n is not initialized

Во-вторых, даже если n были инициализированы, это недопустимо в C ++ объявлять массивы, используя переменную в качестве числа записей. В C ++ «изменяющийся массив» выполняется с помощью std::vector,

#include <vector>

int main()
{
int  n;
int tmax;
int tt = 5000;                   // number of first-order equations
double ti, tf, dt, sigma,mu,z,q,N ;
std::vector<complex<double>> xi, xf, eta(tt);
//...
// Once `n` is read in and initialized:
xi.resize(n);
xf.resize(n);
//...
}

Третья проблема заключается в том, что вы закомментировали код, который определенно не работал бы правильно, независимо от того, использовали ли вы std::vector или нет:

  for(y=0; y<=n-1; y++)
{
//scanf("%f\n", xi[y]);
//cin >> xi[2*y]  // way out of bounds!

Предполагая, что вы хотите использовать закомментированный код, значение 2*y когда y превышает н / 2, хорошо выходит за границы вашего xi массив (или вектор). Это перезапись памяти. Вы должны убедиться, что xi достаточно большой, чтобы вместить все записи.

Редактировать:

Учитывая код, который вы разместили здесь: http://ideone.com/Eckq3Z

Вы должны сделать две вещи:

1) Изменить звонки в векторе с reserve() в resize(),

2) В dnx функция, передать vectorпо ссылке, а не по значению:

complex<double> dnx(double t, vector<complex<double> >& x, vector<complex<double> >& dx, int n)

Для второго элемента вы передаете вектор по значению, что означает, что параметр является временным и исчезнет, ​​как только функция вернется.

0

Другие решения


По вопросам рекламы [email protected]