// // Amplia la Math per fare calcoli con numeri complessi // // Somma di due numeri complessi ossia a e b // definibili sia come semplici numeri reali, sia // come array di due elementi, il primo la // parte reale e il secondo il coefficiente della // unita' immaginaria solitamente indicata da i // ( wxMaxima la chiama %i ) dove i=sqrt(-1). // Math.csum=function(a,b){ var ar=0,ai=0,br=0,bi=0,boh=false; if(Array.isArray(a)){ if(a.length>0)ar=a[0]; else{return[0,0]}; if(a.length>1)ai=a[1];} else{ar=a;ai=0;} if(Array.isArray(b)){ if(b.length>0)br=b[0]; else{return[0,0]}; if(b.length>1){bi=b[1];} } else{br=b;bi=0;} return [ar+br,ai+bi]; } // // Prodotto di due numeri complessi. Se a o b // sono dei semplici numeri reali si assume che // i coefficienti della unita' immaginaria i=sqrt(-1) // siano nulli. // Math.cper=function(a,b){ var ar=0,ai=0,br=0,bi=0,boh=false; if(Array.isArray(a)){ if(a.length>0)ar=a[0]; else{return[0,0]}; if(a.length>1)ai=a[1];} else{ar=a;ai=0;} if(Array.isArray(b)){ if(b.length>0)br=b[0]; else{return[0,0]}; if(b.length>1){bi=b[1];} } else{br=b;bi=0;} return [ar*br-ai*bi,ai*br+bi*ar]; } // // Elevamento a potenza del numero complesso a // elevato alla b. Se sono nulli i coefficienti // della unita' immaginaria si ha il tradizionale // elevamento a potenza della base a per l'esponente b. // Math.cpow=function(a,b){ var ar=0,ai=0,br=0,bi=0; var an,co,se,phr,phi,er,ei; if(Array.isArray(a)){ if(a.length>0)ar=a[0]; if(a.length>1)ai=a[1];} else{ar=a;} if(Array.isArray(b)){ if(b.length>0)br=b[0]; if(b.length>1){bi=b[1];} } else{br=b; if(ai==0){ if(0>ar){ai=Math.sqrt(-ar); ar=0;br=2*br;} else{return[Math.pow(ar,br),0]};}} an=1/Math.sqrt(ar*ar+ai*ai+1.0e-100); co=ar*an; se=ai*an; phi=Math.asin(se); if(0>co)phi=Math.PI-phi; phr=Math.log(1/an); er=Math.exp(br*phr-bi*phi); ei=br*phi+phr*bi; return [er*Math.cos(ei),er*Math.sin(ei)]; } // // Calcola l'inverso del numero a che puo' // essere reale o un numero complesso. // Math.cinv=function(a){ var b=[-1,0]; return Math.cpow(a,b); } // // Calcola la radice quadrata del numero a // che puo' essere reale o un numero complesso // ed a, se reale, puo' essere anche un numero // negativo la cui radice e' il coefficiente // della unita' immaginaria i=sqrt(-1). // Math.csqr=function(a){ var b=[1/2,0]; return Math.cpow(a,b); } // // Calcola la somma degli elementi della array va, // usando una funzione assegnata come primo argomento // ossia fu come funzione di peso degli elementi // della sommatoria. // L'argomento va deve essere una Array altrimenti // il risultato e' false. // Se fu non e' una funzione fa la sommatoria // senza moltiplicare per qualcosa gli elementi. // Math.sommapesata=function(fu,va){ var j,ff,sa=[0,0]; if(!Array.isArray(va))return false; if((typeof fu) === "function"){ for(j=0;va.length>j;j++){ ff=fu(j); if(Array.isArray(va[j])){ if(va[j].length>0)sa[0]+=ff*va[j][0]; if(va[j].length>1)sa[1]+=ff*va[j][1];} else{sa[0]+=ff*va[j]} }} else { for(j=0;va.length>j;j++){ if(Array.isArray(va[j])){ if(va[j].length>0)sa[0]+=va[j][0]; if(va[j].length>1)sa[1]+=va[j][1];} else{sa[0]+=va[j]} }} return sa; } // // Questa ultima funzione serve anche a ricordare che // si puo' passare in argomento ad una qualche function // anche una altra function il che e' utile per // certi calcoli come i Runge_Kutta... // Vedere http://www.elegio.it/omnia/as/as20140527.html // per esempio... //