#include // determiniamo la soluzione dell'equazione di Laplace // con il metodo del rilassamento (o di Gauss-Seidel) // all'interno di un sistema di conduttori quadrato a potenziali 0., 10. Volt // (a1=0) // soluzione analitica double EAnalitico(double x, double y, double dphi, double r_c, double r_w, double xc, double yc) { return (dphi / log(r_c/r_w))/sqrt( (x-xc)*(x-xc)+(y-yc)*(y-yc) ); } double phiAnalitico(double x, double y, double dphi, double r_c, double r_w, double xc, double yc) { return (500. - (dphi / log(r_c/r_w))*log( sqrt( (x-xc)*(x-xc)+(y-yc)*(y-yc) )/r_w )); } void CondCilindrico(int iMethod=-1, double omega=1.) { if (iMethod==-1) { std::cout<<"Argomento di ingresso non specificato. "<>> errore max 185 // Gauss Seidel 0.05 e 50000 ==>>> errore max 175 // Gauss Seidel 0.05 e 50000, omega = 0.9 ==>>> errore max 176.5 gStyle->SetOptStat(0); // estremi della regione da esplorare double a1=0.,a2=22.,b1=0.,b2=22.; // Passo per la discretizzazione //double h = 0.025; double h = 0.05; int k=0; // step double var=0; // variazione massima rispetto allo step precedente double varrel=0; // variazione relativa massima rispetto allo step precedente double localvar=0; // variazione locale rispetto allo step precedente double localvarrel=0; // variazione relativa locale rispetto allo step precedente // costruiamo un istogramma che istrogramma conterrą ad ogni passo k l'evoluzione del potenziale // i sui estremi e il numero di bin dipendono dalla regione da analizzare // questo istogramma mi serve per aggiornare la mappa del potenziale bin per bin ad ogni iterazione (Gauss Seidel) int nbinx=1+(a2-a1)/h; int nbiny=1+(b2-b1)/h; bool enableMatrix[1000][1000] = {false}; std::cout<<"estremi della regione in x "<GetName()<<" created"<SetBinContent(cx,cy,Vfilo); h2tmpold->SetBinContent(cx,cy,Vfilo); TH2D* hsa = (TH2D*)h2tmp->Clone(); hsa->SetTitle("Soluzione Analitica"); double sa=0; double xcenter = h2tmp->GetXaxis()->GetBinCenter(cx); double ycenter = h2tmp->GetYaxis()->GetBinCenter(cy); std::cout<<" bin del filo centrale, cx, cy = "<GetXaxis()->GetBinCenter(k); ybin = h2tmp->GetYaxis()->GetBinCenter(j); dist2 = (xbin-xcenter)*(xbin-xcenter)+(ybin-ycenter)*(ybin-ycenter); //if (j==300) std::cout<<"k,j "<SetBinContent(j,k,Vparete); h2tmpold->SetBinContent(j,k,Vparete); firstInRow=false; } else if (sqrt(dist2)SetBinContent(k,j,sa); h2tmp->SetBinContent(j,k,Vparete); h2tmpold->SetBinContent(j,k,Vparete); } } if (!firstInRow)std::cout<Clone(); hcc->Draw("zcol"); // disegno la soluzione analitica TCanvas* Csa = new TCanvas("Csa","Soluzione analitica",800,800); hsa->Draw("zcol"); //return; // Valore usato per la costante di rilassamento double w=1.; if (iMethod==1) w=omega; // rilassamento applicato solo in caso di metodo Gauss-Seidel // procedura a numero di step fisso int NStep=50000; int ihisto= 0; double V_imj =0.; double V_ipj =0.; double V_ijm =0.; double V_ijp =0.; /// iterazioni ... for (k=1; kSetBinContent(i,j,h2tmpold->GetBinContent(i,j)); } } var=0; /// variazione assoluta massima sulla griglia di discretiozzazioma tra iterazione k e k-1 localvar=0.; varrel=0; /// variazione relativa massima sulla griglia di discretiozzazioma tra iterazione k e k-1 localvarrel=0.; double errore_max = 0.; double errore_loc = 0.; for (int j=2;jGetBinContent(i,j); if (iMethod==0) { // Jacobi V_imj =h2tmpold->GetBinContent(i-1,j); V_ipj =h2tmpold->GetBinContent(i+1,j); V_ijm =h2tmpold->GetBinContent(i,j-1); V_ijp =h2tmpold->GetBinContent(i,j+1); } else{ // Gauss-Seidel V_imj =h2tmp->GetBinContent(i-1,j); V_ipj =h2tmp->GetBinContent(i+1,j); V_ijm =h2tmp->GetBinContent(i,j-1); V_ijp =h2tmp->GetBinContent(i,j+1); } double V_ij =(V_imj+V_ipj+V_ijm+V_ijp)/4.; //Gauss-Seidel + Rilassamento if (iMethod==1) V_ij = w*V_ij + (1.-w)*V_ij_old; h2tmp->SetBinContent(i,j,V_ij); localvar=fabs(V_ij-V_ij_old); errore_loc = fabs(V_ij - hsa->GetBinContent(i,j)); if (errore_loc>errore_max) errore_max = errore_loc; if (fabs(V_ij)>1.E-6) localvarrel=fabs((V_ij-V_ij_old)/V_ij); if (localvar >var ) var =localvar ; if (localvarrel>varrel) varrel=localvarrel; } } if ((k-1)%100==0) std::cout<<"iterazione k = "<Write(); ihisto++; } } // soluzione finale TCanvas* Csoluzione = new TCanvas("Csol","soluzione",800,800); h2tmp->Draw("ZCOL"); // // Apro file TFile * f=new TFile("Esempio1.root","RECREATE"); for (int i=0; i<11; ++i) { h2[i]->Write(); std::cout<<"Histogram named "<GetName()<<" saved on file"<Write(); std::cout<<"Histogram named "<GetName()<<" saved on file"<Close(); }