E-school  di  Arrigo Amadori

Calcolo numerico


Sistema ruotante

Per maggiori informazioni :

        http://www.arrigoamadori.com/lezioni/Miscellanea/1/SistemaRuotante.htm .

 
 parametri del sistema :

 T  =
(periodo di rotazione del sistema ruotante)
 G  =
(costante di gravitazione universale)
 M  =
(massa attrattore gravitazionale centrale)
 ro =
(densità dell'atmosfera solidale con il sistema ruotante)
 k1 = (coeff. attrito del mezzo (per parte dipendente dalla velocità lineare))
 k2 = (coeff. attrito del mezzo (per parte dipendente dalla velocità al quadrato))
 
 parametri iniziali particella sferica :

  massa : raggio : posizione : velocità :
  x y z x y z
 particella :  


 parametri di iterazione :


 dt = (incremento tempo) ni = (numero iterazioni)

 parametri di scala :

 lar = alt = (larghezza ed altezza immagine in pixel)

 xa = 0         xb = (estremi asse x)
 ya = 0         yb = (estremi asse y)
 za = 0         zb = (estremi asse z)

 

Operatori ammessi : - (per numeri negativi)  . (per numeri decimali)


Sorgenti PHP :


sistemaruotante.php


<html>

<head>
<title>Sistema ruotante</title>
</head>

<body>

<script language="php">

error_reporting (E_ALL ^ E_NOTICE);

// parametri in input 
//
// $T = periodo rotazione
// $G = costante di gravitazione universale
// $M = massa attrattore gravitazionale centrale
// $ro = densità atmosfera
// $k1 = coeff. attrito del mezzo (per parte dipendente dalla velocità lineare)
// $k2 = coeff. attrito del mezzo (per parte dipendente dalla velocità al quadrato)
// particella : $x0 = posizione iniziale x $y0 = posizione iniziale y $z0 = posizione iniziale z 
// particella : $vx0 = velocità iniziale x $vy0 = velocità iniziale y $vz0 = velocità iniziale z 
// $m = massa particella 
// $r = raggio particella
// $lar = larghezza immgine in pixel
// $alt = altezza immagine in pixel
// $xb = fine dominio x
// $yb = fine dominio y
// $zb = fine dominio z
// $ni = numero iterazioni
// $dt = incremento tempo

//
// parametri in output
//
// crea l'immagine PNG e ne visualizza il link
//

// inserisce tutti gli include (funzioni esterne)

if (is_integer(strpos($SERVER_SOFTWARE, "Win")))
{
//include("..\Routines\derivataParz.php");
//include("..\Routines\daPowAVb.php");
//include("..\Routines\daVbAPow.php");
//include("..\Routines\derivataMonom.php");
//include("..\Routines\semplEspr.php");
}
else
{
//include("../Routines/derivataParz.php");
//include("../Routines/daPowAVb.php");
//include("../Routines/daVbAPow.php");
//include("../Routines/derivataMonom.php");
//include("../Routines/semplEspr.php");
}

// controlli vari

//if ($U == "")
//{
// echo "Attenzione !!! Manca l'energia potenziale !!!" . "<p>";
// return;
//}

// parametri di scala 

$xa = 0; // inizio dominio x
$ya = 0; // inizio dominio y
$za = 0; // inizio dominio z

$dx = ($xb - $xa) / ($lar / 2 - 1); // intervallo di scomposizione asse x 
$dy = ($yb - $ya) / ($lar / 2 - 1); // intervallo di scomposizione asse y 
$dz = ($zb - $za) / ($alt / 2 - 1); // intervallo di scomposizione asse z

$alfa = atan($lar / $alt); // angolo fra asse x e parte negativa asse z
$coeff = sqrt($lar*$lar/4+$alt*$alt/4)/$xb; // coefficiente prospettico

// disegno frame con coordinate 

$im = ImageCreate ($lar + 100, $alt + 100); 

$bianco = ImageColorAllocate ($im, 255, 255, 255);
$nero = ImageColorAllocate ($im, 0, 0, 0);
$rosso = ImageColorAllocate ($im, 255, 0, 0);
$verde = ImageColorAllocate ($im, 0, 255, 0);
$blu = ImageColorAllocate ($im, 0, 0, 255);

Imageline ($im, 0, 0, $lar, 0, $bianco);
Imageline ($im, 0, $alt, $lar, $alt, $bianco);
Imageline ($im, 0, 0, 0, $alt, $bianco);
Imageline ($im, $lar, 0, $lar, $alt, $bianco);

Imageline ($im, $lar / 2, 0, $lar / 2, $alt / 2, $nero);
Imageline ($im, $lar / 2, $alt / 2, $lar, $alt / 2, $nero);
Imageline ($im, $lar / 2, $alt / 2, 0, $alt, $nero);


ImageString ($im, 1, $lar / 2, $alt / 2 + 10, $xa, $nero);
ImageString ($im, 1, 0, $alt + 10, $xb . " (x)" , $nero);
ImageString ($im, 1, $lar / 2 + 10, $lar / 2 - 10, $ya, $nero);
ImageString ($im, 1, $lar + 10, $alt / 2 - 10, $yb . " (y)", $nero);
ImageString ($im, 1, $lar / 2 - 10, $lar / 2 - 10, $za, $nero);
ImageString ($im, 1, $lar / 2 - 10, 0, $zb . " (z)", $nero);

ImageString ($im, 2, 0, $alt + 30, "T = " . $T . " G = " . $G . " M = " . $M . " ro = " . $ro . " k1 = " . $k1 . " k2 = " . $k2 . " m = " . $m . " r = " . $r, $nero);

ImageString ($im, 2, 0, $alt + 50, "Valori iniziali : x = " . $x0 . " y = " . $y0 . " z = " . $z0 . " vx = " . $vx0 . " vy = " . $vy0 . " vz = " . $vz0 . " R = " . sqrt($x0*$x0+$y0*$y0+$z0*$z0) . " v = " . sqrt($vx0*$vx0+$vy0*$vy0+$vz0*$vz0), $nero);

$omega = 6.28 / $T;

$cost = $G*$M*((4/3)*3.14*$r*$r*$r*$ro/$m - 1);

$fx = "$m*($cost*(\$x)/pow((\$x)*(\$x)+(\$y)*(\$y)+(\$z)*(\$z),3/2)-((\$vx)/$m)*($k1+$k2*sqrt((\$vx)*(\$vx)+(\$vy)*(\$vy)+(\$vz)*(\$vz)))+2*$omega*(\$vy)+$omega*$omega*(\$x))";

$fy = "$m*($cost*(\$y)/pow((\$x)*(\$x)+(\$y)*(\$y)+(\$z)*(\$z),3/2)-((\$vy)/$m)*($k1+$k2*sqrt((\$vx)*(\$vx)+(\$vy)*(\$vy)+(\$vz)*(\$vz)))-2*$omega*(\$vx)+$omega*$omega*(\$y))";

$fz = "$m*($cost*(\$z)/pow((\$x)*(\$x)+(\$y)*(\$y)+(\$z)*(\$z),3/2)-((\$vz)/$m)*($k1+$k2*sqrt((\$vx)*(\$vx)+(\$vy)*(\$vy)+(\$vz)*(\$vz))))";

//echo $fx . "<p>";
//echo $fy . "<p>";
//echo $fz . "<p>";

// settaggio matrici valori iniziali

$u0["x"] = $x0; $u0["y"] = $y0; $u0["z"] = $z0; // posizioni

$v0["x"] = $vx0; $v0["y"] = $vy0; $v0["z"] = $vz0; // velocità

$t = 0;
for ($ii = 1; $ii <= $ni; $ii++) // iterazione
{
$t = $t + $dt; 

// disegna posizione particella

$x = $u0["x"]; 
$y = $u0["y"]; 
$z = $u0["z"];
if ($x >= -$xb and $x <= $xb and $y >= -$yb and $y <= $yb and $z >= -$zb and $z <= $zb)
{
$xx = $x - $xa;
$yy = $lar / 2 + (($y - $ya)) / $dy;
$zz = $alt / 2 - (($z - $za)) / $dz;
$zz1 = $alt / 2 - ((0 - $za)) / $dz;
$yyy = $yy - $coeff * $xx * sin($alfa);
$zzz = $zz + $coeff * $xx * cos($alfa);
$zzz1 = $zz1 + $coeff * $xx * cos($alfa);
//Imageline ($im, $yyy, $zzz, $yyy, $zzz1, $nero);
Imageline ($im, $yyy, $zzz, $yyy, $zzz, $nero);
}

// calcolo accelerazioni 

$vx = $v0["x"]; 
$vy = $v0["y"]; 
$vz = $v0["z"];

eval("\$ff = @($fx);");
$w0["x"] = $ff / $m;
eval("\$ff = @($fy);");
$w0["y"] = $ff / $m;
eval("\$ff = @($fz);");
$w0["z"] = $ff / $m;

// calcolo velocità dopo $dt

$v1["x"] = $v0["x"] + $w0["x"] * $dt;
$v1["y"] = $v0["y"] + $w0["y"] * $dt;
$v1["z"] = $v0["z"] + $w0["z"] * $dt;

// calcolo posizioni dopo $dt

$u1["x"] = $u0["x"] + $v0["x"] * $dt;
$u1["y"] = $u0["y"] + $v0["y"] * $dt;
$u1["z"] = $u0["z"] + $v0["z"] * $dt;

// reset

$u0["x"] = $u1["x"]; $u0["y"] = $u1["y"]; $u0["z"] = $u1["z"]; 
$v0["x"] = $v1["x"]; $v0["y"] = $v1["y"]; $v0["z"] = $v1["z"]; 

}

echo "Valori finali : x = " . $u1["x"] . " y = " . $u1["y"] . " z = " . $u1["z"] . 
" R = " . sqrt($u1["x"]*$u1["x"]+$u1["y"]*$u1["y"]+$u1["z"]*$u1["z"]) . "<p>"; 

echo "Valori finali : vx = " . $v1["x"] . " vy = " . $v1["y"] . " vz = " . $v1["z"] . 
" v = " . sqrt($v1["x"]*$v1["x"]+$v1["y"]*$v1["y"]+$v1["z"]*$v1["z"]) . "<p>";

// disegna immagine

$nomefile = $REMOTE_ADDR;
$nomefile = "grafico" .str_replace(".", "-", $nomefile). ".png";

ImagePng ($im, $nomefile); 

echo "&nbsp;<p>";
echo "&nbsp;<p>";
echo "&nbsp;<p>";
echo "&nbsp;<p>";

echo "<a href='$nomefile'>Visualizza il grafico</a>";

</script>

</body>

</html>

</html>