E-school  di  Arrigo Amadori

Calcolo numerico 


Campo vettoriale in R2

 Il campo vettoriale è dato da :

          . 

 a = a(u, v) =
 b = b(u, v) =


traiettoria :

 L'equazione della traiettoria è :  

        .

parametri :

 u0 =  (valore iniziale di u)
 v0 =  (valore iniziale di v)
 dt = (incremento parametro t)
 ni = (numero iterazioni)


 flusso :

 Ogni punto della "curva da trasformare" diventa punto iniziale di una traiettoria del campo iterata di un valore    costante dato. 

 L'insieme dei punti finali di ogni traiettoria così iterata forma la "curva trasformata" dal flusso del campo vettoriale. 

parametri :

 Curva da trasformare :

 u = u(t) =  
 v = v(t) =  

 ta =    tb = (estremi parametro t) dt = (incremento parametro t)

 iterazione traiettoria per flusso :

 dt  = (incremento parametro t)
 ni  = (numero iterazioni)
 nt  = (numero traiettorie da visualizzare)


parametri immagine :

 lar = alt = (larghezza ed altezza immagine in pixel)
 ua  = ub  = (estremi asse u)
 va  = vb  = (estremi asse v)


 

 


Regole :

 1 - le variabili ammesse sono quelle indicate nella varie funzioni
 2 - gli operatori aritmetici ammessi sono : +, -, *, /
 3 - non devono esistere spazi bianchi all'interno della funzione 
 4 - usare solo le parentesi tonde
 5 - per i numeri decimali oltre lo zero utilizzare il punto (.)
 6 - le funzioni permesse sono : sin() cos() tan() atan() sqrt() log() exp() 
 7 - La funzione potenza è :  pow(base, esponente)
 8 - non sono ammessi esponenti contenenti le variabili 

Suite di programmi di calcolo numerico : http://lnx.arrigoamadori.com/CalcoloNumerico/calcolonumericolnx.htm 


Sorgenti PHP :


campovettinr2.php


<html>

<head>
<title>Campo vettoriale in R2</title>
</head>

<body>

<script language="php">

error_reporting (E_ALL ^ E_NOTICE);

//
// disegna vari tipi di curve sul piano (u,v)
//

// inserisce tutti gli include (funzioni esterne)

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

// controlli vari

if ($auv == "")
{
echo "Attenzione !!! Manca a = a(u, v) !!!";
return;
}
if ($buv == "")
{
echo "Attenzione !!! Manca b = b(u, v) !!!";
return;
}

$ut = trim($ut);
$contr = contrFunz($ut);
if ($contr == "1")
{
echo "Attenzione !!! La funzione u = u(t) presenta spazi bianchi, impossibile procedere !!!";
return;
}
if ($contr == "2")
{
echo "Attenzione !!! La funzione u = u(t) presenta il carattere ^, impossibile procedere !!! Usare la funzione pow(... , ...) !!!";
return;
}
$utold = $ut;
$ut = str_replace("atanh", "aaa", $ut);
$ut = str_replace("atan", "bbb", $ut);
$ut = str_replace("tanh", "ccc", $ut);
$ut = str_replace("tan", "ddd", $ut);
$ut = str_replace("sqrt", "eee", $ut);
$ut = str_replace("t", "z", $ut);
$ut = str_replace("aaa", "atanh", $ut);
$ut = str_replace("bbb", "atan", $ut);
$ut = str_replace("ccc", "tanh", $ut);
$ut = str_replace("ddd", "tan", $ut);
$ut = str_replace("eee", "sqrt", $ut);

$vt = trim($vt);
$contr = contrFunz($vt);
if ($contr == "1")
{
echo "Attenzione !!! La funzione v = v(t) presenta spazi bianchi, impossibile procedere !!!";
return;
}
if ($contr == "2")
{
echo "Attenzione !!! La funzione v = v(t) presenta il carattere ^, impossibile procedere !!! Usare la funzione pow(... , ...) !!!";
return;
}
$vtold = $vt;
$vt = str_replace("atanh", "aaa", $vt);
$vt = str_replace("atan", "bbb", $vt);
$vt = str_replace("tanh", "ccc", $vt);
$vt = str_replace("tan", "ddd", $vt);
$vt = str_replace("sqrt", "eee", $vt);
$vt = str_replace("t", "z", $vt);
$vt = str_replace("aaa", "atanh", $vt);
$vt = str_replace("bbb", "atan", $vt);
$vt = str_replace("ccc", "tanh", $vt);
$vt = str_replace("ddd", "tan", $vt);
$vt = str_replace("eee", "sqrt", $vt);

