Я пытаюсь решить систему сложных дифференциальных уравнений. Я хотел бы заполнить комплексный вектор 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));
}
Есть несколько вещей, которые являются предметом спора с вашим кодом.
Во-первых, вы используете 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)
Для второго элемента вы передаете вектор по значению, что означает, что параметр является временным и исчезнет, как только функция вернется.