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