Skip to content

Instantly share code, notes, and snippets.

@bennof
Last active November 30, 2023 16:32
Show Gist options
  • Save bennof/df903c8e2dc8db00ff99c5d6f3c0d647 to your computer and use it in GitHub Desktop.
Save bennof/df903c8e2dc8db00ff99c5d6f3c0d647 to your computer and use it in GitHub Desktop.
Kurvendiskussion Mit Maxima

Kurvendiskussion für das Abi NRW mit Maxima

under development

Dies richtet sich an deutschsprachige Lehrerinnen und Lehrer und Schülerinnen und Schüler, die eine automatische Kurvendiskussion für Übungsaufgaben haben wollen. Dabei wird das freie Algebrasystem Maxima (wxMaxima) verwendet.

Funktionen/Routinen zur Kurvendiskussion

Eingabe einer Funktion

Die Funktion $f(x)=x^4-x^2$ wird wie folgt in Maxima eingegeben:

f(x):=x^4-x^2;

Jetzt können die folgenden Funktionen angewendet werden. Das erste Argument ist immer die Funktion, das zweite die Variable.

Definitionsbereich

Bestimmt den Definitionsbereich (nur Division durch null) durch Nullstellen von $\frac{1}{f(x)}$:

Definitionsbereich(f,x):=
    block(
        disp("======","Definitionsbereich:"),
        print("Definitionsluecken durch Division durch Null:", solve(1/f(x),x)),
        print("Definitionsluecken durch negative Wurzel: fehlt!"))$
Definitionsbereich(f,x);

Symmetrie

Bestimmt die (Achsen-/Punkt-)Symmetrie und gibt unbekannt zurück falls keine Symmetrie durch Reduktion nachgewiesen werden kann.

Symmetrie(f,x):=
    block(
        disp("======","Symmetrie (zum Koordinatensystem):"),
        print("Achsensymmetrie: f(x)=-f(x):",is(equal(f(x),f(-x)))),
        print("Punktsymmetrie: f(-x)=-f(x):",is(equal(f(-x),-f(x)))))$
Symmetrie(f,x);

Verhalten im Undendlichen

VerhaltenImUnendlichen(f,x):=
    block(
        disp("======","Verhalten im Undendlichen:"),
        print("Grenzwert gegen -unendlich:",limit(f(x),x,minf)),
        print("Grenzwert gegen unendlich:",limit(f(x),x,inf)))$
VerhaltenImUnendlichen(f,x);

Schnittpunkt mit der y-Achse

SchnittpunktMitY(f,x):=
    block(
        disp("======","Schnittpunkt mit der y-Achse:"),
        print("Schnittpunkt y:",f(0)))$
SchnittpunktMitY(f,x);

Ableitungen

Extremstellen

Bestimmen von Hoch- und Tiefpunkten mit der 2. Ableitung als Kriterium. Falls die 2. Ableitung auch 0 ist wird keine Lösung angegeben.

Extrema(f,x):=
    block([f1,f2,j,xx,yy,ddf],
        f1(x):=(diff(f(x),x)),
        f2(x):=(diff(f1(x),x)),
        disp("======","Extrema: "),
        disp("Notwendige Bedingung: f'(x)=0 (mit GTR)"),
        N:solve(f1(x),x),
        print("moegl. Extrema: ",N),
        disp("Hinreichende Bedingung:"),
        j:0,
        for xx in N do(
            j:j+1,
            ddf:at(f2(x),xx),
            if ddf < 0 then print(j,": f''(x_",j,")=",ddf,"< 0 => Hochpunkt","Punkt: (",rhs(xx),"|",rhs(f(xx)),")" )
                elseif ddf > 0 then print(j,": f''(x_",j,")=",ddf,"> 0 => Tiefpunkt","Punkt: (",rhs(xx),"|",rhs(f(xx)),")" )
                else print("unbekannt")))$
Extrema(f,x);

Wendestellen

Wendestellen(f,x):=
    block([f1,f2,f3,j,xx,ddf,N],
        f1(x):=(diff(f(x),x)),
        f2(x):=(diff(f1(x),x)),
        f3(x):=(diff(f2(x),x)),
        disp("======","Wendestellen: "),
        disp("Notwendige Bedingung: f''(x)=0 (mit GTR)"),
        N:solve(f2(x),x),
        print("moegl. Wendestellen: ",N),
        j:0,
        for xx in N do(
            j:j+1,
            ddf:at(f3(x),xx),
            if ddf < 0 then print(j,": f'''(x_",j,")=",ddf,"< 0 => L-R-Wendestelle","Punkt: (",rhs(xx),"|",rhs(f(xx)),")" )
                elseif ddf > 0 then print(j,": f'''(x_",j,")=",ddf,"> 0 => R-L-Wendestelle","Punkt: (",rhs(xx),"|",rhs(f(xx)),")") 
                else print("unbekannt")))$
Wendestellen(f,x);

Gesamte Kurvendiskussion

Kurvendiskussion(f,x):=
    block(
        disp("Kurvendiskussion"),
        print("Untersuche die Funktion: f(x)=", f(x)),
        Definitionsbereich(f,x),
        Achsensymmetrie(f,x),
        VerhaltenImUnendlichen(f,x),
        SchnittpunktMitY(f,x),
        Extrema(f,x),
        Wendestellen(f,x)
    );
Kurvendikussion(f,x);

Gesamter Code

