E-school  di  Arrigo Amadori

Calcolo numerico


Derivata prima parziale simbolica

Viene eseguita la derivata parziale    della funzione numerica reale a quattro variabili    . 

La derivata è calcolata utilizzando le tecniche del calcolo simbolico per cui il risultato è esso stesso una funzione. Tale risultato non è semplificato e ridotto ai minimi termini.


 f(u,v,y,z) =  

 

Regole :

 1 - le variabili ammesse sono : u (variabile su cui si effettua la derivazione), v, y, z
 2 - gli operatori aritmetici ammessi sono : +, -, *, /
 3 - non devono esistere spazi bianchi all'interno della funzione 
 4 - usare solo le parentesi tonde
 5 - per i numeri decimali oltre lo zero utilizzare il punto (.)
 6 - le funzioni permesse sono : sin() cos() tan() atan() sqrt() log() exp() 
 7 - La funzione potenza è :  pow(base, esponente)
 8 - non sono ammessi esponenti contenenti le variabili 

Sorgenti PHP :


derivataprimaparzialesimbolica.php


<html>

<head>
<title>Derivata prima parziale simbolica</title>
</head>

<body>

<script language="php">

error_reporting (E_ALL ^ E_NOTICE);

// parametri in input 
//
// $funz = f(u)
//
// parametri in output
//
// visualizza la derivata simbolica
//

// programma ==========================================================================================

// inserisce tutti gli include (funzioni esterne)

if (is_integer(strpos($SERVER_SOFTWARE, "Win")))
{
include("..\Routines\derivataParz.php");
include("..\Routines\daPowAVb.php");
include("..\Routines\daVbAPow.php");
include("..\Routines\derivataMonom.php");
include("..\Routines\semplEspr.php");
include("..\Routines\contrFunz.php");
}
else
{
include("../Routines/derivataParz.php");
include("../Routines/daPowAVb.php");
include("../Routines/daVbAPow.php");
include("../Routines/derivataMonom.php");
include("../Routines/semplEspr.php");
include("../Routines/contrFunz.php");

}

// controlli vari

if ($funz == "")
{
echo "Attenzione !!! Manca funzione !!!";
return;
}

$funz = trim($funz);

$contr = contrFunz($funz);


if ($contr == "1")

{
echo "Attenzione !!! La funzione presenta spazi bianchi, impossibile procedere !!!";
return;
}

if ($contr == "2")
{
echo "Attenzione !!! La funzione presenta il carattere ^, impossibile procedere !!! Usare la funzione pow(... , ...) !!!";
return;
}

// esecuzione

echo "f = " . $funz . "<p>";
echo "df/du = " . derivataParz($funz, "u") . "<p>";

</script>

</body>

</html>


derivataParz.php


<script language="php">

error_reporting (E_ALL ^ E_NOTICE);

