// // Rungekutta ODE da integrare. // opzionivalide=[0,1,2,3]; // _____________________________________________ // // In cosa consiste l'opzione 0 // // Problema del moto piano gravitazionale. // function variabili0(){ return 5; } function bloccodati0(){ return 10; } // // Il sistema di equazioni da integrare... // function sisder0(y,kr,ki){ var c; y[kr] = 1; y[kr+1] = y[ki+3]; y[kr+2] = y[ki+4]; c = - Math.pow( y[ki+1]*y[ki+1] + y[ki+2]*y[ki+2] + 1.e-50, -1.5 ); y[kr+3] = c*y[ki+1]; y[kr+4] = c*y[ki+2]; } // // Il vettore titolini[ ] contiene le didascalie mentre // il vettore valorini[ ] contiene i dati di inizializzazione // function promaschera0(){ titolini[0]="Eccentricità dell'orbita"; valorini[0]=0.7; titolini[1]="Anomalia eccentrica finale ( all'incirca il tempo finale )"; valorini[1]="2*PI"; // alert("Esce da promaschera0()"); } // // Usa il vettore valorini[ ] per impostare i dati iniziali // del sistema di ODE. // Per effettuare l'inizializzazione si possono definire variabili // e function ausiliarie. In questo caso la variabile ecce e // il vettore analitico[ ] costruito tramite la function vero // var ecce=0.8; var analitico=[0]; function vero(ecce,eta){ // calcola la soluzione analitica per una data eccentricita' // ed una data anomalia eccentrica. var yv=[0]; yv[0]=eta-ecce*Math.sin(eta); yv[1]=Math.cos(eta)-ecce; yv[2]=Math.sin(eta)*Math.sqrt(1-ecce*ecce); yv[3]=-Math.sin(eta)/(1-ecce*Math.cos(eta)); yv[4]=Math.cos(eta)*Math.sqrt(1-ecce*ecce)/(1-ecce*Math.cos(eta)); return yv; } // function sistemazione0(){ if(valorini[0]>=0){if(1>valorini[0]) ecce=valorini[0];}; tfin=valorini[1]; analitico=vero(ecce,tfin); tfin=analitico[0]; // alert("Esce da sistemazione0"); } // // Inizializza le derivate e specifica quali vuole stampare // specificando gli elementi del vettore instampa[ ]. // function inider0(y){ y[0]= 0; y[1]= 1-ecce; y[2]= 0; y[3]= 0; y[4]= Math.sqrt((1+ecce)/(1-ecce)); instampa=[0,1,4]; // ossia stampa le variab. 0, 1 e 4. } // // Fattore per amplificare o smorzare la precisione richiesta // per ciascuna variabile. // function iniprec0(){ y[1]=1; y[2]=1; y[3]=1; y[4]=1; } // // Calcoli finali di controllo. // Vengono aggiunti dopo i dati dell'ultimo passo. // // function confronti0(y){ var j,ff=""; if(1>opzione){ ff+=xlt+"br/>Soluzione esatta : "; for(j=0;instampa.length>j;j++) ff+=" y["+(instampa[j]%n_var)+"]= "+ analitico[instampa[j]%n_var]+" ;"; } return ff; } // // Per debuggare eventualmente i primi passi di calcolo. // function fapausa0(y){ // stampa solo stringhe piu' lunghe di tre caratteri. // se il risultato è una stringa di 0 o 1 carattere // non verra' piu' chiamata. return "0"; } // _______________________________________ // // In cosa consiste l'opzione 1 // // function sisder1(y,kr,ki){ y[kr]=1; y[kr+1]=-Math.PI*Math.PI*y[ki+2]; y[kr+2]=y[ki+1]; } // function variabili1(){ return 3; } function bloccodati1(){ return 10; } // function promaschera1(){ titolini[0]="Tempo di fine simulazione"; valorini[0]=2; // alert("Esce da promaschera1()"); } // function sistemazione1(){ tfin=valorini[0]; // alert("Esce da sistemazione1"); } // function inider1(y){ y[0]= 0; y[1]= 0; y[2]= 1; instampa=[0,1,2]; // ossia stampa le variab. 0, 1 e 2. } // function iniprec1(y){ y[1]=1; y[2]=1; } // function confronti1(y){ var ff="Con valori di y[0] dispari deve essere y[1]=0 e y[2]=-1 "+ " se pari allora y[2]=1 "; return ff; } // // Per debuggare eventualmente i primi passi di calcolo. // function fapausa1(y){ // stampa solo stringhe piu' lunghe di tre caratteri. // se il risultato è una stringa di 0 o 1 carattere // non verra' piu' chiamata. return "0"; } // // ________________________________________ // // In cosa consiste l'opzione 2 // var espofun=3; function sisder2(y,kr,ki){ y[kr]=1; y[kr+1]=espofun*Math.pow(y[ki],espofun-1); } // function variabili2(){ return 2; } function bloccodati2(){ return 10; } // function promaschera2(){ titolini[0]="Tempo di fine simulazione"; valorini[0]=2; titolini[1]="Esponente della soluzione"; valorini[1]=2; // alert("Esce da promaschera2()"); } // function sistemazione2(){ tfin=valorini[0]; espofun=valorini[1]; // alert("Esce da sistemazione2"); } // function inider2(y){ y[0]= 1; y[1]= 1; instampa=[0,1]; // ossia stampa le variab. 0 e 1. } // function iniprec2(y){ y[1]=1; } // function confronti2(y){ var ff="Dovrebbe ottenere : "+Math.pow(tfin,espofun); return ff; } // // Per debuggare eventualmente i primi passi di calcolo. // function fapausa2(y){ // stampa solo stringhe piu' lunghe di tre caratteri. // se il risultato è una stringa di 0 o 1 carattere // non verra' piu' chiamata. return "0"; } // // _________________________________________ // // In cosa consiste l'opzione 3 // var formula; function sisder3(y,kr,ki){ var t=y[ki]; y[kr]=1; with(Math){ y[kr+1]=eval(formula); } } // function variabili3(){ return 2; } function bloccodati3(){ return 10; } // function promaschera3(){ titolini[0]="Tempo di inizio simulazione"; valorini[0]=0; titolini[1]="Tempo di fine simulazione"; valorini[1]=2; titolini[2]="funzione integranda rispetto a t "+ "( la variabile di integrazione deve chiamarsi t e "+ "deve essere presente nell'espressione della funzione integranda )"; valorini[2]="0.5+4*pow(t,3)" // alert("Esce da promaschera3()"); } // function sistemazione3(){ with(Math){ tfin=valorini[1]; } formula=valorini[2]; // alert("Esce da sistemazione3 "+formula); } // function inider3(y){ with(Math){ y[0]= valorini[0]; } y[1]= 0; instampa=[0,1]; // ossia stampa le variab. 0 e 1. // alert("in inider3 formula "+formula); } // function iniprec3(y){ y[1]=1; } // function confronti3(y){ var ff="Dovrebbe ottenere l'integrale tra t= "+valorini[0]+ " e t= "+valorini[1]+" della funzione : "+valorini[2]; return ff; } // // Per debuggare eventualmente i primi passi di calcolo. // function fapausa3(y){ // stampa solo stringhe piu' lunghe di tre caratteri. // se il risultato è una stringa di 0 o 1 carattere // non verra' piu' chiamata. return "0"; } // // __________________________________________ //