Definitionsbereich(f,x):=
    block(
        disp("======","Definitionsbereich:"),
        print("Definitionsluecken durch Division durch Null:", solve(1/f(x),x)),
        print("Definitionsluecken durch negative Wurzel: fehlt!"))$
Symmetrie(f,x):=
    block(
        disp("======","Symmetrie (zum Koordinatensystem):"),
        print("Achsensymmetrie: f(x)=-f(x):",is(equal(f(x),f(-x)))),
        print("Punktsymmetrie: f(-x)=-f(x):",is(equal(f(-x),-f(x)))))$
VerhaltenImUnendlichen(f,x):=
    block(
        disp("======","Verhalten im Undendlichen:"),
        print("Grenzwert gegen -unendlich:",limit(f(x),x,minf)),
        print("Grenzwert gegen unendlich:",limit(f(x),x,inf)))$
SchnittpunktMitY(f,x):=
    block(
        disp("======","Schnittpunkt mit der y-Achse:"),
        print("Schnittpunkt y:",f(0)))$
Extrema(f,x):=
    block([f1,f2,j,xx,yy,ddf],
        f1(x):=(diff(f(x),x)),
        f2(x):=(diff(f1(x),x)),
        disp("======","Extrema: "),
        disp("Notwendige Bedingung: f'(x)=0 (mit GTR)"),
        N:solve(f1(x),x),
        print("moegl. Extrema: ",N),
        disp("Hinreichende Bedingung:"),
        j:0,
        for xx in N do(
            j:j+1,
            ddf:at(f2(x),xx),
            if ddf < 0 then print(j,": f''(x_",j,")=",ddf,"< 0 => Hochpunkt","Punkt: (",rhs(xx),"|",rhs(f(xx)),")" )
                elseif ddf > 0 then print(j,": f''(x_",j,")=",ddf,"> 0 => Tiefpunkt","Punkt: (",rhs(xx),"|",rhs(f(xx)),")" )
                else print("unbekannt")))$
Wendestellen(f,x):=
    block([f1,f2,f3,j,xx,ddf,N],
        f1(x):=(diff(f(x),x)),
        f2(x):=(diff(f1(x),x)),
        f3(x):=(diff(f2(x),x)),
        disp("======","Wendestellen: "),
        disp("Notwendige Bedingung: f''(x)=0 (mit GTR)"),
        N:solve(f2(x),x),
        print("moegl. Wendestellen: ",N),
        j:0,
        for xx in N do(
            j:j+1,
            ddf:at(f3(x),xx),
            if ddf < 0 then print(j,": f'''(x_",j,")=",ddf,"< 0 => L-R-Wendestelle","Punkt: (",rhs(xx),"|",rhs(f(xx)),")" )
                elseif ddf > 0 then print(j,": f'''(x_",j,")=",ddf,"> 0 => R-L-Wendestelle","Punkt: (",rhs(xx),"|",rhs(f(xx)),")") 
                else print("unbekannt")))$
Kurvendiskussion(f,x):=
    block(
        disp("Kurvendiskussion"),
        print("Untersuche die Funktion: f(x)=", f(x)),
        Definitionsbereich(f,t),
        Achsensymmetrie(f,t),
        VerhaltenImUnendlichen(f,t),
        SchnittpunktMitY(f,t),
        Extrema(f,t),
        Wendestellen(f,t)
    )$

Erwartete Ausgabe:

"Kurvendiskussion"
"Untersuche die Funktion: f(x)="0.25*x^3-12*x^2+144*x
"======"
"Definitionsbereich:"
rat: replaced 0.25 by 1/4 = 0.25
"Definitionsluecken durch Division durch Null:"[]
"Definitionsluecken durch negative Wurzel: fehlt!"
"======"
"Symmetrie (zum Koordinatensystem):"
rat: replaced 0.5 by 1/2 = 0.5
"Achsensymmetrie: f(x)=-f(x):"unknown
"Punktsymmetrie: f(-x)=-f(x):"unknown
"======"
"Verhalten im Undendlichen:"
"Grenzwert gegen -unendlich:"-inf
"Grenzwert gegen unendlich:"inf
"======"
"Schnittpunkt mit der y-Achse:"
"Schnittpunkt y:"0
"======"
"Nullstellen:"
rat: replaced 0.25 by 1/4 = 0.25
"Punkt: N"1"= ("24"|0)"
"Punkt: N"2"= ("0"|0)"
"======"
"Ableitungen:"
f1(x)=0.75*x^2-24*x+144
f2(x)=1.5*x-24
f3(x)=1.5
"======"
"Extrema: "
"Notwendige Bedingung: f'(x)=0 (mit GTR)"
rat: replaced 0.75 by 3/4 = 0.75
"moegl. Extrema: "[x=24,x=8]
"Hinreichende Bedingung:"
1": f''(x_"1")="12.0"> 0 => Tiefpunkt""Punkt: ("24"|"0.0")"
2": f''(x_"2")="-12.0"< 0 => Hochpunkt""Punkt: ("8"|"512.0")"
"======"
"Wendestellen: "
"Notwendige Bedingung: f''(x)=0 (mit GTR)"
rat: replaced 1.5 by 3/2 = 1.5
"moegl. Wendestellen: "[x=16]
1": f'''(x_"1")="1.5"> 0 => R-L-Wendestelle""Punkt: ("16"|"256.0")"

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment