E-school  di  Arrigo Amadori

Calcolo numerico


Trasformata di Fourier

Viene eseguita la trasformata di Fourier     o l'antitrasformata di Fourier  .

L'integrazione è approssimata col metodo dei trapezi sulla scomposizione dell'intervallo    determinata dai pixel.

Per una maggiore precisione, scegliere funzioni con supporto contenuto nell'intervallo  .


 f(x) =  f1(x) + i·f2(x) = + i·

 (fuori dagli estremi asse x le funzioni sono considerate nulle)

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

 xa  =   xb = (estremi asse x )

 ya  =   yb = (estremi asse y)

 

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 :


trasformatadifourier.php


<html>

<head>
<title>Trasformata di Fourier</title>
</head>

<body>

<script language="php">

error_reporting (E_ALL ^ E_NOTICE);

// parametri in input 
//
// $funzione1 = parte reale di f(u)
// $funzione2 = parte immaginaria di 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
// $B1 = esegui trasformata di Fourier
// $B2 = esegui antitrasformata di Fourier
//
// parametri in output
//
// ritorna la trasformata di Fourier o la antitrasformata 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\trasformataFourier.php');
include('..\Routines\antiTrasformataFourier.php');
include("..\Routines\contrFunz.php");
}
else
{
include("../Routines/sgn.php");
include('../Routines/trasformataFourier.php');
include('../Routines/antiTrasformataFourier.php');
include("../Routines/contrFunz.php");
}

// controlli vari

if ($funzione1 == "")
{
echo "Attenzione !!! Manca y = f1(x) !!!";
return;
}
if ($funzione2 == "")
{
echo "Attenzione !!! Manca y = f2(x) !!!";
return;
}

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

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

// parametri di scala 

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

// trasformata

// blocco unico
{
for ($i = 1; $i <= $lar; $i++) 
{
$yyy[$i] = 0; 
$yyy[$lar + $i] = 0; 
}

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

for ($i = 1; $i <= $lar; $i++) 
{
$x = $xa + ($i - 1) * $dx;
$y = 0;
eval("\$ff = @($f);");
$y = $ff;
if (is_integer(strpos($y, "INF")) or is_integer(strpos($y, "IND")))
{
$y = 0; 
}
$yyy[$i] = $y; 
}

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

for ($i = 1; $i <= $lar; $i++) 
{
$x = $xa + ($i - 1) * $dx;
$y = 0;
eval("\$ff = @($f);");
$y = $ff;
if (is_integer(strpos($y, "INF")) or is_integer(strpos($y, "IND")))
{
$y = 0; 
}
$yyy[$lar + $i] = $y; 
}

if ($B1)
{
$ftras = trasformataFourier($yyy, $lar, $xa, $xb);
}
if ($B2)
{
$ftras = antiTrasformataFourier($yyy, $lar, $xa, $xb);
}

for ($i = 1; $i <= $lar; $i++) 
{
$trasformataRe[$i] = $ftras[$i]; 
$trasformataIm[$i] = $ftras[$lar + $i]; 
}
}

// 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 = " . $funzione1old . " + i(" . $funzione2old . ")" , $nero);
if ($B1)
{
ImageString ($im, 2, 0, $alt + 50, "y = componente reale trasformata di Fourier", $rosso);
ImageString ($im, 2, 0, $alt + 70, "y = componente immag. trasformata di Fourier", $blu);
}
if ($B2)
{
ImageString ($im, 2, 0, $alt + 50, "y = componente reale antitrasformata di Fourier", $rosso);
ImageString ($im, 2, 0, $alt + 70, "y = componente immag. antitrasformata di Fourier", $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 = $funzione1;
$f = str_replace("u", '$x', $f);

// disegna parte reale 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);
}
}

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

// disegna parte immaginaria 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 componente reale

for ($i = 0; $i <= $lar; $i++) 
{
$x = $xa + $i * $dx;
$y = $trasformataRe[$i];
$yy = 0;
if ($y >= $ya and $y <= $yb)
{
$yy = (abs($yb - $ya) - ($y - $ya)) / $dy;
Imageline ($im, $i, $yy, $i, $yy, $rosso);
}
}

// disegna componente immaginaria

for ($i = 0; $i <= $lar; $i++) 
{
$x = $xa + $i * $dx;
$y = $trasformataIm[$i];
$yy = 0;
if ($y >= $ya and $y <= $yb)
{
$yy = (abs($yb - $ya) - ($y - $ya)) / $dy;
Imageline ($im, $i, $yy, $i, $yy, $blu);
}
}

// disegna immagine

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

ImagePng ($im, $nomefile); 

// ritorna lo sviluppo in serie

echo "y = " . $funzione1old . " + i(" . $funzione2old . ")<p>";

