E-school di Arrigo
Amadori
Calcolo numerico
Problema classico dei 3 corpi
(interazione gravitazionale newtoniana e interazione
elettrica coulombiana)
Per maggiori informazioni :
http://www.arrigoamadori.com/lezioni/Miscellanea/2/Problema3CorpiClassico.htm
Operatori ammessi : - (per numeri negativi) . (per numeri decimali)
Sorgenti PHP :
problemaclassico3c.php
<html>
<head>
<title>Problema classico dei 3 corpi (gravitazione newtoniana)</title>
</head>
<body>
<script language="php">
error_reporting (E_ALL ^ E_NOTICE);
//echo $G . "<p>";
// parametri in input
//
// $gr = interazione gravitazionale newtoniana
// $el = interazione eletrrica coulombiana
// corpo 1 : $u1x0 = posizione iniziale x $u1y0 = posizione iniziale y $u1z0 = posizione iniziale z
// corpo 2 : $u2x0 = posizione iniziale x $u2y0 = posizione iniziale y $u2z0 = posizione iniziale z
// corpo 3 : $u3x0 = posizione iniziale x $u3y0 = posizione iniziale y $u3z0 = posizione iniziale z
// corpo 1 : $v1x0 = velocità iniziale x $v1y0 = velocità iniziale y $v1z0 = velocità iniziale z
// corpo 2 : $v2x0 = velocità iniziale x $v2y0 = velocità iniziale y $v2z0 = velocità iniziale z
// corpo 3 : $v3x0 = velocità iniziale x $v3y0 = velocità iniziale y $v3z0 = velocità iniziale z
// $G = costante gravitazionale
// $E = costante elettrica
// $m1 = massa corpo 1
// $m2 = massa corpo 2
// $m3 = massa corpo 3
// $q1 = carica corpo 1
// $q2 = carica corpo 2
// $q3 = carica corpo 3
// $cm = traiettoria centro di massa
// $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\sgn.php");
}
else
{
include("../Routines/sgn.php");
}
// controlli vari
if ($m1 <= 0 or $m2 <= 0 or $m3 <= 0)
{
echo "Attenzione !!! Le masse devono essere positive !!!" . "<p>";
return;
}
if ($E < 0)
{
echo "Attenzione !!! Le costante elettrica deve essere positiva o nulla !!!" . "<p>";
return;
}
$cm = strtoupper($cm); //echo "aaa" . $cm . "<p>";
// 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, "traiettoria corpo 1 = colore verde", $verde);
ImageString ($im, 2, 0, $alt + 45, " .. .. corpo 2 = colore rosso", $rosso);
ImageString ($im, 2, 0, $alt + 60, " .. .. corpo 3 = colore blu", $blu);
ImageString ($im, 2, 0, $alt + 75, " .. .. centro di massa = colore nero", $nero);
// settaggio matrici valori iniziali
$u0[1]["x"] = $u1x0; $u0[1]["y"] = $u1y0; $u0[1]["z"] = $u1z0; // posizioni
$u0[2]["x"] = $u2x0; $u0[2]["y"] = $u2y0; $u0[2]["z"] = $u2z0;
$u0[3]["x"] = $u3x0; $u0[3]["y"] = $u3y0; $u0[3]["z"] = $u3z0;
$v0[1]["x"] = $v1x0; $v0[1]["y"] = $v1y0; $v0[1]["z"] = $v1z0; // velocità
$v0[2]["x"] = $v2x0; $v0[2]["y"] = $v2y0; $v0[2]["z"] = $v2z0;
$v0[3]["x"] = $v3x0; $v0[3]["y"] = $v3y0; $v0[3]["z"] = $v3z0;
// interazione gravitazionale newtoniana
if ($gr)
{
$t = 0;
for ($ii = 1; $ii <= $ni; $ii++) // iterazione
{
$t = $t + $dt;
// disegna posizione corpo 1
$x = $u0[1]["x"];
$y = $u0[1]["y"];
$z = $u0[1]["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;
$yyy = $yy - $coeff * $xx * sin($alfa);
$zzz = $zz + $coeff * $xx * cos($alfa);
Imageline ($im, $yyy, $zzz, $yyy, $zzz, $verde);
}
// disegna posizione corpo 2
$x = $u0[2]["x"];
$y = $u0[2]["y"];
$z = $u0[2]["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;
$yyy = $yy - $coeff * $xx * sin($alfa);
$zzz = $zz + $coeff * $xx * cos($alfa);
Imageline ($im, $yyy, $zzz, $yyy, $zzz, $rosso);
}
// disegna posizione corpo 3
$x = $u0[3]["x"];
$y = $u0[3]["y"];
$z = $u0[3]["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;
$yyy = $yy - $coeff * $xx * sin($alfa);
$zzz = $zz + $coeff * $xx * cos($alfa);
Imageline ($im, $yyy, $zzz, $yyy, $zzz, $blu);
}
// disegna centro di massa
if ($cm == 'S')
{
$x = ($m1 * $u0[1]["x"] + $m2 * $u0[2]["x"] + $m3 * $u0[3]["x"]) / ($m1 + $m2 + $m3);
$y = ($m1 * $u0[1]["y"] + $m2 * $u0[2]["y"] + $m3 * $u0[3]["y"]) / ($m1 + $m2 + $m3);
$z = ($m1 * $u0[1]["z"] + $m2 * $u0[2]["z"] + $m3 * $u0[3]["z"]) / ($m1 + $m2 + $m3);
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);
}
}
// calcola distanze iniziali al cubo
for ($i = 1; $i <= 3; $i++)
{
for ($j = 1; $j <= 3; $j++)
{
$dcubo[$i][$j] = pow( pow($u0[$i]["x"]-$u0[$j]["x"],2) + pow($u0[$i]["y"]-$u0[$j]["y"],2) + pow($u0[$i]["z"]-$u0[$j]["z"],2) ,3);
$dcubo[$i][$j] = sqrt($dcubo[$i][$j]);
}
}
// calcolo accelerazioni
$w0[1]["x"] = $G * $m2 * ($u0[2]["x"] - $u0[1]["x"]) / $dcubo[1][2] + $G * $m3 * ($u0[3]["x"] - $u0[1]["x"]) / $dcubo[1][3];
$w0[1]["y"] = $G * $m2 * ($u0[2]["y"] - $u0[1]["y"]) / $dcubo[1][2] + $G * $m3 * ($u0[3]["y"] - $u0[1]["y"]) / $dcubo[1][3];
$w0[1]["z"] = $G * $m2 * ($u0[2]["z"] - $u0[1]["z"]) / $dcubo[1][2] + $G * $m3 * ($u0[3]["z"] - $u0[1]["z"]) / $dcubo[1][3];
$w0[2]["x"] = $G * $m1 * ($u0[1]["x"] - $u0[2]["x"]) / $dcubo[2][1] + $G * $m3 * ($u0[3]["x"] - $u0[2]["x"]) / $dcubo[2][3];
$w0[2]["y"] = $G * $m1 * ($u0[1]["y"] - $u0[2]["y"]) / $dcubo[2][1] + $G * $m3 * ($u0[3]["y"] - $u0[2]["y"]) / $dcubo[2][3];
$w0[2]["z"] = $G * $m1 * ($u0[1]["z"] - $u0[2]["z"]) / $dcubo[2][1] + $G * $m3 * ($u0[3]["z"] - $u0[2]["z"]) / $dcubo[2][3];
$w0[3]["x"] = $G * $m1 * ($u0[1]["x"] - $u0[3]["x"]) / $dcubo[3][1] + $G * $m2 * ($u0[2]["x"] - $u0[3]["x"]) / $dcubo[3][2];
$w0[3]["y"] = $G * $m1 * ($u0[1]["y"] - $u0[3]["y"]) / $dcubo[3][1] + $G * $m2 * ($u0[2]["y"] - $u0[3]["y"]) / $dcubo[3][2];
$w0[3]["z"] = $G * $m1 * ($u0[1]["z"] - $u0[3]["z"]) / $dcubo[3][1] + $G * $m2 * ($u0[2]["z"] - $u0[3]["z"]) / $dcubo[3][2];
// calcolo velocità dopo $dt
$v1[1]["x"] = $v0[1]["x"] + $w0[1]["x"] * $dt;
$v1[1]["y"] = $v0[1]["y"] + $w0[1]["y"] * $dt;
$v1[1]["z"] = $v0[1]["z"] + $w0[1]["z"] * $dt;
$v1[2]["x"] = $v0[2]["x"] + $w0[2]["x"] * $dt;
$v1[2]["y"] = $v0[2]["y"] + $w0[2]["y"] * $dt;
$v1[2]["z"] = $v0[2]["z"] + $w0[2]["z"] * $dt;
$v1[3]["x"] = $v0[3]["x"] + $w0[3]["x"] * $dt;
$v1[3]["y"] = $v0[3]["y"] + $w0[3]["y"] * $dt;
$v1[3]["z"] = $v0[3]["z"] + $w0[3]["z"] * $dt;
// calcolo posizioni dopo $dt
$u1[1]["x"] = $u0[1]["x"] + $v0[1]["x"] * $dt;
$u1[1]["y"] = $u0[1]["y"] + $v0[1]["y"] * $dt;
$u1[1]["z"] = $u0[1]["z"] + $v0[1]["z"] * $dt;
$u1[2]["x"] = $u0[2]["x"] + $v0[2]["x"] * $dt;
$u1[2]["y"] = $u0[2]["y"] + $v0[2]["y"] * $dt;
$u1[2]["z"] = $u0[2]["z"] + $v0[2]["z"] * $dt;
$u1[3]["x"] = $u0[3]["x"] + $v0[3]["x"] * $dt;
$u1[3]["y"] = $u0[3]["y"] + $v0[3]["y"] * $dt;
$u1[3]["z"] = $u0[3]["z"] + $v0[3]["z"] * $dt;
// reset
$u0[1]["x"] = $u1[1]["x"]; $u0[1]["y"] = $u1[1]["y"]; $u0[1]["z"] = $u1[1]["z"];
$u0[2]["x"] = $u1[2]["x"]; $u0[2]["y"] = $u1[2]["y"]; $u0[2]["z"] = $u1[2]["z"];
$u0[3]["x"] = $u1[3]["x"]; $u0[3]["y"] = $u1[3]["y"]; $u0[3]["z"] = $u1[3]["z"];
$v0[1]["x"] = $v1[1]["x"]; $v0[1]["y"] = $v1[1]["y"]; $v0[1]["z"] = $v1[1]["z"];
$v0[2]["x"] = $v1[2]["x"]; $v0[2]["y"] = $v1[2]["y"]; $v0[2]["z"] = $v1[2]["z"];
$v0[3]["x"] = $v1[3]["x"]; $v0[3]["y"] = $v1[3]["y"]; $v0[3]["z"] = $v1[3]["z"];
}
} // fine interazione gravitazionale newtoniana
// interazione elettrica coulombiana
if ($el)
{
$t = 0;
for ($ii = 1; $ii <= $ni; $ii++) // iterazione
{
$t = $t + $dt;
// disegna posizione corpo 1
$x = $u0[1]["x"];
$y = $u0[1]["y"];
$z = $u0[1]["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;
$yyy = $yy - $coeff * $xx * sin($alfa);
$zzz = $zz + $coeff * $xx * cos($alfa);
Imageline ($im, $yyy, $zzz, $yyy, $zzz, $verde);
}
// disegna posizione corpo 2
$x = $u0[2]["x"];
$y = $u0[2]["y"];
$z = $u0[2]["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;
$yyy = $yy - $coeff * $xx * sin($alfa);
$zzz = $zz + $coeff * $xx * cos($alfa);
Imageline ($im, $yyy, $zzz, $yyy, $zzz, $rosso);
}
// disegna posizione corpo 3
$x = $u0[3]["x"];
$y = $u0[3]["y"];
$z = $u0[3]["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;
$yyy = $yy - $coeff * $xx * sin($alfa);
$zzz = $zz + $coeff * $xx * cos($alfa);
Imageline ($im, $yyy, $zzz, $yyy, $zzz, $blu);
}
// disegna centro di massa
if ($cm == 'S')
{
$x = ($m1 * $u0[1]["x"] + $m2 * $u0[2]["x"] + $m3 * $u0[3]["x"]) / ($m1 + $m2 + $m3);
$y = ($m1 * $u0[1]["y"] + $m2 * $u0[2]["y"] + $m3 * $u0[3]["y"]) / ($m1 + $m2 + $m3);
$z = ($m1 * $u0[1]["z"] + $m2 * $u0[2]["z"] + $m3 * $u0[3]["z"]) / ($m1 + $m2 + $m3);
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);
}
}
// calcola distanze iniziali al cubo
for ($i = 1; $i <= 3; $i++)
{
for ($j = 1; $j <= 3; $j++)
{
$dcubo[$i][$j] = pow( pow($u0[$i]["x"]-$u0[$j]["x"],2) + pow($u0[$i]["y"]-$u0[$j]["y"],2) + pow($u0[$i]["z"]-$u0[$j]["z"],2) ,3);
$dcubo[$i][$j] = sqrt($dcubo[$i][$j]);
}
}
// calcolo accelerazioni
$s12 = (-1) * sgn($q1 * $q2);
$s13 = (-1) * sgn($q1 * $q3);
$s23 = (-1) * sgn($q2 * $q3);
$w0[1]["x"] = (1 / $m1) * ($E * abs($q1 * $q2) * $s12 * ($u0[2]["x"] - $u0[1]["x"]) / $dcubo[1][2] + $E * abs($q1 * $q3) * $s13 * ($u0[3]["x"] - $u0[1]["x"]) / $dcubo[1][3]);
$w0[1]["y"] = (1 / $m1) * ($E * abs($q1 * $q2) * $s12 * ($u0[2]["y"] - $u0[1]["y"]) / $dcubo[1][2] + $E * abs($q1 * $q3) * $s13 * ($u0[3]["y"] - $u0[1]["y"]) / $dcubo[1][3]);
$w0[1]["z"] = (1 / $m1) * ($E * abs($q1 * $q2) * $s12 * ($u0[2]["z"] - $u0[1]["z"]) / $dcubo[1][2] + $E * abs($q1 * $q3) * $s13 * ($u0[3]["z"] - $u0[1]["z"]) / $dcubo[1][3]);
$w0[2]["x"] = (1 / $m2) * ($E * abs($q2 * $q1) * $s12 * ($u0[1]["x"] - $u0[2]["x"]) / $dcubo[2][1] + $E * abs($q2 * $q3) * $s23 * ($u0[3]["x"] - $u0[2]["x"]) / $dcubo[2][3]);
$w0[2]["y"] = (1 / $m2) * ($E * abs($q2 * $q1) * $s12 * ($u0[1]["y"] - $u0[2]["y"]) / $dcubo[2][1] + $E * abs($q2 * $q3) * $s23 * ($u0[3]["y"] - $u0[2]["y"]) / $dcubo[2][3]);
$w0[2]["z"] = (1 / $m2) * ($E * abs($q2 * $q1) * $s12 * ($u0[1]["z"] - $u0[2]["z"]) / $dcubo[2][1] + $E * abs($q2 * $q3) * $s23 * ($u0[3]["z"] - $u0[2]["z"]) / $dcubo[2][3]);
$w0[3]["x"] = (1 / $m3) * ($E * abs($q3 * $q1) * $s13 * ($u0[1]["x"] - $u0[3]["x"]) / $dcubo[3][1] + $E * abs($q3 * $q2) * $s23 * ($u0[2]["x"] - $u0[3]["x"]) / $dcubo[3][2]);
$w0[3]["y"] = (1 / $m3) * ($E * abs($q3 * $q1) * $s13 * ($u0[1]["y"] - $u0[3]["y"]) / $dcubo[3][1] + $E * abs($q3 * $q2) * $s23 * ($u0[2]["y"] - $u0[3]["y"]) / $dcubo[3][2]);
$w0[3]["z"] = (1 / $m3) * ($E * abs($q3 * $q1) * $s13 * ($u0[1]["z"] - $u0[3]["z"]) / $dcubo[3][1] + $E * abs($q3 * $q2) * $s23 * ($u0[2]["z"] - $u0[3]["z"]) / $dcubo[3][2]);
// calcolo velocità dopo $dt
$v1[1]["x"] = $v0[1]["x"] + $w0[1]["x"] * $dt;
$v1[1]["y"] = $v0[1]["y"] + $w0[1]["y"] * $dt;
$v1[1]["z"] = $v0[1]["z"] + $w0[1]["z"] * $dt;
$v1[2]["x"] = $v0[2]["x"] + $w0[2]["x"] * $dt;
$v1[2]["y"] = $v0[2]["y"] + $w0[2]["y"] * $dt;
$v1[2]["z"] = $v0[2]["z"] + $w0[2]["z"] * $dt;
$v1[3]["x"] = $v0[3]["x"] + $w0[3]["x"] * $dt;
$v1[3]["y"] = $v0[3]["y"] + $w0[3]["y"] * $dt;
$v1[3]["z"] = $v0[3]["z"] + $w0[3]["z"] * $dt;
// calcolo posizioni dopo $dt
$u1[1]["x"] = $u0[1]["x"] + $v0[1]["x"] * $dt;
$u1[1]["y"] = $u0[1]["y"] + $v0[1]["y"] * $dt;
$u1[1]["z"] = $u0[1]["z"] + $v0[1]["z"] * $dt;
$u1[2]["x"] = $u0[2]["x"] + $v0[2]["x"] * $dt;
$u1[2]["y"] = $u0[2]["y"] + $v0[2]["y"] * $dt;
$u1[2]["z"] = $u0[2]["z"] + $v0[2]["z"] * $dt;
$u1[3]["x"] = $u0[3]["x"] + $v0[3]["x"] * $dt;
$u1[3]["y"] = $u0[3]["y"] + $v0[3]["y"] * $dt;
$u1[3]["z"] = $u0[3]["z"] + $v0[3]["z"] * $dt;
// reset
$u0[1]["x"] = $u1[1]["x"]; $u0[1]["y"] = $u1[1]["y"]; $u0[1]["z"] = $u1[1]["z"];
$u0[2]["x"] = $u1[2]["x"]; $u0[2]["y"] = $u1[2]["y"]; $u0[2]["z"] = $u1[2]["z"];
$u0[3]["x"] = $u1[3]["x"]; $u0[3]["y"] = $u1[3]["y"]; $u0[3]["z"] = $u1[3]["z"];
$v0[1]["x"] = $v1[1]["x"]; $v0[1]["y"] = $v1[1]["y"]; $v0[1]["z"] = $v1[1]["z"];
$v0[2]["x"] = $v1[2]["x"]; $v0[2]["y"] = $v1[2]["y"]; $v0[2]["z"] = $v1[2]["z"];
$v0[3]["x"] = $v1[3]["x"]; $v0[3]["y"] = $v1[3]["y"]; $v0[3]["z"] = $v1[3]["z"];
}
} // fine interazione elettrica coulombiana
// 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>