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); }
// 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; }