function derivataParz($funz, $var)
{
//
// Attenzione !!! la rourine è compatibile con Visual Basic, per cui l'operatore potenza è ^
//
// calcolo della derivata parziale prima
// in forma simbolica
// col metodo delle catene lincate
//
// funz = stringa che contiene la funzione da derivare
// var = variabile rispetto alla quale eseguire la derivata parziale
//
// la funziona ritorna la derivata in forma simbolica
//
// vettori utilizzati per al gestione dei blocchi :
//
// tipoBloc() = tipo blocco : M = blocco monomio
// () = " parentesi (non può essere l'argomento
// di nessuna funzione)
// sin = " seno
// cos = " coseno
// tan = " tangente
// atn = " arcotangente
// sqr = " radice quadrata
// log = " logaritmo
// exp = " esponenziale
// ^ numero = " potenza (l'esponente deve essere
// un numero o una espressione
// numerica senza incognite
// SEMPRE contenuto fra parentesi)
// (la base, se è una funzione, 
// deve SEMPRE sempre
// contenuta fra parentesi !!!
// es. cos(u)^2 è errato !!!
// (cos(u))^(2) è corretto !!!
// posIni() = posizione iniziale del blocco nella stringa
// posFin() = " finale " " " "
// (per i blocchi tipo monomio --> 2*u^(3) : posizione primo carattere - posizione ultimo carattere
// ( " " " " parentesi --> (...) : posizione prima parentesi - posizione ultima parentesi
// ( " " " " funzione non ^ --> sin(...) : posizione prima lettera nome funzione - posizione ultima parentesi
// ( " " " " funzione ^ --> (...)^(2): posizione prima parentesi argomento - posizione ultima parentsi argomento
// arg() = arcgomento funzione contenuta nel blocco
// fun() = funzione contenuta nel blocco
// derArg() = derivata argomento funzione contenuta nel blocco
// derFun() = derivata funzione contenuta nel blocco
// tipoLink() = tipo link : + = link somma
// - = link sottrazione
// * = link moltiplicazione
// / = link divisione
// T = link trasporto
// blocLink() = numero del blocco lincato

// trasforma pow() in ()^() (per compatibilità da PHP a Visual Basic)

$funz = daPowAVb($funz);

// uscita se la funzione non contiene la variabile rispetto alla quale derivare

If (!is_integer(strpos($funz, $var)))
{
return 0;
}

// setta variabili di comodo ---------------------------------------

$rf = trim($funz);
$rv = trim($var);

// gestione degli eventuali segni all'inizio della funzione e all'inizio di ogni
// blocco parentesi e funzione
//
// +... --> 0+...
// -... --> 0-...
// ...(+... --> ...(0+...
// ...(-... --> ...(0-...
// ...sin(+... --> ...sin(0+...
// ...sin(-... --> ...sin(0-...
//
// escluso il caso ^(...

$c = substr($rf, 0, 1);
If ($c == "+" Or $c == "-") 
{
$rf = "0" . $rf;
}
Do
{
$contr = 0;
For ($i = 1; $i <= strlen($rf); $i++)
{
$c = substr($rf, $i - 1, 1);
$cc = "";
If ($i > 1) 
{
$cc = substr($rf, $i - 2, 1);
}
If (strpos($rf, "(+", $i - 1) === $i - 1 And $cc <> "^") 
{
$rf = substr($rf, 0, $i - 1) . "(0+" . substr($rf, $i + 1);
$contr = 1;
break;
}
If (strpos($rf, "(-", $i - 1) === $i - 1 And $cc <> "^") 
{
$rf = substr($rf, 1 - 1, $i - 1) . "(0-" . substr($rf, $i + 1); 
$contr = 1;
break;
}
}
If ($contr == 0) 
{
break;

} while (TRUE);

// ricerca monomi --------------------------------------------------

$nBloc = 0;
$rrf = "";
$par = 0;
$contr = 0;
For ($i = 1; $i <= strlen($rf); $i++)
{
$c = substr($rf, $i - 1, 1);
$cc = "";
If ($i < strlen($rf)) 
{
$cc = substr($rf, $i, 1);

If ($c == "(") 
{
$par = $par + 1;

If ($c == ")") 
{
$par = $par - 1;

If ($c == "^" And $cc == "(") 
{
$contr = 1;

If (($c == "+" Or $c == "-" Or $c == "*" Or $c == "/" Or $c == "(" Or $c == ")") And $contr == 0) 
{
$nBloc = $nBloc + 1;
$posIni[$nBloc] = $i - strlen($rrf);
$posFin[$nBloc] = $i - 1;
$tipoBloc[$nBloc] = "M";
$arg[$nBloc] = $rrf;
$fun[$nBloc] = $rrf;
$rrf = "";

ElseIf ($c == ")" And $contr == 1) 
{
$rrf = $rrf . $c;
$nBloc = $nBloc + 1;
$posIni[$nBloc] = $i - strlen($rrf) + 1;
$posFin[$nBloc] = $i;
$tipoBloc[$nBloc] = "M";
$arg[$nBloc] = $rrf;
$fun[$nBloc] = $rrf;
$rrf = "";
$contr = 0;

Else
{
$rrf = $rrf . $c;


If ($rrf <> "") 
{
$nBloc = $nBloc + 1;
$posIni[$nBloc] = $i - strlen($rrf);
$posFin[$nBloc] = $i - 1;
$tipoBloc[$nBloc] = "M";
$arg[$nBloc] = $rrf;
$fun[$nBloc] = $rrf;


// scarta i falsi monomi

For ($i = 1; $i <= $nBloc; $i++)
{
If ($tipoBloc[$i] == "M") 
{
If ($fun[$i] == "" Or 
$fun[$i] == "sin" Or $fun[$i] == "cos" Or $fun[$i] == "tan" Or $fun[$i] == "atan" Or 
$fun[$i] == "sqrt" Or $fun[$i] == "log" Or $fun[$i] == "exp" Or 
substr($fun[$i], 0, 1) == "^") 
{
$posIni[$i] = "";
$posFin[$i] = "";
$tipoBloc[$i] = "";
$arg[$i] = "";
$fun[$i] = "";



For ($i = 1; $i <= $nBloc; $i++)
{
If ($tipoBloc[$i] == "M") 
{
For ($j = $posIni[$i]; $j >= 1; $j--)
{
$c = substr($rf, $j - 1, 1);
If ($c == "(" Or $c == ")") 
{
break;


If ($j > 1) 
{
If (substr($rf, $j - 2, 1) == "^") 
{
$posIni[$i] = "";
$posFin[$i] = "";
$tipoBloc[$i] = "";
$arg[$i] = "";
$fun[$i] = "";
}




// ricerca blocchi parentesi -------------------------------------------------

For ($i = 1; $i <= strlen($rf); $i++)
{
$c = substr($rf, $i - 1, 1);
$c1 = "";
If ($i > 1) 
{
$c1 = substr($rf, $i - 2, 1);

If ($c == "(") 
{
$nBloc = $nBloc + 1;
$posIni[$nBloc] = $i;
$tipoBloc[$nBloc] = "()";
$par = 1;
For ($j = $i + 1; $j <= strlen($rf); $j++)
{
$c1 = substr($rf, $j - 1, 1);
If ($c1 == "(") 
{
$par = $par + 1;

If ($c1 == ")") 
{
$par = $par - 1;
}
If ($c1 == ")" And $par == 0) 
{
$posFin[$nBloc] = $j;
break;
}




// scarta i falsi blocchi parentesi

For ($i = 1; $i <= $nBloc; $i++)
{
If ($tipoBloc[$i] == "()") 
{
$c = "";
$c1 = "";
$ccc = "";
$cccc = "";
If ($posFin[$i] < strlen($rf)) 
{
$c = substr($rf, $posFin[$i], 1);

If ($posIni[$i] > 1) 
{
$c1 = substr($rf, $posIni[$i] - 2, 1);

If ($posIni[$i] > 3) 
{
$ccc = substr($rf, $posIni[$i] - 4, 3);

If ($posIni[$i] > 4) 
{
$cccc = substr($rf, $posIni[$i] - 5, 4);

If ($c == "^" Or $c1 == "^" Or 
$ccc == "sin" Or $ccc == "cos" Or 
($ccc == "tan" and $cccc <> "a") Or /* tangente */
($ccc == "tan" and $cccc == "a") Or /* arcotangente */
$ccc == "qrt" Or $ccc == "log" Or $ccc == "exp") 
{
$posIni[$i] = "";
$posFin[$i] = "";
$tipoBloc[$i] = "";
$arg[$i] = "";
$fun[$i] = "";
}

}

// ricerca blocchi funzione -------------------------------------------------

For ($i = 1; $i <= strlen($rf); $i++)
{
If (strpos($rf, "sin", $i - 1) === $i - 1) 
{
$nBloc = $nBloc + 1;
$tipoBloc[$nBloc] = "sin";
$posIni[$nBloc] = $i;
$par = 0;
For ($j = $i; $j <= strlen($rf); $j++)
{
$c = substr($rf, $j - 1, 1);
If ($c == "(") 
{
$par = $par + 1;
}
If ($c == ")") 
{
$par = $par - 1;
}
If ($c == ")" And $par == 0) 
{
break;
}
}
$posFin[$nBloc] = $j;
}
}
For ($i = 1; $i <= strlen($rf); $i++)
{
If (strpos($rf, "cos", $i - 1) === $i - 1) 
{
$nBloc = $nBloc + 1;
$tipoBloc[$nBloc] = "cos";
$posIni[$nBloc] = $i;
$par = 0;
For ($j = $i; $j <= strlen($rf); $j++)
{
$c = substr($rf, $j - 1, 1);
If ($c == "(") 
{
$par = $par + 1;
}
If ($c == ")") 
{
$par = $par - 1;
}
If ($c == ")" And $par == 0) 
{
break;
}
}
$posFin[$nBloc] = $j;
}
}
For ($i = 1; $i <= strlen($rf); $i++)
{
If (strpos($rf, "tan", $i - 1) === $i - 1 and substr($rf, $i - 2, 1) <> "a")
{
$nBloc = $nBloc + 1;
$tipoBloc[$nBloc] = "tan";
$posIni[$nBloc] = $i;
$par = 0;
For ($j = $i; $j <= strlen($rf); $j++)
{
$c = substr($rf, $j - 1, 1);
If ($c == "(") 
{
$par = $par + 1;
}
If ($c == ")") 
{
$par = $par - 1;
}
If ($c == ")" And $par == 0) 
{
break;
}
}
$posFin[$nBloc] = $j;
}
}
For ($i = 1; $i <= strlen($rf); $i++)
{
If (strpos($rf, "atan", $i - 1) === $i - 1) 
{
$nBloc = $nBloc + 1;
$tipoBloc[$nBloc] = "atan";
$posIni[$nBloc] = $i;
$par = 0;
For ($j = $i; $j <= strlen($rf); $j++)
{
$c = substr($rf, $j - 1, 1);
If ($c == "(") 
{
$par = $par + 1;
}
If ($c == ")") 
{
$par = $par - 1;
}
If ($c == ")" And $par == 0) 
{
break;
}
}
$posFin[$nBloc] = $j;
}
}
For ($i = 1; $i <= strlen($rf); $i++)
{
If (strpos($rf, "sqrt", $i - 1) === $i - 1) 
{
$nBloc = $nBloc + 1;
$tipoBloc[$nBloc] = "sqrt";
$posIni[$nBloc] = $i;
$par = 0;
For ($j = $i; $j <= strlen($rf); $j++)
{
$c = substr($rf, $j - 1, 1);
If ($c == "(") 
{
$par = $par + 1;
}
If ($c == ")") 
{
$par = $par - 1;
}
If ($c == ")" And $par == 0) 
{
break;
}
}
$posFin[$nBloc] = $j;
}
}
For ($i = 1; $i <= strlen($rf); $i++)
{
If (strpos($rf, "log", $i - 1) === $i - 1) 
{
$nBloc = $nBloc + 1;
$tipoBloc[$nBloc] = "log";
$posIni[$nBloc] = $i;
$par = 0;
For ($j = $i; $j <= strlen($rf); $j++)
{
$c = substr($rf, $j - 1, 1);
If ($c == "(") 
{
$par = $par + 1;
}
If ($c == ")") 
{
$par = $par - 1;
}
If ($c == ")" And $par == 0) 
{
break;
}
}
$posFin[$nBloc] = $j;
}
}
For ($i = 1; $i <= strlen($rf); $i++)
{
If (strpos($rf, "exp", $i - 1) === $i - 1) 
{
$nBloc = $nBloc + 1;
$tipoBloc[$nBloc] = "exp";
$posIni[$nBloc] = $i;
$par = 0;
For ($j = $i; $j <= strlen($rf); $j++)
{
$c = substr($rf, $j - 1, 1);
If ($c == "(") 
{
$par = $par + 1;
}
If ($c == ")") 
{
$par = $par - 1;
}
If ($c == ")" And $par == 0) 
{
break;
}
}
$posFin[$nBloc] = $j;
}
}
For ($i = 1; $i <= strlen($rf); $i++)
{
If (strpos($rf, ")^", $i - 1) === $i - 1) 
{
$rrf = "";
$par = 0;
For ($j = $i + 1; $j <= strlen($rf); $j++)
{
$c1 = substr($rf, $j - 1, 1);
If ($c1 == "(") 
{
$par = $par + 1;
}
If ($c1 == ")") 
{
$par = $par - 1;
}
If ($par == -1) 
{
break;
}
If (($c1 == "+" Or $c1 == "-" Or $c1 == "*" Or $c1 == "/") And $par == 0) 
{
break;
}
Else
{
$rrf = $rrf . $c1;
}
}
$nBloc = $nBloc + 1;
$tipoBloc[$nBloc] = $rrf;
$par = -1;
For ($j = $i - 1; $j >= 1; $j--)
{
$c = substr($rf, $j - 1, 1);
If ($c == "(") 
{
$par = $par + 1;
}
If ($c == ")") 
{
$par = $par - 1;
}
If ($c == "(" And $par == 0) 
{
break;
}
}
$posIni[$nBloc] = $j;
$posFin[$nBloc] = $i;
}
}

// determina blocco iniziale ---------------------------------------------------------

$bini = 0;
For ($i = 1; $i <= $nBloc; $i++)
{
If ($posIni[$i] == 1) 
{
$bini = $i;
break;
}
}

// ricerca links monomi ---------------------------------------------------------

For ($i = 1; $i <= $nBloc; $i++)
{
If ($tipoBloc[$i] == "M") 
{
If ($posFin[$i] < strlen($rf)) 
{
If (substr($rf, $posFin[$i], 1) == ")") 
{
For ($j = 1; $j <= $nBloc; $j++)
{
If ($posFin[$j] == $posFin[$i] + 1) 
{
$tipoLink[$i] = "T";
$blocLink[$i] = $j;
break;
}
}
}
}
If (substr($rf, $posFin[$i], 1) == "+") 
{
For ($j = 1; $j <= $nBloc; $j++)
{
If ($posIni[$j] == $posFin[$i] + 2) 
{
$tipoLink[$i] = "+";
$blocLink[$i] = $j;
break;
}
}
}
If (substr($rf, $posFin[$i], 1) == "-") 
{
For ($j = 1; $j <= $nBloc; $j++)
{
If ($posIni[$j] == $posFin[$i] + 2) 
{
$tipoLink[$i] = "-";
$blocLink[$i] = $j;
break;
}
}
}
If (substr($rf, $posFin[$i], 1) == "*") 
{
For ($j = 1; $j <= $nBloc; $j++)
{
If ($posIni[$j] == $posFin[$i] + 2) 
{
$tipoLink[$i] = "*";
$blocLink[$i] = $j;
break;
}
}
}
If (substr($rf, $posFin[$i], 1) == "/") 
{
For ($j = 1; $j <= $nBloc; $j++)
{
If ($posIni[$j] == $posFin[$i] + 2) 
{
$tipoLink[$i] = "/";
$blocLink[$i] = $j;
break;
}
}
}
}
}

// ricerca links blocchi parentesi ----------------------------------------------

For ($i = 1; $i <= $nBloc; $i++)
{
If ($tipoBloc[$i] == "()") 
{
$c = "";
If ($posFin[$i] < strlen($rf)) 
{
$c = substr($rf, $posFin[$i], 1);
}
If ($c == "+" Or $c == "-" Or $c == "*" Or $c == "/") 
{
For ($j = 1; $j <= $nBloc; $j++)
{
If ($posIni[$j] == $posFin[$i] + 2) 
{
$tipoLink[$i] = $c;
$blocLink[$i] = $j;
break;
}
}
}
If ($c == ")") 
{
For ($j = 1; $j <= $nBloc; $j++)
{
If ($posFin[$j] == $posFin[$i] + 1) 
{
$tipoLink[$i] = "T";
$blocLink[$i] = $j;
break;
}
}
}
}
}


// ricerca links blocchi funzione ----------------------------------------------

For ($i = 1; $i <= $nBloc; $i++)
{
If ($tipoBloc[$i] == "sin" Or $tipoBloc[$i] == "cos" Or $tipoBloc[$i] == "tan" Or 
$tipoBloc[$i] == "atan" Or $tipoBloc[$i] == "sqrt" Or $tipoBloc[$i] == "log" Or 
$tipoBloc[$i] == "exp") 
{
$c = "";
If ($posFin[$i] < strlen($rf)) 
{
$c = substr($rf, $posFin[$i], 1);
}
If ($c == "+" Or $c == "-" Or $c == "*" Or $c == "/") 
{
For ($j = 1; $j <= $nBloc; $j++)
{
If ($posIni[$j] == $posFin[$i] + 2) 
{
$tipoLink[$i] = $c;
$blocLink[$i] = $j;
break;
}
}
}
If ($c == ")") 
{
For ($j = 1; $j <= $nBloc; $j++)
{
If ($posFin[$j] == $posFin[$i] + 1) 
{
$tipoLink[$i] = "T";
$blocLink[$i] = $j;
break;
}
}
}
}
If (substr($tipoBloc[$i], 0, 1) == "^") 
{
$c = "";
$posc = 0;
If ($posFin[$i] + strlen($tipoBloc[$i]) < strlen($rf)) 
{
$c = substr($rf, $posFin[$i] + strlen($tipoBloc[$i]), 1);
$posc = $posFin[$i] + strlen($tipoBloc[$i]) + 1;
}
If ($c == "+" Or $c == "-" Or $c == "*" Or $c == "/") 
{
For ($j = 1; $j <= $nBloc; $j++)
{
If ($posIni[$j] == $posc + 1) 
{
$tipoLink[$i] = $c;
$blocLink[$i] = $j;
break;
}
}
}
If ($c == ")") 
{
For ($j = 1; $j <= $nBloc; $j++)
{
If ($posFin[$j] == $posc) 
{
$tipoLink[$i] = "T";
$blocLink[$i] = $j;
break;
}
}
}
}
}

// calcola derivata monomi -----------------------------------------------------

For ($i = 1; $i <= $nBloc; $i++)
{
If ($tipoBloc[$i] == "M") 
{
$derArg[$i] = derivataMonom($arg[$i], $rv);
$derFun[$i] = $derArg[$i];
}
}

// cerca sequenze derivate -----------------------------------------------------

// trova gli inizi delle sequenze derivate

$nSeq = 0;
For ($i = 1; $i <= $nBloc; $i++)
{
If ($tipoBloc[$i] <> "") 
{
$contr = 0;
For ($j = 1; $j <= $nBloc; $j++) 
{
If ($blocLink[$j] == $i) 
{
$contr = 1;
break;
}
}
If ($contr == 0) 
{
$nSeq = $nSeq + 1;
$seqDer[$nSeq] = $i;
}
}
}

// completa ogni sequenza

For ($i = 1; $i <= $nSeq; $i++)
{
$b = $blocLink[$seqDer[$i]];
$t = $tipoLink[$seqDer[$i]];
$seqDer[$i] = $seqDer[$i] . $t . $b;
$possTrasp = 0;
If ($t == "T") 
{
For ($j = 1; $j <= $nBloc; $j++)
{
If ($blocLink[$j] == $b And ($tipoLink[$j] == "+" Or $tipoLink[$j] == "-" Or 
$tipoLink[$j] == "*" Or $tipoLink[$j] == "/")) 
{
$possTrasp = 1;
break;
}
}
}
If ($b <> "") 
{
Do
{
$t = $tipoLink[$b];
If ($t == "T" And $possTrasp == 1) 
{
break;

If ($t <> "T" And $possTrasp == 1) 
{
break;

$b = $blocLink[$b];
If ($b == "") 
{
break;

$seqDer[$i] = $seqDer[$i] . $t . $b;
$possTrasp = 0;
If ($t == "T") 
{
For ($j = 1; $j <= $nBloc; $j++)
{
If ($blocLink[$j] == $b And ($tipoLink[$j] == "+" Or $tipoLink[$j] == "-" Or 
$tipoLink[$j] == "*" Or $tipoLink[$j] == "/")) 
{
$possTrasp = 1;
break;



} while(TRUE);
}
}

// crea una sequenza distinta per ogni "T"

Do
{
$contr = 0;
For ($i = 1; $i <= $nSeq; $i++)
{
If (is_integer(strpos($seqDer[$i], "T"))) 
{
For ($j = 1; $j <= strlen($seqDer[$i]); $j++)
{
$c = substr($seqDer[$i], $j - 1, 1);
If ($c == "T") 
{
$rrf = "";
For ($k = $j + 1; $k <= strlen($seqDer[$i]); $k++)
{
$cc = substr($seqDer[$i], $k - 1, 1);
If ($cc == "+" Or $cc == "-" Or $cc == "*" Or $cc == "/" Or $cc == "T") 
{
break;
}
$rrf = $rrf . $cc;
}
$rrf1 = substr($seqDer[$i], 0, $j + strlen($rrf));
$rrf2 = substr($seqDer[$i], $j);
If (is_integer(strpos($rrf2, "+")) Or 
is_integer(strpos($rrf2, "-")) Or 
is_integer(strpos($rrf2, "*")) Or 
is_integer(strpos($rrf2, "/")) Or 
is_integer(strpos($rrf2, "T"))) 
{
$nSeq = $nSeq + 1;
$seqDer[$i] = $rrf1;
$seqDer[$nSeq] = $rrf2;
$contr = 1;
}
}
}
}
}
If ($contr == 0)
{
break;
}
} while(TRUE);


// determina le formule di derivazione all'interno delle sequenze
// utilizzando gli operatori simbolici di derivata []
// e determina i trasporti

For ($i = 1; $i <= $nSeq; $i++)
{
$j = strpos($seqDer[$i], "T");
If (is_integer($j)) 
{
$funzioni[$i] = substr($seqDer[$i], 0, $j);
$derivate[$i] = "[" . substr($seqDer[$i], 0, $j) . "]";
$trasporto[$i] = substr($seqDer[$i], $j + 1);
}
Else
{
$funzioni[$i] = $seqDer[$i];
$derivate[$i] = "[" . $seqDer[$i] . "]";
$trasporto[$i] = "";
}
}

// scompone le somme e sottrazioni : [A+B] = [A]+[B]

Do
{
$contr = 0;
For ($i = 1; $i <= $nSeq; $i++)
{
For ($j = 1; $j <= strlen($derivate[$i]); $j++)
{
$c = substr($derivate[$i], $j - 1, 1);
If ($c == "+" Or $c == "-") 
{
For ($k = $j + 1; $k <= strlen($derivate[$i]); $k++)
{
$cc = substr($derivate[$i], $k - 1, 1);
If ($cc == "[" Or $cc == "]") 
{
If ($cc == "[") 
{
$dentro = 0;
break;

If ($cc == "]") 
{
$dentro = 1;
break;



If ($dentro == 1) 
{
$derivate[$i] = substr($derivate[$i], 0, $j - 1) . "]" . $c . "[" . substr($derivate[$i], $j);
$contr = 1;
break;




If ($contr == 0) 
{
break;

} while(TRUE);

// individua i prodotti

$nprod = 0;
For ($i = 1; $i <= $nSeq; $i++)
{
For ($j = 1; $j <= strlen($derivate[$i]); $j++)
{
$c = substr($derivate[$i], $j - 1, 1);
$rrf = "";
If ($c == "[") 
{
For ($k = $j + 1; $k <= strlen($derivate[$i]); $k++)
{
$cc = substr($derivate[$i], $k - 1, 1);
If ($cc == "]") 
{
break;

$rrf = $rrf . $cc;

If (is_integer(strpos($rrf, "*")) Or is_integer(strpos($rrf, "/"))) 
{
$nprod = $nprod + 1;
$prod[$nprod] = $rrf;
$prodSeq[$nprod] = $i;
$prodSegno[$nprod] = "";
If ($j > 1) 
{
$prodSegno[$nprod] = substr($derivate[$i], $j - 2, 1);

$prodIni[$nprod] = $j + 1;
$prodFin[$nprod] = $k - 1;





// determina i fattori dei singoli prodotti trasformando i rapporti in fattori ed
// imposta la derivata dei prodotti : [A*B*C...]=[A]*B*C... + A*[B]*C... + A*B*[C]...
// se sono presenti dei rapporti trasformati in prodotti la formula diventa del tipo
// [A/B]=[A*(1/B)]=[A]*(1/B)+A*[(1/B)]

For ($i = 1; $i <= $nprod; $i++)
{
$nfatt = 0;
$rrf = "";
For ($j = 1; $j <= strlen($prod[$i]); $j++)
{
$c = substr($prod[$i], $j - 1, 1);
If ($c == "*" Or $c == "/") 
{
$nfatt = $nfatt + 1;
$moltDiv[$nfatt] = $c;
$fatt[$nfatt] = $rrf;
$rrf = "";

Else
{
$rrf = $rrf . $c;


$nfatt = $nfatt + 1;
$moltDiv[$nfatt] = "";
$fatt[$nfatt] = $rrf;
$rrf = "";
For ($j = 1; $j <= $nfatt - 1; $j++)
{
If ($moltDiv[$j] == "/") 
{
$moltDiv[$j] = "*";
$fatt[$j + 1] = "(1/" . $fatt[$j + 1] . ")";


For ($j = 1; $j <= $nfatt; $j++)
{
$rrrf = "";
For ($k = 1; $k <= $nfatt; $k++)
{
$a = "";
if ($k <> $nfatt)
{
$a = "*";

If ($k == $j) 
{
$rrrf = $rrrf . "[" . $fatt[$k] . "]" . $a;

Else
{
$rrrf = $rrrf . $fatt[$k] . $a;


If ($prodSegno[$i] == "") 
{
$segno = "+";

Else
{
$segno = $prodSegno[$i];

$rrf = $rrf . $segno . $rrrf;

If (substr($rrf, 0, 1) == "+" Or substr($rrf, 0, 1) == "-") 
{
$rrf = substr($rrf, 1);

$rprod[$i] = $rrf;


// esegue le trasformazioni del tipo
// [A/B]=[A*(1/B)]=[A]*(1/B)+A*[(1/B)] --> [A]/B+A*(-1)*[B]*B^(-2)

// [A]*(1/B) --> [A]/B

Do
{
$contr = 0;
For ($i = 1; $i <= $nprod; $i++)
{
If (is_integer(strpos($rprod[$i], "/"))) 
{
For ($j = 1; $j <= strlen($rprod[$i]); $j++)
{
If (strpos($rprod[$i], "*(", $j - 1) === $j - 1) 
{
$i1 = $j;
$rrf = "";
For ($k = $i1; $k <= strlen($rprod[$i]); $k++)
{
$c = substr($rprod[$i], $k - 1, 1);
$rrf = $rrf . $c;
If ($c == ")") 
{
$i2 = $k;
break;


$rrrf = substr($rrf, strpos($rrf, "/"), strlen($rrf) - 4);
$rprod[$i] = substr($rprod[$i], 0, $i1 - 1) . $rrrf . substr($rprod[$i], $i2);
$contr = 1;
break;




If ($contr == 0) 
{
break;

} while(TRUE);

// A*[(1/B)] --> A*(-1)*[B]*B^(-2)

Do
{
$contr = 0;
For ($i = 1; $i <= $nprod; $i++)
{
If (is_integer(strpos($rprod[$i], "/"))) 
{
For ($j = 1; $j <= strlen($rprod[$i]); $j++)
{
If (strpos($rprod[$i], "[(", $j - 1) === $j - 1) 
{
$i1 = $j;
$rrf = "";
For ($k = $i1; $k <= strlen($rprod[$i]); $k++)
{
$c = substr($rprod[$i], $k - 1, 1);
$rrf = $rrf . $c;
If ($c == "]") 
{
$i2 = $k;
break;
}

$rrf1 = substr($rrf, strpos($rrf, "/") + 1, strlen($rrf) - 6);
$rrrf = "(-1)*[" . $rrf1 . "]*(" . $rrf1 . ")^(-2)";
$rprod[$i] = substr($rprod[$i], 0, $i1 - 1) . $rrrf . substr($rprod[$i], $i2);
$contr = 1;
break;




If($contr == 0) 
{
break;

} while(TRUE);

// ricostruzione delle sequenze derivate

For ($i = 1; $i <= $nprod; $i++)
{
$derivate[$prodSeq[$i]] = substr($derivate[$prodSeq[$i]], 0, $prodIni[$i] - 2) . $rprod[$i] . 
substr($derivate[$prodSeq[$i]], $prodFin[$i] + 1);
$delta = strlen($rprod[$i]) - $prodFin[$i] + $prodIni[$i] - 3;
For ($j = $i + 1; $j <= $nprod; $j++)
{
If ($prodSeq[$j] == $prodSeq[$i]) 
{
$prodIni[$j] = $prodIni[$j] + $delta;
$prodFin[$j] = $prodFin[$j] + $delta;




// creazione funzione risultato ------------------------------------------------

$funzione0 = "";
Do
{
$contr = 0;
For ($i = 1; $i <= $nSeq; $i++)
{
$nTerm = 0;
$rrf = "";
For ($j = 1; $j <= strlen($funzioni[$i]); $j++)
{
$c = substr($funzioni[$i], $j - 1, 1);
If ($c == "+" Or $c == "-" Or $c == "*" Or $c == "/") 
{
$nTerm = $nTerm + 1;
$term[$nTerm] = $rrf;
$oper[$nTerm] = $c;
$rrf = "";

Else
{
$rrf = $rrf . $c;


$nTerm = $nTerm + 1;
$term[$nTerm] = $rrf;
$oper[$nTerm] = "";
$rrf = "";
$incompleto = 0;
For ($j = 1; $j <= $nTerm; $j++)
{
If ($fun[$term[$j]] == "") 
{
$incompleto = 1;
break;

$rrf = $rrf . $fun[$term[$j]] . $oper[$j];

If ($incompleto == 0) 
{
If ($trasporto[$i] <> "") 
{
If ($arg[$trasporto[$i]] == "") 
{
$contr = 1;
$arg[$trasporto[$i]] = $rrf;
If ($tipoBloc[$trasporto[$i]] == "()") 
{
$fun[$trasporto[$i]] = "(" . $rrf . ")";

If ($tipoBloc[$trasporto[$i]] == "sin") 
{
$fun[$trasporto[$i]] = "sin(" . $rrf . ")";

If ($tipoBloc[$trasporto[$i]] == "cos") 
{
$fun[$trasporto[$i]] = "cos(" . $rrf . ")";

If ($tipoBloc[$trasporto[$i]] == "tan") 
{
$fun[$trasporto[$i]] = "tan(" . $rrf . ")";

If ($tipoBloc[$trasporto[$i]] == "atan") 
{
$fun[$trasporto[$i]] = "atan(" . $rrf . ")";

If ($tipoBloc[$trasporto[$i]] == "sqrt") 
{
$fun[$trasporto[$i]] = "sqrt(" . $rrf . ")";

If ($tipoBloc[$trasporto[$i]] == "log") 
{
$fun[$trasporto[$i]] = "log(" . $rrf . ")";

If ($tipoBloc[$trasporto[$i]] == "exp") 
{
$fun[$trasporto[$i]] = "exp(" . $rrf . ")";

If (substr($tipoBloc[$trasporto[$i]], 0, 1) == "^")
{
$fun[$trasporto[$i]] = "(" . $rrf . ")" . $tipoBloc[$trasporto[$i]];


Else
{
$funzione0 = rrf;




If ($contr == 0) 
{
break;

} while(TRUE);

// creazione derivata risultato ------------------------------------------------

$derivata0 = "";
Do
{
$contr = 0;
For ($i = 1; $i <= $nSeq; $i++)
{
$nTerm = 0;
$rrf = "";
$par = 0;
For ($j = 1; $j <= strlen($derivate[$i]); $j++)
{
$c = substr($derivate[$i], $j - 1, 1);
If ($c == "(") 
{
$par = $par + 1;

If ($c == ")") 
{
$par = $par - 1;

If (($c == "+" Or $c == "-" Or $c == "*" Or $c == "/") And $par == 0) 
{
$nTerm = $nTerm + 1;
$term[$nTerm] = $rrf;
$oper[$nTerm] = $c;
$rrf = "";

Else
{
$rrf = $rrf . $c;


$nTerm = $nTerm + 1;
$term[$nTerm] = $rrf;
$oper[$nTerm] = "";
$rrf = "";
$incompleto = 0;
For ($j = 1; $j <= $nTerm; $j++)
{
$tipoTerm = "";
If (!is_integer(strpos($term[$j], "[")) And !is_integer(strpos($term[$j], "("))) 
{
$tipoTerm = "fun";

If (is_integer(strpos($term[$j], "["))) 
{
$tipoTerm = "der";

If (is_integer(strpos($term[$j], "(")) And !is_integer(strpos($term[$j], "^"))) 
{
$tipoTerm = "coeff";

If (is_integer(strpos($term[$j], "(")) And is_integer(strpos($term[$j], "^"))) 
{
$tipoTerm = "pot";

If ($tipoTerm == "fun") 
{
If ($fun[$term[$j]] == "") 
{
$incompleto = 1;
break;

$rrf = $rrf . $fun[$term[$j]] . $oper[$j];

If ($tipoTerm == "der") 
{
If ($derFun[substr($term[$j], 1, strlen($term[$j]) - 2)] == "") 
{
$incompleto = 1;
break;

$rrf = $rrf . $derFun[substr($term[$j], 1, strlen($term[$j]) - 2)] . $oper[$j];

If ($tipoTerm == "coeff") 
{
$rrf = $rrf . $term[$j] . $oper[$j];

If ($tipoTerm == "pot") 
{
If ($fun[substr($term[$j], 1, strlen($term[$j]) - 7)] == "") 
{
$incompleto = 1;
break;

$rrf = $rrf . "(" . $fun[substr($term[$j], 1, strlen($term[$j]) - 7)] . ")^(-2)" . $oper[$j];


If ($incompleto == 0) 
{
If ($trasporto[$i] <> "") 
{
If ($derArg[$trasporto[$i]] == "") 
{
$contr = 1;
$derArg[$trasporto[$i]] = rrf;
If ($tipoBloc[$trasporto[$i]] == "()") 
{
$derFun[$trasporto[$i]] = "(" . $rrf . ")";

If ($tipoBloc[$trasporto[$i]] == "sin") 
{
If ($arg[$trasporto[$i]] == $var) 
{
$derFun[$trasporto[$i]] = "cos(" . $var . ")";

Else
{
$derFun[$trasporto[$i]] = "(" . $rrf . ")" . "*cos(" . $arg[$trasporto[$i]] . ")";


If ($tipoBloc[$trasporto[$i]] == "cos") 
{
If ($arg[$trasporto[$i]] == $var) 
{
$derFun[$trasporto[$i]] = "(-1)*sin(" . $var . ")";

Else
{
$derFun[$trasporto[$i]] = "(-1)*(" . $rrf . ")" . "*sin(" . $arg[$trasporto[$i]] . ")";


If ($tipoBloc[$trasporto[$i]]== "tan") 
{
If ($arg[$trasporto[$i]] == $var) 
{
$derFun[$trasporto[$i]] = "(cos(" . $var . "))^(-2)";

Else
{
$derFun[$trasporto[$i]] = "(" . $rrf . ")" . "*(cos(" . $arg[$trasporto[$i]] . "))^(-2)";


If ($tipoBloc[$trasporto[$i]] == "atan") 
{
If ($arg[$trasporto[$i]] == $var) 
{
$derFun[$trasporto[$i]] = "(1+(" . $var . ")^(2))^(-1)";

Else
{
$derFun[$trasporto[$i]] = "(" . $rrf . ")" . "*(1+(" . $arg[$trasporto[$i]] . ")^(2))^(-1)";


If ($tipoBloc[$trasporto[$i]] == "sqrt") 
{
If ($arg[$trasporto[$i]] == $var) 
{
$derFun[$trasporto[$i]] = "(1/2)*(" . $var . ")^(-1/2)";

Else
{
$derFun[$trasporto[$i]] = "(" . $rrf . ")" . "*(1/2)*(" . $arg[$trasporto[$i]] . ")^(-1/2)";


If ($tipoBloc[$trasporto[$i]] == "log") 
{
If ($arg[$trasporto[$i]] == $var) 
{
$derFun[$trasporto[$i]] = "1/" . $var . "";

Else
{
$derFun[$trasporto[$i]] = "(" . $rrf . ")" . "*(" . $arg[$trasporto[$i]] . ")^(-1)";


If ($tipoBloc[$trasporto[$i]] == "exp") 
{
If ($arg[$trasporto[$i]] == $var) 
{
$derFun[$trasporto[$i]] = "exp(" . $var . ")";

Else
{
$derFun[$trasporto[$i]] = "(" . $rrf . ")" . "*exp(" . $arg[$trasporto[$i]] . ")";


If (substr($tipoBloc[$trasporto[$i]], 0, 1) == "^") 
{
$esp = substr($tipoBloc[$trasporto[$i]], 1);
eval("\$ff = @($esp);");
$esp = $ff;
$esp1 = $esp - 1;
$derFun[$trasporto[$i]] = "(" . $rrf . ")*(" . $esp . ")*(" . $arg[$trasporto[$i]] . ")^(" . $esp1 . ")";



Else
{
$derivata0 = $rrf;



If ($contr == 0) 
{
break;

} while(TRUE);

// risultato -------------------------------------------------------------------

If ($funzione0 <> "") 
{
$rrf = $funzione0;
}
Else
{
$rrf = $fun[$bini];
}

If ($derivata0 <> "") 
{
$rrf = $derivata0;
}
Else
{
$rrf = $derFun[$bini];
}

// controllo segni doppi

For ($i = 1; $i <= 10; $i++)
{
$rrf = str_replace("++", "+", $rrf);
}

// semplifica espressione

$rrf = semplEspr($rrf); 
$rrf = semplEspr($rrf); 
$rrf = semplEspr($rrf); 
$rrf = semplEspr($rrf); 

// debug

/*******************

For ($i = 1; $i <= $nBloc; $i++)
{
echo $i . " pos ini : " . $posIni[$i] . " : " . $posFin[$i] . " : " . 
$tipoBloc[$i] . " : " . 
$arg[$i] . " : " . $fun[$i] . " : " . 
$derArg[$i] . " : " . $derFun[$i] . " : " . 
$tipoLink[$i] . " : " . $blocLink[$i] . "<br>"; 

echo "<p>";
echo "bloc ini : " . $bini . "<p>";
echo "<p>";
echo "<p>";
For ($i = 1; $i <= $nSeq; $i++)
{
echo $i . " seq der : " . $seqDer[$i] . "<br>"; 

echo "<p>";
For ($i = 1; $i <= $nSeq; $i++)
{
echo $i . " f. " . $funzioni[$i] . " d. " . $derivate[$i] . " t. " . $trasporto[$i] . "<br>"; 
}
echo "<p>"; 
For ($i = 1; $i <= $nprod; $i++)
{
echo $i . " prod : " . $prod[$i] . " prodeseq : " . $prodSeq[$i] . " prodsegno : " . $prodSegno[$i] . " prodini : " . 
$prodIni[$i] . " prodfin : " . $prodFin[$i] . " rprod :" . $rprod[$i] . "<br>"; 
}
echo "<p>"; 
For ($i = 1; $i <= $nfatt; $i++)
{
echo $i . " moltdiv : " . $moltDiv[$i] . " fatt : " . $fatt[$i] . "<br>"; 
}
echo "<p>"; 
For ($j = 1; $j <= $nTerm; $j++)
{
echo $j . " " . $term[$j] . " " . $oper[$j] . "<br>"; 
}
echo "<p>";

*******************/

// trasforma ()() in pow() (per compatibilità da Visual Basic a PHP)

$rrf = daVbAPow($rrf);

// ritorna risultato

return $rrf;

} // fine derivataParz()

</script>


daPowAVb.php


<script language="php">

error_reporting (E_ALL ^ E_NOTICE);

function daPowAVb($f)
{

// trasforma la funzione potenza Pow() di PHP nell'analoga ()^() di Visual Basic 
// f = stringa contenente la funzione 

$rf = $f;

// esce nel caso che la funzione non contenga pow

if (!is_integer(strpos($rf, "pow")))
{
return $rf;


// iterazione

$contr = 0;
do
{
$contr = 0;
for ($i = 1; $i <= strlen($rf); $i++)
{
if (strpos($rf, "pow", $i - 1) === $i - 1)
{
$base = "";
$esp = "";
$par = 0;
$cambio = 0;
for ($j = $i + 3; $j <= strlen($rf); $j++)
{
$c = substr($rf, $j - 1, 1);
if ($c == "(")
{
$par = $par + 1;

if ($c == ")")
{
$par = $par - 1;

if ($c == "," and $par == 1)
{
$cambio = 1;

if ($par == 0)
{
break;

if ($cambio == 0)
{
$base = $base . $c;

if ($cambio == 1 and $c <> ",")
{
$esp = $esp . $c;


$contr = 1;
eval("\$ff = @($esp);");
$esp = $ff;
$rf = substr($rf, 0, $i - 1) . $base . ")^(" . $esp . ")" . substr($rf, $j);
break;


if ($contr == 0)
{
break;

} while(TRUE);

// ritorna risultato

return $rf;

} // fine daPowAVb()

</script>


daVbAPow.php


<script language="php">

error_reporting (E_ALL ^ E_NOTICE);

function daVbAPow($f)
{

// trasforma la funzione potenza ()^() di Visual Basic nell'analoga Pow() di PHP 
// f = stringa contenente la funzione 

$rf = $f;

// esce nel caso che la funzione non contenga ^

if (!is_integer(strpos($rf, "^")))
{
return $rf;


// iterazione

$contr = 0;
do
{
$contr = 0;
for ($i = 1; $i <= strlen($rf); $i++)
{
if (strpos($rf, "^", $i - 1) === $i - 1)
{
$base = "";
$esp = "";
$ini = 0;
$fin = 0;
$par = 0;
for ($j = $i - 1; $j >= 0; $j--)
{
$c = substr($rf, $j - 1, 1);
if ($c == "(")
{
$par = $par + 1;

if ($c == ")")
{
$par = $par - 1;

$base = $base . $c;
if ($par == 0)
{
$ini = $j;
break;



$par = 0;
for ($j = $i + 1; $j <= strlen($rf); $j++)
{
$c = substr($rf, $j - 1, 1);
if ($c == "(")
{
$par = $par + 1;

if ($c == ")")
{
$par = $par - 1;

$esp = $esp . $c;
if ($par == 0)
{
$fin = $j;
break;


$contr = 1;
$base = strrev($base);
$base = substr($base,1, strlen($base) - 2);
eval("\$ff = @($esp);");
$esp = $ff;
$rf = substr($rf, 0, $ini - 1) . "pow(" . $base . "," . $esp . ")" . substr($rf, $fin);
break;


if ($contr == 0)
{
break;

} while(TRUE);

// ritorna risultato

return $rf;

} // fine daVAPow()

</script>


derivataMonom.php


<script language="php">

error_reporting (E_ALL ^ E_NOTICE);

function derivataMonom($monom, $var)
{
//
// Attenzione !!! la rourine è compatibile con Visual Basic, per cui l'operatore potenza è ^
//
// calcola la derivata del monomio
// monom = monomio da derivare
// var = variabile rispetto alla quale derivare

$rf = $monom;
$rv = $var;

// aggiunge segno se manca

If (substr($rf, 0, 1) <> "+" And substr($rf, 0, 1) <> "-") 
{
$rf = "+" . $rf;


// derivata di una costante : _c --> 0

If (!is_integer(strpos($rf, $rv))) 
{
$rf = "0";
return $rf;


// derivata di x : _x --> 1

If (substr($rf, 1, 1) == $rv And strlen($rf) == 2) 
{
$rf = substr($rf, 0, 1) . "1";
return $rf;
}

// derivata di una potenza : _x^c --> _c*x^(c-1)

If (substr($rf, 1, 1) == $rv And substr($rf, 2, 1) == "^" And !is_integer(strpos(substr($rf, 3), $rv))) 
{
$c1 = substr($rf, 3);
eval("\$ff = @($c1);");
$c1 = $ff;
$c2 = $c1 - 1;
$rf = substr($rf, 0, 1) . "(" . $c1 . ")*(" . $rv . ")^(" . $c2 . ")";
return $rf;
}

If (substr($rf, 0, 1) == "+") 
{
$rf = substr($rf, 1);
}

// ritorna risultato

return $rf;

} // fine derivataMonom()


</script>


semplEspr.php


<script language="php">

error_reporting (E_ALL ^ E_NOTICE);

function semplEspr($f)
{
//
// Attenzione !!! la rourine è compatibile con Visual Basic, per cui l'operatore potenza è ^
//
// semplifica espressione
// la routine esegue alcune semplificazioni (vedi nel corso del programma)
// f = stringa in input contenente l'espressione da semplificare
// in output fornisce l'espressione semplificata


$rf = $f;

// casi non gestiti

If (is_integer(strpos($rf, "*-")) Or is_integer(strpos($rf, "/-")) Or is_integer(strpos($rf, "/0"))) 
{
return $rf;


Do
{
$contr = 0;

// semplificazioni varie

$rf = str_replace("(0)", "0", $rf);
$rf = str_replace("(+0)", "0", $rf);
$rf = str_replace("(-0)", "0", $rf);
$rf = str_replace("*+", "*", $rf);
$rf = str_replace("/+", "/", $rf);

$rf = str_replace("++", "+", $rf);
$rf = str_replace("+-", "-", $rf);
$rf = str_replace("-+", "-", $rf);
$rf = str_replace("--", "+", $rf);

$rf = str_replace("++", "+", $rf);
$rf = str_replace("+-", "-", $rf);
$rf = str_replace("-+", "-", $rf);
$rf = str_replace("--", "+", $rf);

$rf = str_replace("++", "+", $rf);
$rf = str_replace("+-", "-", $rf);
$rf = str_replace("-+", "-", $rf);
$rf = str_replace("--", "+", $rf);

$rf = str_replace("++", "+", $rf);
$rf = str_replace("+-", "-", $rf);
$rf = str_replace("-+", "-", $rf);
$rf = str_replace("--", "+", $rf);

// semplificazione caso "0*" oppure "0/"

Do
{
$contr = 0;
For ($k = 1; $k <= strlen($rf); $k++)
{
$pos = 0;
$c = substr($rf, $k - 1, 1);
$cc = "";
If ($k < strlen($rf)) 
{
$cc = substr($rf, $k, 1);

If ($c == "0" And ($cc == "*" Or $cc == "/")) 
{
$pos = $k;

If ($pos > 0) 
{
$c1 = "";
$c2 = "";
If ($pos == 1) 
{
$c2 = substr($rf, $pos, 1);

ElseIf ($pos == strlen($rf)) 
{
$c1 = substr($rf, $pos - 2, 1);

Else
{
$c1 = substr($rf, $pos - 2, 1);
$c2 = substr($rf, $pos, 1);

If ($c1 == "+" Or $c1 == "-" Or $c1 == "*" Or $c1 == "(" Or $c1 == "") 
{
$posIni = $pos;
$rrf = "";
$par = 0;
For ($j = $posIni + 2; $j <= strlen($rf); $j++)
{
$c = substr($rf, $j - 1, 1);
If ($c == "(") 
{
$par = $par + 1;

If ($c == ")") 
{
$par = $par - 1;

If ($par == -1) 
{
break;

If ($c == "+" Or $c == "-") 
{
If ($par == 0) 
{
break;


$rrf = $rrf . $c;
$posFin = $j;

$contr = 1;
break;



If ($contr == 1) 
{
$rf = substr($rf, 0, $posIni - 1) . "0" . substr($rf, $posFin, strlen($rf) - $posFin);

If ($contr == 0) 
{
break;

} while(TRUE);

// semplificazione caso "*0"

Do
{
$contr = 0;
For ($k = 1; $k <= strlen($rf); $k++)
{
$pos = 0;
$c = substr($rf, $k - 1, 1);
$cc = "";
If ($k > 1) 
{
$cc = substr($rf, $k - 2, 1);

If ($c == "0" And $cc == "*") 
{
$pos = $k;

If ($pos > 0) 
{
$c1 = "";
$c2 = "";
If ($pos == 1) 
{
$c2 = substr($rf, $pos, 1);

ElseIf ($pos == strlen($rf)) 
{
$c1 = substr($rf, $pos - 2, 1);

Else 
{
$c1 = substr($rf, $pos - 2, 1);
$c2 = substr($rf, $pos, 1);

If ($c2 == "+" Or $c2 == "-" Or $c2 == "*" Or $c2 == "/" Or $c2 == ")" Or $c2 == "") 
{
$posFin = $pos;
$rrf = "";
$par = 0;
For ($j = $posFin - 2; $j >= 1; $j--)
{
$c = substr($rf, $j - 1, 1);
If ($c == "(") 
{
$par = $par + 1;

If ($c == ")") 
{
$par = $par - 1;

If ($par == 1) 
{
break;

If ($c == "+" Or $c == "-") 
{
If ($par == 0) 
{
break;


$rrf = $rrf . $c;
$posIni = $j;

$contr = 1;
break;



If ($contr == 1) 
{
$rrf = strrev($rrf);
$rf = substr($rf, 0, $posIni - 1) . "0" . substr($rf, $posFin, strlen($rf) - $posFin);

If ($contr == 0) 
{
break;

} while(TRUE);

// semplificazione blocchi tipo (+0*3+0+0) contenenti solo numeri, operazioni e segni

Do
{
$contr = 0;
$k = 1;
For ($i = 1; $i <= strlen($rf); $i++)
{
$c = substr($rf, $i - 1, 1);
If ($c == "(") 
{
$posIni = $i + 1;
$rrf = "";
For ($j = $posIni; $j <= strlen($rf); $j++)
{
$c1 = substr($rf, $j - 1, 1);
If ($c1 == ")") 
{
break;

$rrf = $rrf . $c1;
$posFin = $j;

$kk = 0;
If (is_numeric($rrf)) 
{
eval("\$ff = @($rrf);");
If ($rrf = $ff Or $rrf = "+" . $ff)
{
$kk = 1;


If ($kk == 0)
{
If (is_integer(strpos($rrf, "+")) Or is_integer(strpos($rrf, "-")) Or 
is_integer(strpos($rrf, "*")) Or is_integer(strpos($rrf, "/"))) 
{
$k = 0;
For ($j = 1; $j <= strlen($rrf); $j++)
{
$c = substr($rrf, $j - 1, 1);
If ($c <> "0" And $c <> "1" And $c <> "2" And $c <> "3" And $c <> "4" And 
$c <> "5" And $c <> "6" And $c <> "7" And $c <> "8" And $c <> "9" And
$c <> "+" And $c <> "-" And $c <> "*" And $c <> "/" And $c <> ".") 
{
$k = 1;
break;


If ($k == 0) 
{
break;





If ($k == 0) 
{
eval("\$ff = @($rrf);");
$calc = $ff;
$rf = substr($rf, 0, $posIni - 1) . $calc . substr($rf, $posFin, strlen($rf) - $posFin);
$contr = 1;

If ($contr == 0) 
{
break;

} while(TRUE);
If ($contr == 0) 
{
$rf1 = $rf;
$rf = str_replace("(0)", "0", $rf);
$rf = str_replace("(+0)", "0", $rf);
$rf = str_replace("(-0)", "0", $rf);
$rf = str_replace("*+", "*", $rf);
$rf = str_replace("/+", "/", $rf);
If ($rf == $rf1) 
{
break;


} while(TRUE);

// semplificazione caso (...)^0

Do
{
$contr = 0;
For ($k = 1; $k <= strlen($rf); $k++)
{
$pos = 0;
$c = substr($rf, $k - 1, 1);
$cc = "";
If ($k > 1) 
{
$cc = substr($rf, $k - 2, 1);

If ($c == "0" And $cc == "^") 
{
$pos = $k;

If ($pos > 0) 
{
$c1 = "";
$c2 = "";
If ($pos == 1) 
{
$c2 = substr($rf, $pos, 1);

ElseIf ($pos == strlen($rf)) 
{
$c1 = substr($rf, $pos - 2, 1);

Else
{
$c1 = substr($rf, $pos - 2, 1);
$c2 = substr($rf, $pos, 1);

If ($c2 == "+" Or $c2 == "-" Or $c2 == "*" Or $c2 == "/" Or $c2 == ")") 
{
$posFin = $pos;
$rrf = "";
$par = 0;
For ($j = $posFin - 2; $j >= 1; $j--)
{
$c = substr($rf, $j - 1, 1);
If ($c == "(") 
{
$par = $par + 1;

If ($c == ")") 
{
$par = $par - 1;

If ($par == 1) 
{
break;

If ($c == "+" Or $c == "-" Or $c == "*" Or $c == "/") 
{
If ($par == 0) 
{
break;


$rrf = $rrf . $c;
$posIni = $j;

$contr = 1;
break;



If ($contr == 1) 
{
$rrf = strrev($rrf);
$rf = substr($rf, 0, $posIni - 1) . "1" . substr($rf, $posFin, strlen($rf) - $posFin);

If ($contr == 0) 
{
break;

} while(TRUE);

// ritorna risultato

return $rf;

} // fine semplEspr()

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