E-school di Arrigo
Amadori
Calcolo numerico
Dinamica su una superficie
Per maggiori informazioni :
http://www.arrigoamadori.com/lezioni/Miscellanea/1/DinamicaSuperficie.htm .
Le equazioni differenziali del secondo ordine vengono approssimate come in eqdiff2ord .
Operatori ammessi :
| + somma | sin() seno | asin() arco seno | sinh() seno iperbolico | asinh() inverso del seno iperbolico | pow(base, esponente) potenza |
| - sottrazione | cos() coseno | acos() arco coseno | cosh() coseno iperbolico | acosh() inverso del coseno iperbolico | exp() esponenziale |
| * moltiplicazione | tan() tangente | atan() arco tangente | tanh() tangente iperbolica | atanh() inverso del coseno iperbolico | log() logaritmo naturale |
| / divisione | abs() valore assoluto | ||||
| . segno per decimali | sqrt() radice quadrata | ||||
| sgn() segno |
Sorgenti PHP :
dinamicasusuperficie.php
<html>
<head>
<title>Dinamica su una superficie</title>
</head>
<body>
<script language="php">
error_reporting (E_ALL ^ E_NOTICE);
// parametri in input
//
// $xuv = funzione parametrica x(u,v)
// $yuv = funzione parametrica y(u,v)
// $zuv = funzione parametrica z(u,v)
// $ro = densità atmosfera
// $fxuv = forza fx(u,v,U,V)
// $fyuv = forza fy(u,v,U,V)
// $fzuv = forza fz(u,v)
// $k1 = coeff. attrito del mezzo (per parte dipendente dalla velocità lineare)
// $k2 = coeff. attrito del mezzo (per parte dipendente dalla velocità al quadrato)
// particella : $u0 = posizione iniziale u $v0 = posizione iniziale v
// particella : $upunto0 = velocità iniziale u $upunto0 = velocità iniziale v
// $lar = larghezza immgine in pixel
// $alt = altezza immagine in pixel
// $xb = fine dominio x
// $yb = fine dominio y
// $zb = fine dominio z
// $ua = 1' valore iniziale parametro u
// $ub = 2' valore iniziale parametro u
// $du = incremento parametro u
// $va = 1' valore iniziale parametro v
// $vb = 2' valore iniziale parametro v
// $dv = incremento parametro v
// $ncoordu = numero coordinate u
// $ncoordv = numero coordinate v
// $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");
include("..\Routines\sgn.php");
include("..\Routines\calcTensMetrCovarDiV2.php");
include("..\Routines\calcTensMetrContrDiV2.php");
include("..\Routines\calcSimbChris1DiV2.php");
include("..\Routines\calcSimbChris2DiV2.php");
include("..\Routines\contrFunz.php");
}
else
{
include("../Routines/derivataParz.php");
include("../Routines/daPowAVb.php");
include("../Routines/daVbAPow.php");
include("../Routines/derivataMonom.php");
include("../Routines/semplEspr.php");
include("../Routines/sgn.php");
include("../Routines/calcTensMetrCovarDiV2.php");
include("../Routines/calcTensMetrContrDiV2.php");
include("../Routines/calcSimbChris1DiV2.php");
include("../Routines/calcSimbChris2DiV2.php");
include("../Routines/contrFunz.php");
}
// controlli vari
if ($xuv == "")
{
echo "Attenzione !!! Manca x(u,v) !!!" . "<p>";
return;
}
if ($yuv == "")
{
echo "Attenzione !!! Manca y(u,v) !!!" . "<p>";
return;
}
if ($zuv == "")
{
echo "Attenzione !!! Manca z(u,v) !!!" . "<p>";
return;
}
if ($fxuv == "")
{
echo "Attenzione !!! Manca fx(u,v,U,V) !!!" . "<p>";
return;
}
if ($fyuv == "")
{
echo "Attenzione !!! Manca fy(u,v,U,V) !!!" . "<p>";
return;
}
if ($fzuv == "")
{
echo "Attenzione !!! Manca fz(u,v,U,V) !!!" . "<p>";
return;
}
$xuv = trim($xuv);
$contr = contrFunz($xuv);
if ($contr == "1")
{
echo "Attenzione !!! La funzione x presenta spazi bianchi, impossibile procedere !!!";
return;
}
if ($contr == "2")
{
echo "Attenzione !!! La funzione x presenta il carattere ^, impossibile procedere !!! Usare la funzione pow(... , ...) !!!";
return;
}
$xuvold = $xuv;
$yuv = trim($yuv);
$contr = contrFunz($yuv);
if ($contr == "1")
{
echo "Attenzione !!! La funzione y presenta spazi bianchi, impossibile procedere !!!";
return;
}
if ($contr == "2")
{
echo "Attenzione !!! La funzione y presenta il carattere ^, impossibile procedere !!! Usare la funzione pow(... , ...) !!!";
return;
}
$yuvold = $yuv;
$zuv = trim($zuv);
$contr = contrFunz($zuv);
if ($contr == "1")
{
echo "Attenzione !!! La funzione z presenta spazi bianchi, impossibile procedere !!!";
return;
}
if ($contr == "2")
{
echo "Attenzione !!! La funzione z presenta il carattere ^, impossibile procedere !!! Usare la funzione pow(... , ...) !!!";
return;
}
$zuvold = $zuv;
$fxuv = trim($fxuv);
$contr = contrFunz($fxuv);
if ($contr == "1")
{
echo "Attenzione !!! La funzione fx presenta spazi bianchi, impossibile procedere !!!";
return;
}
if ($contr == "2")
{
echo "Attenzione !!! La funzione fx presenta il carattere ^, impossibile procedere !!! Usare la funzione pow(... , ...) !!!";
return;
}
$fxuvold = $fxuv;
$fyuv = trim($fyuv);
$contr = contrFunz($fyuv);
if ($contr == "1")
{
echo "Attenzione !!! La funzione fy presenta spazi bianchi, impossibile procedere !!!";
return;
}
if ($contr == "2")
{
echo "Attenzione !!! La funzione fy presenta il carattere ^, impossibile procedere !!! Usare la funzione pow(... , ...) !!!";
return;
}
$fyuvold = $fyuv;
$fzuv = trim($fzuv);
$contr = contrFunz($fzuv);
if ($contr == "1")
{
echo "Attenzione !!! La funzione fz presenta spazi bianchi, impossibile procedere !!!";
return;
}
if ($contr == "2")
{
echo "Attenzione !!! La funzione fz presenta il carattere ^, impossibile procedere !!! Usare la funzione pow(... , ...) !!!";
return;
}
$fzuvold = $fzuv;
// 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
$nu = ($ub - $ua) / $du; // numero iterazioni parametro u
$nv = ($vb - $va) / $dv; // numero iterazioni parametro v
// 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);
// settaggi
$xxuv = $xuv;
$xxuv = str_replace("u", '$u', $xxuv);
$xxuv = str_replace("v", '$v', $xxuv);
$yyuv = $yuv;
$yyuv = str_replace("u", '$u', $yyuv);
$yyuv = str_replace("v", '$v', $yyuv);
$zzuv = $zuv;
$zzuv = str_replace("u", '$u', $zzuv);
$zzuv = str_replace("v", '$v', $zzuv);
$fxxuv = $fxuv;
$fxxuv = str_replace("u", '$u', $fxxuv);
$fxxuv = str_replace("v", '$v', $fxxuv);
$fxxuv = str_replace("U", '$upunto', $fxxuv);
$fxxuv = str_replace("V", '$vpunto', $fxxuv);
$fyyuv = $fyuv;
$fyyuv = str_replace("u", '$u', $fyyuv);
$fyyuv = str_replace("v", '$v', $fyyuv);
$fyyuv = str_replace("U", '$upunto', $fyyuv);
$fyyuv = str_replace("V", '$vpunto', $fyyuv);
$fzzuv = $fzuv;
$fzzuv = str_replace("u", '$u', $fzzuv);
$fzzuv = str_replace("v", '$v', $fzzuv);
$fzzuv = str_replace("U", '$upunto', $fzzuv);
$fzzuv = str_replace("V", '$vpunto', $fzzuv);
// disegna superficie con coord. curvil. u
$nn = $nu/$ncoordu;
for ($i = 1; $i <= $nu; $i = $i + $nn)
{
for ($j = 1; $j <= $nv; $j++)
{
$u = $ua + ($i - 1) * $du;
$v = $va + ($j - 1) * $dv;
$x = 0;
eval("\$ff = @($xxuv);");
$x = $ff;
$y = 0;
eval("\$ff = @($yyuv);");
$y = $ff;
$z = 0;
eval("\$ff = @($zzuv);");
$z = $ff;
$xx = 0;
$yy = 0;
$zz = 0;
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;
$yyy = $yy - $coeff * $xx * sin($alfa);
$zzz = $zz + $coeff * $xx * cos($alfa);
Imageline ($im, $yyy, $zzz, $yyy, $zzz, $nero);
}
}
}
// disegna superficie con coord. curvil. v
$nn = $nv/$ncoordv;
for ($i = 1; $i <= $nu; $i++)
{
for ($j = 1; $j <= $nv; $j = $j + $nn)
{
$u = $ua + ($i - 1) * $du;
$v = $va + ($j - 1) * $dv;
$x = 0;
eval("\$ff = @($xxuv);");
$x = $ff;
$y = 0;
eval("\$ff = @($yyuv);");
$y = $ff;
$z = 0;
eval("\$ff = @($zzuv);");
$z = $ff;
$xx = 0;
$yy = 0;
$zz = 0;
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;
$yyy = $yy - $coeff * $xx * sin($alfa);
$zzz = $zz + $coeff * $xx * cos($alfa);
Imageline ($im, $yyy, $zzz, $yyy, $zzz, $nero);
}
}
}
// disegna sistema (u,v)
$alt1 = 100;
$lar1 = 100;
$xa1 = $ua;
$xb1 = $ub;
$ya1 = $va;
$yb1 = $vb;
$dx1 = ($xb1 - $xa1) / ($lar1 - 1); // intervallo di scomposizione asse u
$dy1 = ($yb1 - $ya1) / ($alt1 - 1); // intervallo di scomposizione asse v
Imageline ($im, 0, 0, $lar1, 0, $nero);
Imageline ($im, 0, $alt1, $lar1, $alt1, $nero);
Imageline ($im, 0, 0, 0, $alt1, $nero);
Imageline ($im, $lar1, 0, $lar1, $alt1, $nero);
ImageString ($im, 1, 0, $alt1 + 10, $xa1 . " (u)", $nero);
ImageString ($im, 1, $lar1, $alt1 + 10, $xb1, $nero);
ImageString ($im, 1, $lar1 + 10, $alt1, $ya1 . " (v)", $nero);
ImageString ($im, 1, $lar1 + 10, 0, $yb1, $nero);
if ($xa1 < 0) // disegna asse y se dentro intervallo
{
Imageline ($im, abs($xa1) / $dx1, 0, abs($xa1) / $dx1, $alt1, $nero);
ImageString ($im, 1, abs($xa1) / $dx1, $alt1 + 10, "0", $nero);
}
if ($ya1 < 0) // disegna asse x se dentro intervallo
{
Imageline ($im, 0, $alt1 - abs($ya1) / $dy1, $lar1, $alt1 - abs($ya1) / $dy1, $nero);
ImageString ($im, 1, $lar1 + 10, $alt1 - abs($ya1) / $dy1, "0", $nero);
}
// calcola tensori e simboli
$g = calcTensMetrCovarDiV2($xuv, $yuv, $zuv);
$gg = calcTensMetrContrDiV2($g);
$chris1 = calcSimbChris1DiV2($g);
$chris2 = calcSimbChris2DiV2($g, $gg, $chris1);
For ($i = 1; $i <= 2; $i++)
{
For ($j = 1; $j <= 2; $j++)
{
For ($k = 1; $k <= 2; $k++)
{
$chris[$i][$j][$k] = $chris2[$i][$j][$k];
$chris[$i][$j][$k] = str_replace("u", '$u', $chris[$i][$j][$k]);
$chris[$i][$j][$k] = str_replace("v", '$v', $chris[$i][$j][$k]);
//echo $i . " " . $j . " " . $k . " " . $chris[$i][$j][$k] . "<p>";
}
}
}
// predispone le formule
$chris111 = $chris[1][1][1];
$chris121 = $chris[1][2][1];
$chris221 = $chris[2][2][1];
$chris112 = $chris[1][1][2];
$chris122 = $chris[1][2][2];
$chris222 = $chris[2][2][2];
$g11 = $g[1][1];
$g11 = str_replace("u", '$u', $g11);
$g11 = str_replace("v", '$v', $g11);
$g12 = $g[1][2];
$g12 = str_replace("u", '$u', $g12);
$g12 = str_replace("v", '$v', $g12);
$g22 = $g[2][2];
$g22 = str_replace("u", '$u', $g22);
$g22 = str_replace("v", '$v', $g22);
$denom = "($g11)*($g22)-($g12)*($g12)";
$xu1 = DerivataParz($xuv,"u");
$xu2 = DerivataParz($yuv,"u");
$xu3 = DerivataParz($zuv,"u");
$xxu1 = $xu1;
$xxu1 = str_replace("u", '$u', $xxu1);
$xxu1 = str_replace("v", '$v', $xxu1);
$xxu2 = $xu2;
$xxu2 = str_replace("u", '$u', $xxu2);
$xxu2 = str_replace("v", '$v', $xxu2);
$xxu3 = $xu3;
$xxu3 = str_replace("u", '$u', $xxu3);
$xxu3 = str_replace("v", '$v', $xxu3);
$xv1 = DerivataParz($xuv,"v");
$xv2 = DerivataParz($yuv,"v");
$xv3 = DerivataParz($zuv,"v");
$xxv1 = $xv1;
$xxv1 = str_replace("u", '$u', $xxv1);
$xxv1 = str_replace("v", '$v', $xxv1);
$xxv2 = $xv2;
$xxv2 = str_replace("u", '$u', $xxv2);
$xxv2 = str_replace("v", '$v', $xxv2);
$xxv3 = $xv3;
$xxv3 = str_replace("u", '$u', $xxv3);
$xxv3 = str_replace("v", '$v', $xxv3);
$fxu = "($fxxuv)*($xxu1)+($fyyuv)*($xxu2)+($fzzuv)*($xxu3)";
$fxv = "($fxxuv)*($xxv1)+($fyyuv)*($xxv2)+($fzzuv)*($xxv3)";
$termforza1 = "(($fxu)*($g22)-($fxv)*($g12))/($denom)";
$termforza2 = "(($fxv)*($g11)-($fxu)*($g12))/($denom)";
$funz1 = "-($chris111)*(\$upunto)*(\$upunto)-2*($chris121)*(\$upunto)*(\$vpunto)-($chris221)*(\$vpunto)*(\$vpunto)+($termforza1)";
$funz2 = "-($chris112)*(\$upunto)*(\$upunto)-2*($chris122)*(\$upunto)*(\$vpunto)-($chris222)*(\$vpunto)*(\$vpunto)+($termforza2)";
//echo $termforza1 . "<p>" . $termforza2 . "<p>";
//echo "----------------------------<p>";
//echo $funz1 . "<p>" . $funz2 . "<p>";
// iterazione
$uu0 = $u0; $vv0 = $v0; // posizioni iniziali
$uupunto0 = $upunto0; $vvpunto0 = $vpunto0; // velocità iniziali
$t = 0;
for ($ii = 1; $ii <= $ni; $ii++) // iterazione
{
$t = $t + $dt;
// disegna curva nel sistema (u,v)
$u = $uu0;
$v = $vv0;
$x = $u;
$y = $v;
$xx = 0;
$yy = 0;
if ($x >= $xa1 and $x <= $xb1 and $y >= $ya1 and $y <= $yb1 )
{
$xx = ($x - $xa1) / $dx1;
$yy = (abs($yb1 - $ya1) - ($y - $ya1)) / $dy1;
Imageline ($im, $xx, $yy, $xx, $yy, $verde);
}
// disegna curva nel sistema (x,y,z)
eval("\$ff = @($xxuv);");
$x = $ff;
eval("\$ff = @($yyuv);");
$y = $ff;
eval("\$ff = @($zzuv);");
$z = $ff;
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, $rosso);
Imageline ($im, $yyy, $zzz, $yyy, $zzz, $rosso);
}
// calcolo accelerazioni
$upunto = $uupunto0;
$vpunto = $vvpunto0;
eval("\$ff = @($funz1);");
$u2punti0 = $ff;
eval("\$ff = @($funz2);");
$v2punti0 = $ff;
//echo "bbbbb" . " " . $u . " " . $v . " " . $upunto . " " . $vpunto . "<p>";
// calcolo velocità dopo $dt
$uupunto1 = $uupunto0 + $u2punti0 * $dt;
$vvpunto1 = $vvpunto0 + $v2punti0 * $dt;
// calcolo posizioni dopo $dt
$uu1 = $uu0 + $uupunto0 * $dt;
$vv1 = $vv0 + $vvpunto0 * $dt;
// reset
$uu0 = $uu1; $vv0 = $vv1;
$uupunto0 = $uupunto1; $vvpunto0 = $vvpunto1;
}
// 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>
derivataParz.php daPowAVb.php daVbAPow.php derivataMonom.php semplEspr.php vedi : derprimsimb.htm
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>
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>
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>