E-school di Arrigo
Amadori
Calcolo numerico
Grafico funzione da R ad R
Viene visualizzato il grafico della funzione in oggetto.
A scelta, è possibile visualizzare anche il grafico della
derivata prima e della derivata seconda. La derivata prima è approssimata
da
. La
derivata seconda, da
.
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 :
graficofunzioneinR2.php
<html>
<head>
<title>Grafico funzione in R2</title>
</head>
<body>
<script language="php">
error_reporting (E_ALL ^ E_NOTICE);
// parametri in input
//
// $funzione = f(u)
// $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
// $der1 = con derivata prima
// $der2 = con derivata seconda
//
// parametri in output
//
// crea l'immagine PNG e ne visualizza il link
//
// inserisce tutti gli include (funzioni esterne)
//echo $SERVER_SOFTWARE . "<p>";
if (is_integer(strpos($SERVER_SOFTWARE, "Win")))
{
include("..\Routines\sgn.php");
include("..\Routines\contrFunz.php");
}
else
{
include("../Routines/sgn.php");
include("../Routines/contrFunz.php");
}
// controlli vari
if ($funzione == "")
{
echo "Attenzione !!! Manca y = f(x) !!!";
return;
}
$funzione = trim($funzione);
$contr = contrFunz($funzione);
if ($contr == "1")
{
echo "Attenzione !!! La funzione y = f(x) presenta spazi bianchi, impossibile procedere !!!";
return;
}
if ($contr == "2")
{
echo "Attenzione !!! La funzione y = f(x) 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("ppp", "exp", $funzione);
$der1 = strtoupper($der1);
$der2 = strtoupper($der2);
// parametri di scala
$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 = " . $funzioneold, $nero);
if ($der1 == "S")
{
ImageString ($im, 2, 0, $alt + 50, "y = derivata prima", $rosso);
}
if ($der2 == "S")
{
ImageString ($im, 2, 0, $alt + 70, "y = derivata seconda", $blu);
}
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 funzione y = f(x)
$f = $funzione;
$f = str_replace("u", '$x', $f);
// disegna funzione
for ($i = 1; $i <= $lar; $i++)
{
$x = $xa + ($i - 0) * $dx; // dovrebbe essere - 1, ma lo porto a - 0 per migliore approssimazione grafica
$y = 0;
eval("\$ff = @($f);");
$y = $ff;
$yy = 0;
if ($y >= $ya and $y <= $yb)
{
$yy = (abs($yb - $ya) - ($y - $ya)) / $dy;
Imageline ($im, $i, $yy, $i, $yy, $nero);
}
}
// disegna derivata prima approssimata
if ($der1 == "S")
{
for ($i = 1; $i <= $lar; $i++)
{
$x1 = $xa + ($i - 0) * $dx; // dovrebbe essere - 1, ma lo porto a - 0 per migliore approssimazione grafica
$x2 = $xa + ($i + 1) * $dx; // dovrebbe essere - 0, ma lo porto a + 1 per migliore approssimazione grafica
$y1 = 0;
$x = $x1;
eval("\$ff = @($f);");
$y1 = $ff;
$y2 = 0;
$x = $x2;
eval("\$ff = @($f);");
$y2 = $ff;
$der = 0;
$der = @(($y2 - $y1) / $dx);
$yy = 0;
if ($der >= $ya and $der <= $yb)
{
$yy = (abs($yb - $ya) - ($der - $ya)) / $dy;
Imageline ($im, $i, $yy, $i, $yy, $rosso);
}
}
}
// disegna derivata seconda approssimata
if ($der2 == "S")
{
for ($i = 1; $i <= $lar; $i++)
{
$x1 = $xa + ($i - 0) * $dx; // dovrebbe essere - 1, ma lo porto a - 0 per migliore approssimazione grafica
$x2 = $xa + ($i + 1) * $dx; // dovrebbe essere - 0, ma lo porto a + 1 per migliore approssimazione grafica
$x3 = $xa + ($i + 2) * $dx; // dovrebbe essere + 1, ma lo porto a + 2 per migliore approssimazione grafica
$y1 = 0;
$x = $x1;
eval("\$ff = @($f);");
$y1 = $ff;
$y2 = 0;
$x = $x2;
eval("\$ff = @($f);");
$y2 = $ff;
$y3 = 0;
$x = $x3;
eval("\$ff = @($f);");
$y3 = $ff;
$der = 0;
$der = @(($y3 - 2 * $y2 + $y1) / ($dx * $dx));
$yy = 0;
if ($der >= $ya and $der <= $yb)
{
$yy = (abs($yb - $ya) - ($der - $ya)) / $dy;
Imageline ($im, $i, $yy, $i, $yy, $blu);
}
}
}
// 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>
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>