Пример #1
0
void p5(void)
{
    char dataFileMat1[]="matrix.txt";
    double ** matrix=readMatrix(dataFileMat1);
    double ** L=choleskyDecomp(matrix, MATSIZE,0);
    printf("The cholesky decomposition of the matrix is: \n");
    printMatrix(L,MATSIZE);
    freeMatrix(L,MATSIZE);
}
Пример #2
0
// Perform least-squares minimization using the Levenberg-Marquardt algorithm.
int levmarq(int npar, double *par, int ny, double *y, double *dysq,	double *fdata)
{
	/*
	The arguments are as follows :

	npar    number of parameters
		par     array of parameters to be varied
		ny      number of measurements to be fit
		y       array of measurements
		dysq    array of error in measurements, squared
		(set dysq = NULL for unweighted least - squares)
		func    function to be fit
		grad    gradient of "func" with respect to the input parameters
		fdata   pointer to any additional data required by the function

	*/
	

	int x, i, j, it, nit, ill;
	double lambda, up, down, mult, weight, err, newerr, derr, target_derr;
	double h[npar*npar], ch[npar*npar];
	double g[npar], d[npar], delta[npar], newpar[npar];

	
	nit = MAX_IT;
	lambda = INIT_LAMBDA;
	up = UP_FACTOR;
	down = 1.0/(DOWN_FACTOR);
	target_derr = TARGET_DERR;
	weight = 1;
	derr = newerr = 0; /* to avoid compiler warnings */

	/* calculate the initial error ("chi-squared") */
	err = errorFunc(par, ny, y, dysq, fdata);

	/* main iteration */
	for (it = 0; it<nit; it++) {

#ifdef VERBOSE
			Serial.print("\niteration: ");
			Serial.println(it);
			Serial.print("err:");
			Serial.print(err);
			Serial.print("x:");
			Serial.print(par[0]);
			Serial.print("y:");
			Serial.print(par[1]);
			Serial.print("z:");
			Serial.println(par[2]);
			Serial.print("target derr is: ");
			Serial.println(target_derr);
			Serial.print("up is: ");
			Serial.println(up);
			Serial.print("down is: ");
			Serial.println(down);
#endif


		/* calculate the approximation to the Hessian and the "derivative" d */
		for (i = 0; i<npar; i++) {
			d[i] = 0;
			for (j = 0; j <= i; j++)
				h[i*npar + j] = 0;
		}
		for (x = 0; x<ny; x++) {
			if (dysq) weight = 1 / dysq[x]; /* for weighted least-squares */
			grad(g, par, x, fdata);
			for (i = 0; i<npar; i++) {
				d[i] += (y[x] - func(par, x, fdata))*g[i] * weight;
				for (j = 0; j <= i; j++)
					h[i*npar + j] += g[i] * g[j] * weight;
			}
		}

		/*  make a step "delta."  If the step is rejected, increase
		lambda and try again */
		mult = 1 + lambda;
		ill = 1; /* ill-conditioned? */
		while (ill && (it<nit)) {
			for (i = 0; i<npar; i++)
				h[i*npar + i] = h[i*npar + i] * mult;

			ill = choleskyDecomp(npar, ch, h);

			if (!ill) {
				solveAxBCholesky(npar, ch, delta, d);
				for (i = 0; i<npar; i++)
					newpar[i] = par[i] + delta[i];
				newerr = errorFunc(newpar, ny, y, dysq, fdata);
				derr = newerr - err;
				ill = (derr > 0);
			}

#ifdef VERBOSE
				Serial.println("New loop:");
				Serial.print("it = ");
				Serial.print(it);
				Serial.print("lambda = ");
				Serial.print(lambda,8);
				Serial.print("err = ");
				Serial.print(err,8);
				Serial.print("derr = ");
				Serial.println(derr,8);
				Serial.print("ill = ");
				Serial.println(ill);
#endif

			if (ill) {
				mult = (1 + lambda*up) / (1 + lambda);
				lambda *= up;
				it++;
			}
		}
		for (i = 0; i<npar; i++)
			par[i] = newpar[i];
		err = newerr;
		lambda *= down;

		if ((!ill) && (-derr<target_derr)) break;
	}

	return (it == nit);
}
int main(int argc, char *argv[]){

	char c;
	int n=0, m=0;

	init();

	FILE *fp=NULL;
	fp=fopen(argv[1],"r");			//Anoigma tou arxeiou
	if(fp==NULL){                           //Elegxos an to arxeio anoikse kanonika, alliws termatismos..
            printf("\nProblem opening file. Program terminated...\n");
            return -1;
        }		

//Diavasma xaraktira kai antistoixi leitourgia analoga me auton (Provlepsi gia grammi sxoliwn kai gia telos arxeiou)
	c=fgetc(fp);
	do{
		if(c=='V' || c=='v'){
			m++;
			creatVoltList(fp);
		}
		else if(c=='I' || c=='i'){
			creatAmberList(fp);
		}
		else if(c=='R' || c=='r'){
			creatResistanceList(fp);
		}
		else if(c=='C' || c=='c'){
			creatCapacitorList(fp);
		}
		else if(c=='L' || c=='l'){
                        m++;
			creatInductorList(fp);
		}
		else if(c=='D' || c=='d'){
			creatDiodeList(fp);
		}
		else if(c=='M' || c=='m'){
			creatMOSList(fp);
		}
		else if(c=='B' || c=='b'){
			creatBJTList(fp);
		}
		else if(c=='%'){ 
			c=fgetc(fp);
			while(c!='\n'&&(c!=EOF)){c=fgetc(fp);}/*MOVE TO NEXT LINE*/
		}
                else if(c=='.'){
			analysis(fp);
		}
		else{
			
		}
		if(c!=EOF){c=fgetc(fp);}
	}while(!feof(fp));

	fclose(fp);

        if(ground==0)
        {
	     printf("No ground node! Program terminated!");
             return -1;
        }
        else
        { 
             printVoltList(rootV);
             printAmperList(rootI);
             printResistanceList(rootR); 
             printCapacitorList(rootC);
             printInductorList(rootL);
             printDiodeList(rootD);
             printMosList(rootM);
             printBjttList(rootB);
       }
 
	n=count_nodes();
	printf("\n m=%d , n=%d \n\n", m, n);

	int size=0;
 
	size = (n-1)+m;

    if(sparse_option == 0){     
	gsl_matrix* pinakasA = gsl_matrix_calloc(size,size);
	gsl_vector* pinakasB = gsl_vector_calloc(size);
	
        fill_matrix_A(pinakasA, pinakasB, n);
	fill_matrix_B(pinakasB);
       
   	printf(" O pinakas A einai o: \n");
        print2DMatrix(pinakasA, size); 		
    	printf("\n O pinakas B einai o: \n");
    	print1DMatrix(pinakasB,size);
 
    	printf("\n");
        
        if(use_lu==1){
	    if(found_iter==1){
                call_bi_cg(pinakasA, pinakasB, size);
            } 
            else{
                luDecomp(pinakasA, pinakasB, size);
	    }
        }
        else if (use_cholesky==1){
            if (found_iter==1){
                 call_cg(pinakasA, pinakasB, size);
            }
            else{
                choleskyDecomp(pinakasA, pinakasB, size);
            }
        }
    }
    else {
	int i;

	cs* pinakasA_sparse = cs_spalloc(size,size,4*sparse_elements,1,1);

	double* pinakasB_sparse = (double *)calloc(size,sizeof(double));
	double* pinakasX_sparse = (double *)calloc(size,sizeof(double));	
	
	fill_sparse_matrix_A(pinakasA_sparse, pinakasB_sparse,n);
	cs* pinakasC_sparse = cs_compress(pinakasA_sparse);
	cs_spfree(pinakasA_sparse);
	cs_dupl(pinakasC_sparse);

 	if(use_lu==1){
	    if(found_iter==1){
                call_bi_cg_sparse(pinakasC_sparse, pinakasB_sparse, pinakasX_sparse, size);
            } 
            else{
                luDecomp_sparse(pinakasC_sparse, pinakasB_sparse, pinakasX_sparse, size);
	    }
        }
        else if (use_cholesky==1){
            if (found_iter==1){
                 call_cg_sparse(pinakasC_sparse, pinakasB_sparse, pinakasX_sparse, size);
            }
            else{
                choleskyDecomp_sparse(pinakasC_sparse, pinakasB_sparse, pinakasX_sparse, size);
            }
        }   
    }
    return 0;
}