if ($B1)
{
echo "Trasformata di Fourier di valore iniziale " . $xa . " di valore finale " . $xb . " :<p>";
}
if ($B2)
{
echo "Antitrasformata di Fourier di valore iniziale " . $xa . " di valore finale " . $xb . " :<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>


trasformataFourier.php


<script language="php">

error_reporting (E_ALL ^ E_NOTICE);

function trasformataFourier($f, $n, $xa, $xb)
{
// funzione trasformataFourier: esegue la trasformata di Fourier
//
// variabili in input :
// $f = vettore contenente parte reale e parte immaginaria funzione di cui fare la trasformata
// $f[1] ... $f[$n] = immagini parte reale di f
// $f[$n+1] ... $f[$n+$n] = immagini parte immaginaria di f
// $n = numero immagini funzione parte reale e stesso numero per parte immaginaria
// $xa = estremo sinistro dominio funzione
// $xb = estremo destro dominio funzione
// variabili in output :
// $trasf[1] ... $trasf[$n] = immagini parte reale della trasformata di f
// $trasf[$n+1] ... $trasf[$n+$n] = immagini parte della trasformata di f

for ($i = 1; $i <= $n; $i++) 
{
$trasf[$i] = 0;
}
for ($i = 1; $i <= $n; $i++) 
{
$trasf[$n + $i] = 0;
}

$dx = ($xb - $xa) / ($n - 1); 

for ($i = 1; $i <= $n; $i++) 
{
$x = $xa + ($i - 1) * $dx; 
$s1 = 0;
$s2 = 0;
for ($j = 1; $j <= $n; $j++) 
{
$y = $xa + ($j - 1) * $dx; 
$s1 = $s1 + cos($x * $y) * $f[$j] - sin($x * $y) * $f[$n + $j];
$s2 = $s2 + cos($x * $y) * $f[$n + $j] + sin($x * $y) * $f[$j];
}
$s1 = $s1 - (cos($x * $xa) * $f[1] - sin($x * $xa) * $f[$n + 1]) / 2 - 
(cos($x * $xb) * $f[$n] - sin($x * $xb) * $f[$n + $n]) / 2; 
$trasf[$i] = $dx * $s1;
$s2 = $s2 - (cos($x * $xa) * $f[$n + 1] + sin($x * $xa) * $f[1]) / 2 - 
(cos($x * $xb) * $f[$n + $n] + sin($x * $xb) * $f[$n]) / 2; 
$trasf[$n + $i] = $dx * $s2;
}

return $trasf;

} // fine trasformataFourier()

</script>


antiTrasformataFourier.php


<script language="php">

error_reporting (E_ALL ^ E_NOTICE);

function antiTrasformataFourier($f, $n, $xa, $xb)
{
// funzione trasformataFourier: esegue la antitrasformata di Fourier
//
// variabili in input :
// $f = vettore contenente parte reale e parte immaginaria funzione di cui fare la antitrasformata
// $f[1] ... $f[$n] = immagini parte reale di f
// $f[$n+1] ... $f[$n+$n] = immagini parte immaginaria di f
// $n = numero immagini funzione parte reale e stesso numero per parte immaginaria
// $xa = estremo sinistro dominio funzione
// $xb = estremo destro dominio funzione
// variabili in output :
// $antitrasf[1] ... $antitrasf[$n] = immagini parte reale della antitrasformata di f
// $antitrasf[$n+1] ... $antitrasf[$n+$n] = immagini parte della trasformata di f

for ($i = 1; $i <= $n; $i++) 
{
$antitrasf[$i] = 0;
}
for ($i = 1; $i <= $n; $i++) 
{
$antitrasf[$n + $i] = 0;
}

$dx = ($xb - $xa) / ($n - 1); 

for ($i = 1; $i <= $n; $i++) 
{
$x = $xa + ($i - 1) * $dx; 
$s1 = 0;
$s2 = 0;
for ($j = 1; $j <= $n; $j++) 
{
$y = $xa + ($j - 1) * $dx; 
$s1 = $s1 + cos($x * $y) * $f[$j] + sin($x * $y) * $f[$n + $j];
$s2 = $s2 + cos($x * $y) * $f[$n + $j] - sin($x * $y) * $f[$j];
}
$s1 = $s1 - (cos($x * $xa) * $f[1] + sin($x * $xa) * $f[$n + 1]) / 2 - 
(cos($x * $xb) * $f[$n] + sin($x * $xb) * $f[$n + $n]) / 2; 
$antitrasf[$i] = $dx * $s1 / (2 * pi());
$s2 = $s2 - (cos($x * $xa) * $f[$n + 1] - sin($x * $xa) * $f[1]) / 2 - 
(cos($x * $xb) * $f[$n + $n] - sin($x * $xb) * $f[$n]) / 2; 
$antitrasf[$n + $i] = $dx * $s2 / (2 * pi());
}

return $antitrasf;

} // fine antiTrasformataFourier()

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