$auv = trim($auv);
$contr = contrFunz($auv);
if ($contr == "1")
{
echo "Attenzione !!! La funzione a = a(u, v) presenta spazi bianchi, impossibile procedere !!!";
return;
}
if ($contr == "2")
{
echo "Attenzione !!! La funzione a = a(u, v) presenta il carattere ^, impossibile procedere !!! Usare la funzione pow(... , ...) !!!";
return;
}

$buv = trim($buv);
$contr = contrFunz($buv);
if ($contr == "1")
{
echo "Attenzione !!! La funzione b = b(u, v) presenta spazi bianchi, impossibile procedere !!!";
return;
}
if ($contr == "2")
{
echo "Attenzione !!! La funzione b = b(u, v) presenta il carattere ^, impossibile procedere !!! Usare la funzione pow(... , ...) !!!";
return;
}

// programma

// redefinizioni funzioni 

$rauv = str_replace("u", '$x1', $auv);
$rauv = str_replace("v", '$x2', $rauv);
$rbuv = str_replace("u", '$x1', $buv);
$rbuv = str_replace("v", '$x2', $rbuv);

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

$bianco = ImageColorAllocate ($im, 255, 255, 255);
$nero = ImageColorAllocate ($im, 0, 0, 0);
$rosso = ImageColorAllocate ($im, 255, 180, 180); // sbiadito !!!
$rossorosso = ImageColorAllocate ($im, 255, 0, 0); 
$verde = ImageColorAllocate ($im, 0, 255, 0);
$blu = ImageColorAllocate ($im, 180, 180, 255); // sbiadito !!!
$blublu = ImageColorAllocate ($im, 0, 0, 255); 
$rosa = ImageColorAllocate ($im, 255, 0, 255);
$grigio = ImageColorAllocate ($im, 200, 200, 200);

$rut = str_replace("z", '$t', $ut);
$rvt = str_replace("z", '$t', $vt);

// parametri di scala 

$xa = $ua; $xb = $ub;
$ya = $va; $yb = $vb;

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

// disegno frame con coordinate 

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

ImageString ($im, 1, 0, $alt + 10, $xa . " (u)", $nero);
ImageString ($im, 1, $lar, $alt + 10, $xb, $nero);
ImageString ($im, 1, $lar + 10, $alt, $ya . " (v)", $nero);
ImageString ($im, 1, $lar + 10, 0, $yb, $nero);

if ($xa < 0) // disegna asse y se dentro intervallo
{
Imageline ($im, abs($xa) / $dx, 0, abs($xa) / $dx, $alt, $nero);
ImageString ($im, 1, abs($xa) / $dx, $alt + 10, "0", $nero);
}
if ($ya < 0) // disegna asse x se dentro intervallo
{
Imageline ($im, 0, $alt - abs($ya) / $dy, $lar, $alt - abs($ya) / $dy, $nero);
ImageString ($im, 1, $lar + 10, $alt - abs($ya) / $dy, "0", $nero);
}

// disegna traiettoria

if ($traiettoria == "S")
{

// disegna traiettoria approssimando l'equazione della traiettoria 

$ru0 = $u0_1; 
$rv0 = $v0_1; 

$x1 = $u0_1;
$x2 = $v0_1;

For ($i = 1; $i <= $ni_1; $i++)
{
// approssimazione della traiettoria 

$ff = $rauv; eval("\$fff = @($ff);");
$u1 = $dt_1 * $fff + $ru0;

$ff = $rbuv; eval("\$fff = @($ff);");
$v1 = $dt_1 * $fff + $rv0;

$x = $u1;
$y = $v1;

if ($x >= $xa and $x <= $xb and $y >= $ya and $y <= $yb )
{
$xx = ($x - $xa) / $dx;
$yy = (abs($yb - $ya) - ($y - $ya)) / $dy;
Imageline ($im, $xx, $yy, $xx, $yy, $nero);
}

// reiterazione
$ru0 = $u1;
$rv0 = $v1;
$x1 = $u1;
$x2 = $v1;

}

} // fine traiettoria

// disegna flusso

if ($flusso == "S")
{

// disegna curva da trasformare (in verde) e curva trafornata dal flusso (in rosso)

$ni = ($tb - $ta) / $dt; 

$nn = 0;
if ($nt > 0)
{
$nnn= round($ni / $nt,0);
}
else
{
$nnn= 9999999999;
}

//echo $nnn . "<p>";

for ($i = 1; $i <= $ni; $i++) 
{
$vis = "n";
$nn = $nn + 1;
if ($nn == $nnn)
{
$nn = 0;
$vis = "s";
}

$t = $ta + ($i - 1) * $dt;
$x = 0;
eval("\$ff = @($rut);");
$x = $ff;
$y = 0;
eval("\$ff = @($rvt);");
$y = $ff;
$xx = 0;
$yy = 0;
if ($x >= $xa and $x <= $xb and $y >= $ya and $y <= $yb )
{
$xx = ($x - $xa) / $dx;
$yy = (abs($yb - $ya) - ($y - $ya)) / $dy;
Imageline ($im, $xx, $yy, $xx, $yy, $verde);
}

$ru0 = $x; 
$rv0 = $y; 

$x1 = $x;
$x2 = $y;

For ($j = 1; $j <= $ni_2; $j++)
{

// approssimazione della traiettoria 

$ff = $rauv; eval("\$fff = @($ff);");
$u1 = $dt_2 * $fff + $ru0;

$ff = $rbuv; eval("\$fff = @($ff);");
$v1 = $dt_2 * $fff + $rv0;

$x = $u1;
$y = $v1;

//if ($j == $ni_2)
{
//$col = "$rossorosso";

if ($x >= $xa and $x <= $xb and $y >= $ya and $y <= $yb )
{
$xx = ($x - $xa) / $dx;
$yy = (abs($yb - $ya) - ($y - $ya)) / $dy;

$visvis = "n";
if ($j == 1)
{
$visvis = "s";
$col = "$verde";
}

if ($vis == "s" and $j > 1 and $j < $ni_2)
{
$visvis = "s";
$col = "$grigio";
}

if ($j == $ni_2)
{
$visvis = "s";
$col = "$rossorosso";
}

if ($visvis == "s")
{
Imageline ($im, $xx, $yy, $xx, $yy, $col);
}
}
}

// reiterazione
$ru0 = $u1;
$rv0 = $v1;
$x1 = $u1;
$x2 = $v1;

}
}


} // fine flusso

// riporta dati iniziali

ImageString ($im, 2, 0, $alt + 30, "campo : ( a(u,v) , b(u,v) ) = ( " . $auv . " , " . $buv . " )", $nero);

ImageString ($im, 2, 0, $alt + 50, "traiettoria da : u0 = " . $u0_1 . " ; v0 = " . $v0_1, $nero);

ImageString ($im, 2, 0, $alt + 70, "curva da trasformare : ( u(t) , v(t) ) = ( " . $utold . " , " . $vtold . " ) ; " . $ta . " < t < " . $tb, $verde);

ImageString ($im, 2, 0, $alt + 90, "curva trasformata dal flusso", $rossorosso);

// 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>


sgn.php


<script language="php">

error_reporting (E_ALL ^ E_NOTICE);

