// // Ecco come va fatto il file del Web Worker // che spedisce, al file che lo attiva, // i risultati ottenuti usando // la function postMessage(calcolo) // // // Riceve l'ordine dal file che attiva il Web Worker // var $calcolo=0; var $ricevuto=-1,$attesa=1; onmessage=function(eccoqua){ $ricevuto=eccoqua.data } // // ================================================ // // Operazioni algebriche tradizionali // var $_1_={versione:20170619,br:"\u003cbr/\u003e"} // // Stampa un vettore // $_1_["vedov"]=function(ve){ var k,n,ss=[]; if(!Array.isArray(ve)) return ve; n=ve.length;for(k=0;n>k;k++){ if(Array.isArray(ve[k])){ ss[k]=$_1_.vedov(ve[k])} else{ss[k]=ve[k];}} return "["+ss.join(", ")+"]"; } // // Stampa le matrici come tabelle per cui l'ordine // di una matrice non puo' essere molto grande. // Matrici piccole sono spesso usate nel calcolo // tensoriale. // $_1_["vedom"]=function(ma){ var j,n,sm; var xtab="\u003ctable border='1' style="+ "'display:inline-block;vertical-align:middle'\u003e"; var ytab="\u003c/table\u003e"; var xtr="\u003ctr\u003e",ytr="\u003c/tr\u003e"; var xtd="\u003ctd\u003e",ytd="\u003c/td\u003e"; if(!Array.isArray(ma)){return "("+ma+")"} n=ma.length; for(j=0;n>j;j++){if(!Array.isArray(ma[j])){ return $_1_.vedov(ma);} if(ma[j].length!=n){return $_1_.vedov(ma);}} sm=xtab; for(j=0;n>j;j++)sm+=xtr+xtd+ma[j].join(ytd+xtd)+ytd+ytr; return sm+ytab; } // // Traspone la matrice assegnata e fatta tradizionalmente // usando due indici. // $_1_["traspmat"]=function(ma){ var j,k,mr=[],n=ma.length; for(j=0;n>j;j++){mr[j]=[[]]; for(k=0;n>k;k++)mr[j][k]=ma[k][j];} return mr;} // // Moltiplica tra loro due matrici tradizionali. // $_1_["matmul"]=function(ma,mb){ var j,h,k,n,mm,mr=[]; n=Math.min(ma.length,ma.length); for(j=0;n>j;j++){mr[j]=[[]]; for(h=0;n>h;h++){mm=0; for(k=0;n>k;k++)mm+=ma[j][k]*mb[k][h]; mr[j][h]=mm;} } return mr;} // // Calcola l'inversa di una matrice di ordine // non molto elevato perche' questo algoritmo // e' semplice ma piuttosto costoso: // $_1_["fainv"]=function(mat){ var minore,xmino=function(mat,r,c){ var j,jn=0,k,kn,id=[],ord=mat.length; for(j=0;ord>j;j++){if(j!=r){ kn=0; id[id.length]=[]; for(k=0;ord>k;k++){ if(k!=c){id[jn][kn]=mat[j][k]; kn++;} } jn++;} }; return id; } var xdet=function(mat){ var j,ord=mat.length,pm=1,dd=0; if(ord==1){dd=mat[0][0]; return dd;}; for(j=0;ord>j;j++){mm=xmino(mat,0,j); dd+=pm*mat[0][j]*xdet(mm);pm=-pm;} return dd; } var j,k,m,d,id=[],ord=mat.length; d=1/xdet(mat); for(j=0;ord>j;j++){m=d*(1-2*(j%2)); id[id.length]=[]; for(k=0;ord>k;k++){ minore=xmino(mat,k,j); id[j][k]=m*xdet(minore); m=-m;} } return id;} // // Fa la combinazione lineare di due matrici tradizionali. // $_1_["mcomb"]=function(ca,ma,cb,mb){ var j,k,md=[]; var nd=Math.min(ma.length,mb.length); for(j=0;nd>j;j++){md[j]=[]; for(k=0;nd>k;k++)md[j][k]= ca*ma[j][k]+cb*mb[j][k];} return md;} // // Fa la combinazione lineare di due vettori tradizionali // senza dunque distinzione tra vettori covarianti e // vettori controvarianti. // $_1_["vcomb"]=function(ca,va,cb,vb){ var j,nd,vc=[]; nd=Math.min(va.length,vb.length); for(j=0;nd>j;j++){ vc[j]=ca*va[j]+cb*vb[j];} return vc;} // // Fa il prodotti di matrice per vettore entrambi // tradizionali ( a due indici la matrice e con uno // solo il vettore ). // $_1_["matvet"]=function(ma,ve){ var j,k,vr=[],n=ma.length; for(j=0;n>j;j++){ vr[j]=0; for(k=0;n>k;k++){ vr[j]+=ma[j][k]*ve[k];}} return vr;} // // Fa il prodotto scalare di due vettori. // In campo tensoriale uno dovrebbe essere // covariante e l'altro controvariante // ossia uno premoltiplicato per un tensore metrico // ma qui sono trattati in modo tradizionale. // $_1_["vetvet"]=function(vea,veb){ var j,sca=0,n; n=Math.min(vea.length,veb.length); for(j=0;n>j;j++)sca+=vea[j]*veb[j]; return sca;} // // Moltiplica le componenti del vettore per lo // scalare sc entrambi tradizionali. // $_1_["vesca"]=function(sc,ve){ var j,vr=[],n=ve.length; for(j=0;n>j;j++)vr[j]=sc*ve[j]; return vr;} // // Fa a caso un vettore // $_1_["vrandom"]=function(nor){ var j,vr=[],n=Math.max(3,Math.round(nor)); for(j=0;n>j;j++){ vr[j]=Math.round(2000*Math.random())-1000;} return vr; } // // Fa a caso una matrice // $_1_["mrandom"]=function(nor){ var j,k,mr=[],n=Math.max(3,Math.round(nor)); for(k=0;n>k;k++){mr[k]=[];for(j=0;n>j;j++){ mr[k][j]=Math.round(2000*Math.random())-1000;}} return mr; } // // Fa la somma dei valori assoluti di una matrice degli // elementi diagonali e di tutti gli altri // $_1_["mabs"]=function(mt){ var j,k,mab=0,dab=0,n=mt.length; for(k=0;n>k;k++){for(j=0;n>j;j++){ if(k==j){dab+=Math.abs(mt[k][j])} else{mab+=Math.abs(mt[k][j])} } } return [dab,mab]; } // function $fammi(nord){ var vc,mc,mic,mid,asso,nd; nd=Math.min(10,Math.round(nord)); nd=Math.max(nd,3); with($_1_){ // Fa la matrice di ordine nd a caso: mc=mrandom(nd); postMessage([$calcolo,"Ha creato la matrice di "+ "ordine "+nd+" Ci mette tanto a fare l'inversa !"]); mic=fainv(mc); mid=matmul(mc,mic); asso=mabs(mid);} return [0,") Ordine",nd,") Sommatoria I diag. ",asso[0], ") Sommatoria I non diag. "+asso[1]]; } // function ContaPassi() { var calcolo; if(1>$ricevuto){ setTimeout("ContaPassi()",$attesa);} else{$attesa=4000; calcolo=$fammi($ricevuto); calcolo[0]=$calcolo; $calcolo++; postMessage(calcolo); setTimeout("ContaPassi()",$attesa);}} // ContaPassi(); //