예제 #1
0
int jacobi_method(double **A, double **R, int n)
{
    int iterations = 0;
    int k, l;
    double eps = 1.0e-8;
    double max_off = max_off_diag(A, &k, &l, n);
    double max_number_iterations = (double) n * (double) n * (double) n;
    while (max_off*max_off > eps && (double) iterations < max_number_iterations) {
        rotate(A, R, k, l, n);
        max_off = max_off_diag(A, &k, &l, n);
        iterations++;
    }
    return iterations;
}
예제 #2
0
파일: main.cpp 프로젝트: hmvege/Fys3150
int main(int argc, char *argv[])
{
	// if (length(argv)<3)
	// {
	// 	exit();
	// }
	// int N = atoi(argv[1]);
	// double rho_max = atof(argv[2]);
	
	int iterations = 0;
	int max_iterations = 1000000; // Around 40 iterations gives the 3 lowest eigenvalues with 4 leading digits
	int N = 200;
	double eps = 1e-8;

	//// Constants for length of the radius we are looking at
	double rho_max = 5.0; // Max value, should be alittle above max V(rho), rhomax = sqrt(lambda_highest*2)
	double rho_min = 0.0;
	double h = (rho_max-rho_min)/(N+1);

	//// Setting up A and R ////
	double ** A = new double*[N]; // Pointer to pointer
	double ** R = new double*[N];
	for (int i = 0; i < N; i++)
	{
		A[i] = new double[N];
		R[i] = new double[N];
	}

	//// Setting up V ////
	double * V = new double[N];
	for (int i = 1; i < N+1; i++)
	{
		V[i-1] = (i*h)*(i*h); // rho[i]**2
	}

	//// Giving A values ////
	double h_marked = 1.0/(h*h);
	for (int i = 0; i < N-1; i++)
	{
		A[i][i] = 2.0*h_marked + V[i];
		A[i][i+1] = -h_marked;
		A[i+1][i] = -h_marked;
	}
	A[N-1][N-1] = 2.0*h_marked + V[N-1];

	//// Giving R values ////
	for (int i = 0; i < N; i++)
	{
		for (int j = 0; j < N; j++)
		{
			R[i][j] = 0.0;
		}
		R[i][i] = 1.0;
	}

	printMatlabMatrix(A,N);

	// jacobis_method(A,R,N,&iterations, &max_iterations, eps);

	//// setting up k,l element number ////
	int k;
	int l;

	//// Running the algorithm ////
	double maxoffdiag = max_off_diag(A, &k, &l, N);

	while (maxoffdiag > eps && iterations < max_iterations)
	{
		maxoffdiag = max_off_diag(A, &k, &l, N);
		rotate(A,R,k,l,N);
		iterations++;
	}

	checkIterations(iterations,max_iterations);

	//// Writing eigenvalues and eigenvectors to files
	writeEigVal(A,N,rho_max,iterations);
	writeEigVec(R,N);

	//// Deallocation of memory ////
	for (int i = 0; i < N; i++)
	{
		delete [] R[i];
		delete [] A[i];
	}
	delete [] A;
	delete [] R;
	delete [] V;
}
예제 #3
0
파일: main.cpp 프로젝트: hmvege/Fys3150
int main(int argc, char *argv[])
{
    // Retrieving constants from command line ======================================
    int N = atoi(argv[1]);				// Integration points/resolution
    double rho_min = atof(argv[2]);		// Start radius
    double rho_max = atof(argv[3]);		// End radius, should be alittle above max V(rho), rhomax = sqrt(lambda_highest*2)
    double omega_r = atof(argv[4]);		// Omega_r constant
    int omega_index = atoi(argv[5]);	// Omega index(for saving file)
    std::string folder_path = argv[6];	// Folder path

    // Setting up iteration limits =================================================
    int iterations = 0;
    int max_iterations = 1e7; 			// Around 40 iterations gives the 3 lowest eigenvalues with 4 leading digits
    double eps = 1e-8;

    // "Width" of integration point ================================================
    double h = (rho_max-rho_min)/(N+1);

    // Setting up A and R ==========================================================
    double ** A = new double*[N];		// Pointer to pointer
    double ** R = new double*[N];
    for (int i = 0; i < N; i++)
    {
        A[i] = new double[N];
        R[i] = new double[N];
    }

    // Setting up V ================================================================
    double * V = new double[N];

    for (int i = 1; i < N+1; i++)
    {
        V[i-1] = (i*h)*(i*h)*omega_r*omega_r + 1.0/(i*h);
    }

    // Giving A values =============================================================
    double h_marked = 1.0/(h*h);
    for (int i = 0; i < N-1; i++)
    {
        A[i][i] = 2.0*h_marked + V[i];
        A[i][i+1] = -h_marked;
        A[i+1][i] = -h_marked;
    }
    A[N-1][N-1] = 2.0*h_marked + V[N-1];

    // Giving R values =============================================================
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < N; j++)
        {
            R[i][j] = 0.0;
        }
        R[i][i] = 1.0;
    }

    // setting up k,l element number ===============================================
    int k;
    int l;

    // Running the algorithm =======================================================
    double maxoffdiag = max_off_diag(A, &k, &l, N);

    while (maxoffdiag > eps && iterations < max_iterations)
    {
        rotate(A,R,k,l,N);
        maxoffdiag = max_off_diag(A, &k, &l, N);
        iterations++;
    }

    // Checking if we have exceeded our max iteration bound or not =================
    checkIterations(iterations,max_iterations);

    // Writing eigenvalues and eigenvectors to files ===============================
    writeEigVal(A,N,rho_max,rho_min,iterations,eps,omega_r,omega_index,folder_path);
    writeEigVec(R,N,omega_index,folder_path);

    // Deallocation of memory ======================================================
    for (int i = 0; i < N; i++)
    {
        delete [] R[i];
        delete [] A[i];
    }
    delete [] A;
    delete [] R;
    delete [] V;
}