E-school  di  Arrigo Amadori

Calcolo numerico


Serie di Fourier

Il programma esegue lo sviluppo in serie di Fourier della funzione in oggetto sull'intervallo    troncandolo a piacimento. Vengono infine visualizzati i grafici della funzione data e del suo sviluppo in serie per poterle confrontare. 

Lo sviluppo viene effettuato rispetto al sistema ortonormale    con  troncando    al valore di    desiderato, essendo 

Gli integrali vengono approssimati col metodo dei trapezi.


 y =  f(x) =  

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

 xa  = 0      xb = 6.28318530717959 (2 pigreco) (estremi asse x)

 ya  =   yb = (estremi asse y)

 troncamento per k =  

 scomposizione intervallo per l'integrazione =

 

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 :


seriedifourier.php


<html>

<head>
<title>Serie di Fourier</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
// $grado = grado sviluppo in serie
// $scomp = scomposizione intervallo per l'integrazione
//
// parametri in output
//
// ritorna lo sviluppo in serie di Fourier e
// crea una immagine PNG e ne rende disponibile il link
//

// inserisce tutti gli include (funzioni esterne)

if (is_integer(strpos($SERVER_SOFTWARE, "Win")))
{
include("..\Routines\sgn.php");
include("..\Routines\integrale.php");
include("..\Routines\contrFunz.php");
}
else
{
include("../Routines/sgn.php");
include("../Routines/integrale.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);

// parametri di scala 

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

// sviluppo in serie

$a[0] = (1 / pi()) * integrale($funzione, $xa, $xb, $scomp);

For ($i = 1; $i <= $grado; $i++)
{
$rf = "(" . $funzione . ")*cos(" . $i . "*u)";
$a[$i] = (1 / pi()) * integrale($rf, $xa, $xb, $scomp * $i);
$rf = "(" . $funzione . ")*sin(" . $i . "*u)";
$b[$i] = (1 / pi()) * integrale($rf, $xa, $xb, $scomp * $i);
}

//For ($i = 1; $i <= $grado; $i++) // calcola ampiezza e fase per componente tipo A*cos(i*u - f) --> rivedere eventualmente in un secondo tempo
//{
// $amp[$i] = sqrt($a[$i] * $a[$i] + $b[$i] * $b[$i]);
// $fase[$i] = atan($b[$i] / $a[$i]);
//}

$sviluppo = ($a[0] / 2) . "+";
For ($i = 1; $i <= $grado; $i++)
{
$segno = "";
if ($b[$i] >= 0)
{
$segno = "+";
}
$sviluppo = $sviluppo . "(" . $a[$i] . "*cos(" . $i . "*u)";
$sviluppo = $sviluppo . $segno . $b[$i];
$sviluppo = $sviluppo . "*sin(" . $i . "*u))+";
}
$sviluppo = substr($sviluppo, 0, strlen($sviluppo) - 1);

if (is_integer(strpos($sviluppo, "INF")) or is_integer(strpos($sviluppo, "IND")))
{
echo "Attenzione !!! Sviluppo in serie impossibile causa termini infiniti od indeterminati !!!";
return;
}

// 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);
ImageString ($im, 2, 0, $alt + 50, "y = sviluppo in serie di Fourier", $rosso);

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);
}
}

// definizione sviluppo 

$s = $sviluppo;
$s = str_replace("u", '$x', $s);

// disegna sviluppo

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 = @($s);");
$y = $ff;
$yy = 0;
if ($y >= $ya and $y <= $yb)
{
$yy = (abs($yb - $ya) - ($y - $ya)) / $dy;
Imageline ($im, $i, $yy, $i, $yy, $rosso);
}
}

// disegna immagine

$nomefile = $REMOTE_ADDR;
$nomefile = "grafico" . str_replace(".", "-", $nomefile). ".png";

ImagePng ($im, $nomefile); 

// ritorna lo sviluppo in serie

echo "y = " . $funzioneold . "<p>";

echo "Sviluppo in serie di Fourier di valore iniziale " . $xa . " di valore finale " . $xb . " con troncamento per k = " . $grado . " :<p>";

echo "y = " . str_replace("u", "x", $sviluppo) . "<p>";

echo "Attenzione !!! La precisione dello sviluppo dipende dal troncamento per k = " . $grado . " , dalla scomposizione " .
$scomp . " utilizzata per il calcolo degli integrali col metodo dei trapezi e dalla " . 
"precisione interna nel calcolo delle funzioni." . "<p>";

// ritorna il link all'immagine

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>


integrale.php


<script language="php">

error_reporting (E_ALL ^ E_NOTICE);

function integrale($f, $a, $b, $n)
{

// integrale definito col metodo dei trapezi 
// $f = stringa contenente la funzione da integrare f(u)
// $a = primo estremo di integrazione
// $b = secondo estremo di integrazione 
// $n = numero intervalli scomposizione

$dx = ($b - $a) / $n; //incremento x

$f = str_replace("u", '$x', $f);

$somma = 0;
For ($i = 0; $i <= $n; $i++)
{
$x = $a + $i * $dx;
eval("\$ff = @($f);");
if (!is_numeric($ff))
{
$ff = 0;
}
if ($i == 0 or $i == $n)
{
$somma = $somma + $dx * $ff / 2; 

else
{
$somma = $somma + $dx * $ff; 



return $somma;

} // fine integrale()

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