(* :Title: Funtzioaren grafikaren analisia*)

(* :Author: Carlos Gorria*)

(* :Keywords:
	funtzio
*)

(* :Requirements: None. *)

(* :Warnings: None. *)

(* :Summary:
Aldagai baten menpeko funtzioaren erroak, muturrak eta inflexio puntuak
aurkitzen ditu eta ondorioz elementu guzti horiekiko grafika.
*)

BeginPackage["Garatu`Funtzio`", "Graphics`Legend`"]

funtzio::usage = 
"funtzio[f[x],x] x aldagai askearen menpeko f[x]
adierazpena eta x aldagaia funtzioaren parametroak dira.
Funtzio honek f-ren erroak, muturrak eta inflexio puntuak
aurkitzen ditu eta ondorioz, elementu guzti hauekiko grafika
osatuko du."

Begin[ "`Private`" ]

Unprotect[funtzio]

  funtzio[f_,x_]:=funtziolaguna[Function[x,f]];   
      funtziolaguna[f_]:=Module[{i,err,errzer,erroak,errokoord,
      puntuerro,mut,mutzer,muturrak,gorenbeheren,muturkoord,
      puntumutur,zuzenmutur,inf,infzer,inflexio,inflexiokoord,
      puntuinf,zuzeninf},
    
    df[x_]=D[f[x],x];ddf[x_]=D[f[x],{x,2}];
    
    err=Solve[f[x]==0,x];errzer=Table[x/.err[[i,1]],{i,1,Length[err]}];
    Print["Erroak: ",errzer];erroak={};
    Do[If[Im[x/.err[[i,1]]]==0,AppendTo[erroak,x/.err[[i,1]]]],{i,1,Length[err]}];
    errokoord=Table[{erroak[[i]],0},{i,1,Length[erroak]}];
    puntuerro=Table[Point[errokoord[[i]]],{i,1,Length[erroak]}];
    
    mut=Solve[df[x]==0,x];mutzer=Table[x/.mut[[i,1]],{i,1,Length[mut]}];
    Print["Muturrak: ",mutzer];muturrak={};
    Do[If[Im[x/.mut[[i,1]]]==0,AppendTo[muturrak,x/.mut[[i,1]]]],{i,1,Length[mut]}];
    gorenbeheren=Table[{muturrak[[i]],If[ddf[muturrak[[i]]]>0,"beherena","gorena"]},
        {i,1,Length[muturrak]}];Print["Mutur errealak: ",gorenbeheren];
    muturkoord=Table[{muturrak[[i]],f[muturrak[[i]]]},{i,1,Length[muturrak]}];
    puntumutur=Table[Point[muturkoord[[i]]],{i,1,Length[muturrak]}];
    zuzenmutur=Table[Line[{muturkoord[[i]],{muturrak[[i]],0}}],{i,1,Length[muturrak]}];
    
    inf=Solve[ddf[x]==0,x];infzer=Table[x/.inf[[i,1]],{i,1,Length[inf]}];
    Print["Inflexio puntuak: ",infzer];
    inflexio={};Do[If[Im[x/.inf[[i,1]]]==0,AppendTo[inflexio,x/.inf[[i,1]]]],{i,1,Length[inf]}];
    inflexiokoord=Table[{inflexio[[i]],f[inflexio[[i]]]},{i,1,Length[inflexio]}];
    puntuinf=Table[Point[inflexiokoord[[i]]],{i,1,Length[inflexio]}];
    zuzeninf=Table[Line[{inflexiokoord[[i]],{inflexio[[i]],0}}],{i,1,Length[inflexio]}];
    
    puntuak=Join[erroak,muturrak,inflexio];
    xmin=Min[puntuak];xmax=Max[puntuak];
    Show[{Plot[{f[x],df[x],ddf[x]},{x,xmin-1,xmax+1},
          PlotStyle->{Hue[0.1],Hue[0.3],Hue[0.6]},DisplayFunction->Identity],
          Graphics[{PointSize[0.02],{Hue[0.1],puntuerro},
          {Hue[0.3],puntumutur,zuzenmutur},{Hue[0.6],puntuinf,zuzeninf}}]},
    PlotRange->All,DisplayFunction->$DisplayFunction];];

Protect[funtzio]

End[ (* "`Private`" *) ];

EndPackage[]   (* Garatu`Funtzio` *)

(*:Limitations:
*)

(*:Tests:
*)

(*:Examples:

funtzio[x^3-4.*x^2-5.*x+3.,x]

funtzio[x^3-4.*x^2-5.*x+3.,x]
*)