function sgn($x)
{
// funzione sgn
// x = variabile indipendente

if ($x > 0)
{
return +1;

if ($x == 0)
{
return 0;

if ($x < 0)
{
return -1;


} // fine sgn()

</script>


contrFunz.php


<script language="php">

error_reporting (E_ALL ^ E_NOTICE);

function contrFunz($funz)
{
// controllo formale digitazione funzione
// viene controllata l'esistenza dei seguenti caratteri : blank, ^
// se tali caratteri vengono trovati, vine settata la variabile d'uscita
// $funz = funzione da controllare

$errore = "";

if (is_numeric(strpos($funz, ' ')))
{
$errore = "1";


if (is_numeric(strpos($funz, '^')))
{
$errore = "2";


return $errore;

} // fine contrFunz

</script>


derivataParz.php daPowAVb.php daVbAPow.php derivataMonom.php semplEspr.php vedi :  derprimsimb.htm 


calcTensMetrCovarDiV2.php


<script language="php">

error_reporting (E_ALL ^ E_NOTICE);

function calcTensMetrCovarDiV2($x, $y, $z)
{

// calcolo del tensore metrico covariante di V2
// parametri in input :
// x = funzione di u e v
// y = funzione di u e v
// z = funzione di u e v
// parametri in output :
// g(i,k) = tensore metrico covariante di V2 (variabile global)

$g[1][1] = "pow(" . derivataParz($x, "u") . ", 2)";
$g[1][1] = $g[1][1] . "+pow(" . derivataParz($y, "u") . ", 2)";
$g[1][1] = $g[1][1] . "+pow(" . derivataParz($z, "u") . ", 2)";

$g[1][2] = "(" . derivataParz($x, "u") . ")*(" . derivataParz($x, "v") . ")";
$g[1][2] = $g[1][2] . "+(" . derivataParz($y, "u") . ")*(" . derivataParz($y, "v") . ")";
$g[1][2] = $g[1][2] . "+(" . derivataParz($z, "u") . ")*(" . derivataParz($z, "v") . ")";

$g[2][1] = $g[1][2];

$g[2][2] = "pow(" . derivataParz($x, "v") . ", 2)";
$g[2][2] = $g[2][2] . "+pow(" . derivataParz($y, "v") . ", 2)";
$g[2][2] = $g[2][2] . "+pow(" . derivataParz($z, "v") . ", 2)";

return $g;

} // fine calcTensMetrCovarDiV2()

</script>


calcTensMetrContrDiV2.php


<script language="php">

error_reporting (E_ALL ^ E_NOTICE);

function calcTensMetrContrDiV2($g)
{

// calcolo del tensore metrico controvariante di V2
// parametri in input :
// g(i,k) = tensore metrico controvariante di V2 
// parametri in output :
// gcontr(i,k) = tensore metrico controvariante di V2 

$denom = "((" . $g[1][1] . ")*(" . $g[2][2] . ")-(" . $g[1][2] . ")*(" . $g[2][1] . "))";

$gcontr[1][1] = "(" . $g[2][2] . ")/" . $denom;
$gcontr[1][2] = "(-(" . $g[1][2] . ")/" . $denom . ")";
$gcontr[2][1] = "(-(" . $g[2][1] . ")/" . $denom . ")";
$gcontr[2][2] = "(" . $g[1][1] . ")/" . $denom; 

return $gcontr;

} // fine calcTensMetrContrDiV2()

</script>


calcSimbChris1DiV2.php


<script language="php">

error_reporting (E_ALL ^ E_NOTICE);

function calcSimbChris1DiV2($g)
{

// calcolo dei simboli di Christoffel del 1' tipo di V2
// parametri in input :
// g(i,k) = tensore metrico covariante di V2 
// parametri in output :
// chris1(j,l,k) = tensore metrico covariante di V2 

For ($j = 1; $j <= 2; $j++)
{
For ($l = 1; $l <= 2; $l++)
{
For ($k = 1; $k <= 2; $k++)
{
If ($l == 1) {$varl = "u";} 
If ($l == 2) {$varl = "v";} 
If ($j == 1) {$varj = "u";} 
If ($j == 2) {$varj = "v";} 
If ($k == 1) {$vark = "u";} 
If ($k == 2) {$vark = "v";} 
$chris1[$j][$l][$k] = "(1/2)*(" . derivataParz($g[$j][$k], $varl);
$chris1[$j][$l][$k] = $chris1[$j][$l][$k] . "+(" . derivataParz($g[$k][$l], $varj) . ")";
$chris1[$j][$l][$k] = $chris1[$j][$l][$k] . "-(" . derivataParz($g[$j][$l], $vark) . "))";




return $chris1;

} // fine calcSimbChris1DiV2()

</script>


calcSimbChris2DiV2.php


<script language="php">

error_reporting (E_ALL ^ E_NOTICE);

function calcSimbChris2DiV2($g, $gcontr, $chris1)
{

// calcolo dei simboli di Christoffel del 2' tipo di V2
// parametri in input :
// g(i,k) = tensore metrico covariante di V2 
// gcontr(i,k) = tensore metrico controvariante di V2 
// chris1(j,l,k) = simboli di Chistoffel del 1' tipo 
// parametri in output :
// chris2(j,l,k) = simboli di Christoffel del 2' tipo di V2 

For ($j = 1; $j <= 2; $j++)
{
For ($l = 1; $l <= 2; $l++)
{
For ($i = 1; $i <= 2; $i++)
{
$chris2[$j][$l][$i] = "(";
For ($k = 1; $k <= 2; $k++)
{
$chris2[$j][$l][$i] = $chris2[$j][$l][$i] . "(" . 
$gcontr[$i][$k] . ")*(" . $chris1[$j][$l][$k] . ")+";

$chris2[$j][$l][$i] = substr($chris2[$j][$l][$i], 0, strlen($chris2[j][$l][$i]) - 1) . ")";




return $chris2;

} // fine calcSimbChris2DiV2()

</script>