E-school di Arrigo
Amadori
Calcolo numerico
Campo vettoriale in R2
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 " <p>";
echo " <p>";
echo " <p>";
echo " <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>