E-school  di  Arrigo Amadori

Calcolo numerico


Equazione differenziale di 2' ordine

Viene approssimata la soluzione dell'equazione differenziale    con condizioni iniziali     iterando le formule  .  


 y'' = f(x, y, y') = (porre z = y')

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

 xa  =    xb = (estremi asse x)
 ya  =    yb = (estremi asse y)

 x0  =    y0 = (coordinate punto iniziale) 
 y'0 = (derivata prima punto iniziale)

 dx  = (incremento ascissa) ni = (numero iterazioni)

 

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

Sorgenti PHP :


equazionedifferenziale2ordine.php


<html>

<head>
<title>Equazione differenziale di 2' ordine</title>
</head>

<body>

<script language="php">

error_reporting (E_ALL ^ E_NOTICE);

// parametri in input 
//
// $funzione = f(u, v, z)
// $lar = larghezza immgine in pixel
// $alt = altezza immagine in pixel
// $xa = inizio dominio x
// $xb = fine dominio x
// $ya = inizio dominio y
// $yb = fine dominio y
// $x0 = ascissa punto iniziale
// $y0 = ordinata punto iniziale
// $dy0 = derivata prima punto iniziale
// $dx = incremento ascissa
// $ni = numero iterazioni
//
// 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\contrFunz.php");
}
else
{
include("../Routines/contrFunz.php");
}

// controlli vari

if ($funzione == "")
{
echo "Attenzione !!! Manca y'' = f(x,y,y') !!!";
return;
}

$funzione = trim($funzione);
$contr = contrFunz($funzione);
if ($contr == "1")
{
echo "Attenzione !!! La y'' = f(x,y,y') presenta spazi bianchi, impossibile procedere !!!";
return;
}
if ($contr == "2")
{
echo "Attenzione !!! La y'' = f(x,y,y') presenta il carattere ^, impossibile procedere !!! Usare la funzione pow(... , ...) !!!";
return;
}
$funzioneold = $funzione;
$funzione = str_replace("exp", "ppp", $funzione);
$funzione = str_replace("x", "u", $funzione);
$funzione = str_replace("y", "v", $funzione);
$funzione = str_replace("ppp", "exp", $funzione);

// parametri di scala 

$dxx = $dx;

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

// 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, $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 . " (x)", $nero);
ImageString ($im, 1, $lar, $alt + 10, $xb, $nero);
ImageString ($im, 1, $lar + 10, $alt, $ya . " (y)", $nero);
ImageString ($im, 1, $lar + 10, 0, $yb, $nero);

ImageString ($im, 2, 0, $alt + 30, "y'' = " . str_replace("z", "y'", $funzioneold), $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);
}

// definizione funzioni x = x(u) e y = y(u)

$f = $funzione;
$f = str_replace("u", '$x', $f);
$f = str_replace("v", '$y', $f);
$f = str_replace("z", '$z', $f);

// disegna soluzione 
//
// valori iniziali : x0, y0, y'0
//
// iterazione : x1 = x0 + dx, y1 = y0 + y'0 * dx, y'1 = y'0 + y''0 * dx, y''1 = f(x1, y1, y'1)
//

$x = $x0;
$y = $y0;
$z = $dy0; 
eval("\$ff = @($f);");
//if ($ff == NULL)
if (!is_numeric($ff))
{
echo "Attenzione !!! Si è verificato un errore, impossibile procedere !!!";
return;
}
for ($i = 1; $i <= $ni; $i++) 

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);
}
$x = $x0 + $i * $dxx;
$y = $y + $z * $dxx;
$z = $z + $ff * $dxx;
eval("\$ff = @($f);");
//if ($ff == NULL)
if (!is_numeric($ff))
{
echo "Attenzione !!! Si è verificato un errore, impossibile procedere !!!";
return;
}
}

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


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>