Függvényvizsgáló automata

Siegler Ádám	
2002.05.06.

A feladat

A feladat egy függvényvizsgáló program elkészítése volt, amely egyváltozós, elsősorban racionális tört-
függvények részletes analízisére képes. A teljes függvényvizsgálat tartalmazza a függvény értelmezési tartomá
nyának, zérushelyének, grafikonjának, lokális szélsőértékeinek, monotonitásának, konvexitásának, paritásának 
és aszimptotáinak kiértékelését, valamint ezek megjelenítését.

I. Egy racionális törtfüggvény vizsgálata

Az első részben egy adott racionális törtfüggvény vizsgálata kerül bemutatásra. Legyen a vizsgálandó
 függvény a következő:

f[x_] := (x^2 - 5 x  - 4)/(-x^2 + 9 x  + 10);  
    f[x]

I.1. Értelmezési tartomány

Az ilyen függvényeknél az értelmezési tartomány viszonylag egyszerűen meghatározható, elég ha csak egyenlővé tesszük a nevezőt 0-val.

sz := Flatten[NSolve[1/f[x] == 0, x]]; sz

szh := Table[sz[[i]][[2]], {i, 1, Length[sz]}]; 
    szh

vszh := Select[szh, Im[#] == 0 &]; vszh

et := Print["ℝ∖", vszh]; 
    et

I.2. Zérushely

A függvényben megadott kifejezést 0-val kell egyenlővé tenni, és megoldani (a komplex megoldásokat kizárom).

z := Flatten[NSolve[Numerator[f[x]] == 0, x]]; z

zh := Table[z[[i]][[2]], {i, 1, Length[z]}]; zh

vzh := Select[zh, Im[#] == 0 &]; vzh

zer := 
      Print["A zérushelyek:"] 
        For[i = 1, i ≤ Length[vzh], Print[(Subscript[x, i])]; 
          Print[vzh[[i]]]; Print["*"]; i++]; zer

I.3. Határértékek

+/-∞-ben, illetve a szakadási helyeken nézzük a határértékeket.

h2 := Limit[f[x], x -> Infinity]; h2

h1 := Limit[f[x], x -> -Infinity]; h1

he := 
      Print["A határértékek -∞-ben \
és ∞-ben: ", {h1, h2}]; he

ha := 
      Table[Limit[f[x], x -> vszh[[i]], 
          Direction -> (vszh[[i]] - 5)], {i, 1, Length[vszh]}]; 
    ha

hb := 
      Table[Limit[f[x], x -> vszh[[i]], 
          Direction -> (vszh[[i]] + 2)], {i, 1, Length[vszh]}]; 
    ha

{ha[[1]], hb[[1]]}

{ha[[2]], hb[[2]]}

I.4. Függvényábrázolás

A Plot parancs segítségével kirajzoltatom a függvényt. A határokat most önkényesen írtam be, 
később ezen változtatok.

sze := Flatten[NSolve[df == 0, x]]; sze

sze1 := Table[sze[[i]][[2]], {i, 1, Length[sze]}]; 
    sze1

loksze := Select[sze1, Im[#] == 0 &]; loksze

sze2 := 
      Table[ddf /. x -> loksze[[i]], {i, 1, Length[loksze]}]; 
    sze2

\(lokszeh := 
      For[i = 0, 
        i ≤ 
          Length[loksze], 
Which[
sze2[\([i]\)] < 
            0, 
Print[
            loksze[\([i]\)] "-ben lokális maximum, a hozzárendelt érték:"]; 
          Print[\ f[loksze[\([i]\)]]], 
sze2[\([i]\)] > 
            0, 
Print[
            loksze[\([i]\)] "-ben lokális minimum, a hozzárendelt érték:"]; Print[f[loksze[\([i]\)]]]]; 
        Print["*"]; \(i++\)]; lokszeh\)

Most azt nézem meg, hogy a függvény hol mutat monoton növekedést, és hol csökkenést. Ezt az első derivált előjeléből állapható meg. Elég, ha lokális szélsőrtékhelyek és a szakadási helyek között egy-egy pontban vizsgálom, mivel ezeken az intervallumokon végig azonos előjelű a deriváltfüggvény.

u := Union[loksze, vszh]; u

u1 := 
      Union[Table[(u[[i]] + u[[i + 1]])/2, {i, 1, 
            Length[u] - 1}], {u[[1]] - 50}, {u[[-1]] + 50}]; 
    u1

u2 := Table[df /. x -> u1[[i]], {i, 1, Length[u1]}]; 
    u2

\(nov := {If[u2[\([\)\(1\)\(]\)] < 0, 
          Print[u[\([\)\(1\)\(]\)] "-tól balra a függvény monoton csökkenő"], 
          Print[u[\([\)\(1\)\(]\)] "-tól balra a függvény monoton növekvő"]]; Print["*"], 
        For[i = 2, i ≤ Length[u2] - 1, 
          If[u2[\([\)\(i\)\(]\)] < 0, \ 
            Print[u[\([\)\(i - 1\)\(]\)] " és "\ ]; 
            Print[u[\([\)\(i\)\(]\)] "között a függvény monoton csökkenő"]; \ 
            Print["*"], Print[u[\([\)\(i - 1\)\(]\)] " és "]; 
            Print[u[\([\)\(i\)\(]\)] "között a függvény monoton növekvő"]; 
Print["*"]]; \(i++\)], 
        If[u2[\([\)\(-1\)\(]\)] < 0, 
          Print[u[\([\)\(-1\)\(]\)] "-tól jobbra a függvény monoton csökkenő"], 
          Print[u[\([\)\(-1\)\(]\)] "-tól jobbra a függvény monoton növekvő"]]}; 
    nov\)

Az inflexiós pontokat a szélsőértékhelyekhez hasonlóan keresem, a különbség csak az, hogy a második
 deriváltat teszem egyenlővé 0-val, és oldom meg az egyenletet.

Teszteltem konstans, abszolútértékes, trigonmetrikus és logaritmikus függvényeket, de az elkészített 
program nem igen képes ezek kezelésére.

ClearAll[f, ET, et, sz, szh, vszh, ZH, zer, z, zh, vzh, H, he, h1, h2, 
      ABR, abr1, derabr1, mderabr1, LSZ, lokszeh, lokszeh1, sze, sze1, 
      loksze, sze2, MON, nov, nov1, u, u1, u2, INF, infl1, ko, ko1, infl, 
      infl2, KONV, konv, k, k1, k2, PAR, par, ps, pt, AS, asz1, a1, b1, a2, 
      b2, asz]