Ganzrat. Terme Ordnen nach Grad & Ganzrat. terme mit andere variablen Basen neben x

JHeindel shared this question 5 years ago
Answered

Hallo liebe Geogebra-Welt,


nachdem ich nun die letzten Nächte wiederholt an immer wieder neuen Stellen

meines Applet zum Vereinfachen von Termen hängen geblieben bin, suche ich nun

doch zum ersten Mal den Weg hierher in die Community:


Ich hatte folgendes vor: Ich wollte für meine Schüler ein Applet erstellen, das

einem immer wieder neue zu vereinfachende ganzrat. Terme erstellt (bei den

Aufgabe sollten verschiedene Basen auftauchen, also nicht nur x), die zu

vereinfachen und zusammenzufassen sind. In der Algebraansicht sollte nur der

Term (ohne Grid und Achsen) gezeigt werden und ein Eingabefeld, in dem die

Schüler ihre Antwort über an Wahrheitswerte gekoppelten Text kontrollieren

können.


Ich bin grob folgendermaßen vorgegangen:


Über Listen werden die Exponenten, Koeffizienten, Variablen und Vorzeichen

zufällig gewählt, aus denen ich eine Funktion gebaut habe. Das Eingabefeld

sollte dann Überprüfen ob die Schülerlösung a) richtig und b) so weit wie

möglich vereinfacht wurde.


Verschiedene Ansätze haben mich zu verschiedenen Problemen geführt:


1. Wenn ich die Variablen Liste definieren möchte, werden nur x, y und z

zugelassen (eigentlich ja 2 Geraden und die Ebene). Jeglicher andere

undefinierte Buchstabe, wurde natürlich nicht erkannt und wollte z.B. über

einen Schieberegler definiert werden. Gibt es eine Möglichkeit sich andere

Variablen auf diesem Weg zu definieren, so dass am Ende auch ein Term wie z.b.

3a^4-2a generiert werden kann?


2. Um das Problem zu umgehen habe ich die Variablen als Text definiert. Dies

hat dazu geführt, dass sich Rechenzeichen des Terms nicht automatisch

vereinfachten, z.B. wenn die Variable v=t, a_1=2, exp_1=0, a_2=-1, exp_2=1,

a_3=-3, exp_3=3, der Term=a_1 v^exp_1 (a_2 v^exp_2 - a_3 v^exp_3) z.B. zu so

etwas führte: 2 t^0(-1 t^1 - -3 ttt). Statt dessen wäre natürlich 2 (- t +3

t^3) wünschenswert gewesen. Sieht jemand eine Möglichkeit wie man mit

dynamischem Text dies elegant umsetzen kann?


3. Nach langem hin und herschrauben habe ich habe es hinbekommen (sehr

unelegant und aufwendig - mittels langer Wenn...Ketten) dass tatsächlich die

über die Variablen als Text definierte Funktionen korrekt angezeigt werden und

dass eine Funktion h in der gleichen Variable (als Variable nicht als Text)

besteht. Hierzu musste ich allerdings meine längere Variablenliste auf x, y, z

einschmelzen, da andere auf diesem Weg nicht funktionierten (siehe 1.). Nun

musste ich allerdings feststellen, dass in das für Schülerlösungen gedachte

Eingabefeld (das ja an ein Objekt dem ich den Wert 0 zugewiesen hatte gekoppelt

war) keine Terme mit anderen Variablen als x eingegeben werden konnten, v.a.

weil ich den Schülern nicht zumuten möchte die Variablen in " " zu

setzen um wieder auf Text auszuweichen. Es kam also immer die Fehlermeldung:

"Ungültige Funktion...Bitte explizite Funktion in x eingeben". Sieht

jemand eine Möglichkeit dass eine Eingabe von Termen mit der Basis von

zumindest x, y und z (wenn nicht noch anderen) noch auf diesem Wege

funktioniert?


4. Nach langem hin und her habe ich dann gehofft das ganze umsetzen zu können,

indem ich eben doch nur die Variable x verwende. Hierbei kam es nun mit dem

Kontrollieren der Schülereingabe (SE) über die Wahrheitswerte zu Problemen,

insbesondere mit einer möglichen abweichenden Reihenfolge der Terme in der

Lösung. Ich hatte mich folgnde Wahrheitswerte überlegt:


a) SE entspricht dem generierten Term - wenn (SE==Term,true,false)


b) die Lösung ist so weit wie möglich vereinfacht -

wenn(SE==vereinfache(SE),true,false) --> da hierdurch aber z.B. die SE x+x

anstatt 2x auch richtig wiedergeben würde habe ich diese als Text verglichen,

also: wenn("SE"=="vereinfache(SE)",true,false) -->

Die Kobination aus beiden sollte dann das richtige Ergebnis garantieren.


Hierbei ergibt sich nun aber das Problem, dass der Term 3-2x zwar der richtige

sein könnte, aber unter b) würde false ausgegeben, da vereinfache(SE)=-2x+3

!=-2x+3=SE; auf einmal würde also die Reihenfolge relevant. Gibt es denn einen

Weg den Term der Schülereingabe nach aufsteigendem Grad z.B. ordnen zu lassen,

so dass ich dann endlich mit

wenn("SE"=="vereinfache(ordne_nach_Grad(SE))",true,false)

am Ziel für die Variable x wäre? Gibt es dafür einen Befehl? Sortier habe ich

nur für Listen gefunden aber nicht für ein Objekt.


Entschuldigt die mega lange Ausführung, aber ich ich denke nur mittels des

jetzigen Standes des Applets (im Anhang) hätte man mein Problem nicht

nachvollziehen können.


Ich würde mich sehr über Anregungen und Vorschläge freuen, um an mein

Mindestziel (Punkt 4) zu kommen. Wenn mir jemand mit einem der Punkt 1.-3.

weiterhelfen könnte, so dass doch noch andere Basen möglich würden, wäre

natürlich auch großartig.


Vielen Dank im Voraus,


JHeindel

Comments (17)

photo
1

Ich denke, dass der Script-Befehl: VerwandleInFunktion[<nameResultat>, <funktionAlsText>]

Deine Probleme lösen könnte:

.

1) Die Funktion wird als Text generiert (Aufgabe)

2) Der Script Vorbereitung wandelt den Text in eine Funktion um (f)

.... f muss als freie Funtion bereits existieren zB. f(x)=x

.... die Variablen-Namen in der Klammer im Namen müssen bereits richtig sein

3) der obige Punkt 2 durchläuft Vereinfachen[f] (g)

4) das Objekt aus 3) wird mittels Formeltext in einen Text umgewandelt (Text3)

5) der Schüler gibt die Antwort als Text (Antwort)

6) die Nachbearbeitung wandelt die Antwort in eine Funktion um (h)

.... h muss als freie Funtion bereits existieren zB. h(x)=x

.... die Variablen-Namen in der Klammer im Namen müssen bereits richtig sein

7) Kontrolle Text3 == Antwort

8) Kontrolle h == g

.

Im Anhang sind obige Schritte (experimentell) nachvollzogen

.

Andere Variablen-Namen anstelle von x,y,z

Idee:

In der Vorbereitung werden zusätzlich die variablen-Namen in der Aufgabe in x, y, z umgewandelt

In der Nachbearbeitung werden zusätzlich die variablen-Namen in der Antwort in x, y, z umgewandelt

photo
1

verbesserte experimental Version 02


Sie ist in der Lage mit 1, 2 oder 3 Variablen aus x,y und z zu arbeiten

photo
1

Hallo Rami,

danke für deine schnell und engagierte Hilfe! Die Idee mit dem Vorgehen finde ich clever und den Befehl VerwandleInFunktion kannte ich noch nicht.

Zu deinem zweiten File - da muss ich gestehen, dass ich noch nicht zu 100% durchblicke, wie du den Variablentausch vorbereitest: z.B. "Ausführen[{"h("+h_{xyz1}+")="+h_{xyz2}+""}]",

mir ist jedoch aufgefallen, dass die Reihenfolge der Eingabe weiterhin relevant für die Wahrheitswerte ist. D.h. wenn ein Schüler als Lösung x+2x^2 statt 2x^2+x eingibt, wird zwar h==g erkannt, aber Antwort !=Text3, somit würde ich nicht ganz ans Ziel kommen. Wenn ich aber statt dessen doch wenn(vereinfache(h))==h) benutze könnte es klappen.


Schon einmal super vielen lieben Dank! Ich werd mich die Tage mal dran machen das umzusetzen.

Viele Grüße

photo
1

Hallo - also ich habe mich jetzt doch direkt hingesetzt und wollte schauen wie weit ich komme. Dank deines Tipps, habe ich es jetzt auch hinbekommen, dass die Variablen x, y, z benutzt werden können (mir reicht es wenn pro Aufgabe nur eine Variable erscheint).

Außerdem klappt es gut, dass man bei der Eingabe auch x,y,z zulässt, indem man die Eingabe als Text definiert um diese im Anschluss umzuwandeln.

Mein einziges Problem ist nun tatsächlich der Wahrheitswert vereinfacht.

Als funktion macht wenn(Schülerlösung==vereinfacht(Schülerlösung)... keinen Sinn, da dies ja in jedem Fall zutrifft.

Als Text , also wenn ("Schülerlösung"=="vereinfacht(Schülerlösung)"... gibt es das Problem, dass die Reihenfolge der Angabe relevant wird, d.h. "2x-1" wäre ungleich "-1+2x", wobei ja in beiden Fällen bis zum Ende vereinfacht wäre.


Hat jemand noch eine Idee? Gibt es z.B. eine Zählfunktion, die die Schritte des Vereinfachens zählt? Dann könnte man abfragen ob dieser Wert beim 0 gleicht.

photo
1

Du könntest, um eine Abstufung der Bewertung zu erzeugen, folgende Vergleiche berücksichtigen

1) Antwortfunktion == Lösungsfunktion (Minimal Anforderung)

Auf Text-Basis die folgenden Vergleiche

2) Anzahl öfnende Klammern Antwortfunktion == Anzahl öfnende Klammern Lösungsfunktion

3) sortierte Liste aller Hochzahlen der Antwortfunktion == sortierte Liste aller Hochzahlen der Lösungsfunktion

. . Hochzahlen mit Zeichen ²,³,...⁹

4) Antwortfunktion (als Text) == Text(Vereinfache(Lösungsfunktion))

photo
1

Hi Rami,

genau daran bin ich gerade.

1) ist klar und einfach umzusetzen.

2) ist für mich nicht so wichtig, aber ich denke wenn ich 3) und 4) hinbekomme, dann kann man das zur Umsetzung von 2) verwenden.


Bei 3) und 4) ist mein Hauptproblem, dass ich ja die Schülerlösung als Text (oder eben als Funktion) in Einzelteile zerlegen muss. Am Besten in die Terme. Diese könnte ich dannversuchen in eine Liste zu machen, sortieren, um es anschließend wieder zusammenzufügen. Allerdings finde ich keine Möglichkeit, z.B. f(x)=2x^3 + 4x^5 in die Teile t1=2x^3 und t2=4x^5 zu zerlegen. Oder eben wie du in 3) vorschlägst die ganze Schülerlösung z.B. f(x)=2x^3 + 4x^5 darauf zu überprüfen, ob und wie oft die Hochzahlen, also 3 und 5 auftauchen und dies nach dem Sortieren zu vergleichen. Auch hier muss ich vom ganzen Text der Funktion einzelne Teile (die Exponenten) herausfiltern. Wie das geht ist mir absolut unklar, sry!

Hierbei sehe ich auch das Problem, dass lineare Terme nicht überprüft werden könnten (da ^1 ja nicht angezeigt wird).

Wenn du mir einen Anstoß geben könntest wäre ich super dankbar!

photo
1

Zitat: "Bei 3) und 4) ist mein Hauptproblem, dass ich ja die Schülerlösung als Text (oder eben als Funktion) in Einzelteile zerlegen muss."


Ich denke das wird sehr sehr kompliziert, respektive unmöglich. (Ein Parser mit Klammern-Prioritäten, Operations-Priorität, Vorzeichenbehandlung usw.)


Ich meine, wenn man schon weiss, dass Punkt 1 erfüllt ist, so kann man sicher gehen, dass falls Punkt 3 erüllt ist, das Polynom vollständig aufgelöst ist, aber die Reihenfolge der einzelnen Terme nicht unbedingt dem GGB-Standard entsprechen muss. Ach der lineare Term muss richtig sein, da Punkt 1 erfüllt ist.


Aehnlich aber nur mit einer gewissen Wahrscheinlichkeit verhält es sich mit Punkt 2.


Im Anhang ein Beispiel, wie die Hochzahlen aus der Schülerlösung resp. aus der Soll-Lösung herausgefiltert und verglichen werden kann.

photo
1

Verbesserte Version

photo
1

Wenn ich mir mal eine Anmerkugn erlauben darf. Deine Anfrage ist seeeeehr lang. Rami ist aber sehr geduldig und hat auch die Zeit dafür ;-)


Wenn du also mehr Hilfe, außer die sehr kompetente von Rami, bekommen möchtest, rate ich zu kürzeren Anfragen ;-)

Das bisherige AB erklärt z.B. was du erreichen willst.

photo
1

Hallo,

danke für die Rückmeldung. In Zukunft berücksichtige ich den Rat auf alle Fälle und werde ich eine kürzere Anfrage formulieren.

Auf jeden Fall auch wirklich 1000 Dank an Rami! Ich werde mich veruchen mich durch den Befehl Summe(Sortiere(EntferneUndefiniert(Folge(Wenn(Teilliste(SollFunkTxt, n, n) ∈ {"²", "³", "⁴", "⁵", "⁶", "⁷", "⁸", "⁹"}, Teilliste(SollFunkTxt, n, n)), n, 1, Länge(SollFunkTxt))))) zu kämpfen und ihn auf meine Aufgabe umzumünzen. Danke!

photo
1

Super - ich habe es eben implementiert! Klappt jetzt echt gut! Um noch sicher zu gehen, dass der lineare Ausdruck zu Ende vereinfacht wurde, habe ich noch die Variable var (die bei mir eben x, y, oder z annimmt mit in die sortierte Liste genommen, also : {var, "²", "³", "⁴", "⁵", "⁶", "⁷", "⁸", "⁹"}

Im Anhang findet ihr das fertige Applet, falls dieses für jemanden von Interesse ist!

Nicht wundern wegen des Errors, den ihr beim Öffnen bekommt - die Funktion i wird erst nach dem Aktualisieren generiert, deshalb findet Geogebra diese beim 1. Öffnen nicht.

photo
1

Sieht gut aus.

Ich konnte mich nicht zurückhalten und habe 2 Kleinigkeiten geändert

sowie das Initial-Problem behoben. (Aenderungsprotokoll im Anhang)

.

Das Aufbereiten der Aufgabe liesse sich im Coding verkürzen sofern man direkt als String aufbereiten würde.

In diesem Zusammenhang könnte man auch gleich alle Zufallsvariablen in den Script verlegen,

sodass F9 keine Auswirkung mehr hat sowie das Initalproblem nicht umgangen werden muss.

zumBeispie: (ungetestet)

Variable=""

SetzeWert[Variable, ZufälligesElement[{"x","y","z"}]]

SetzeWert[AufgabenText,""]

SetzeWert[Aufgabentext, Aufgabentext+ZufälligesElement[{"-",""}]]

SetzeWert[Aufgabentext, Aufgabentext+ZufälligesElement[{"","1","2","3","4","5","6","7","8","9"}]]

SetzeWert[Aufgabentext, Aufgabentext+ZufälligesElement[{"",Variable}]+"("]

SetzeWert[Aufgabentext, Aufgabentext+ZufälligesElement[{"-",""}]]

SetzeWert[Aufgabentext, Aufgabentext+ZufälligesElement[{"","1","2","3","4","5","6","7","8","9"}]]

SetzeWert[Aufgabentext, Aufgabentext+Variable+"^"]

SetzeWert[Aufgabentext, Aufgabentext+ZufälligesElement[{"1","2","3","4","5","6","7","8","9"}]]

usw.

Da es sich immer um denselben Befehlsaufbau handelt, könnte man Aufgabentext auch

mit einer genererierten Script-Liste per Ausführen[] erzeugen. Das wäre dann wesentlich

kürzer aber nicht so einfach zu durchschauen.

photo
1

Mit generiertem Skript für das Erzeugen von AufgabenTxt

photo
1

Hi Rami,


ich habe mir soeben mein upgedatetes Applet angesehen. Das ist ja Mega! Der Javascript Befehl zum Ausführen von F9 zu Beginn kannte ich auch nicht und das Umwandeln der Potenzen der Schülereingabe ist auch perfekt! Ist wirklich Hammer cool geworden - 1000 Dank!


Und das Andere Applet ist ja noch Krasser! Zwar habe ich verstanden, dass du die einzelnen Listen definierst, um dann den Aufgabentext Stück für Stück erweitern zu lassen, jedoch werde ich aus deinem scrAufgabe noch nicht ganz schlau:

Ich verstehe wie du den Zip Befehl anwendest, aber werde aus Object[" + (c34 + (nam) + c34) + "] und insbesondere aus c34 nicht schlau was wenn ich es richtig verstehe für die 4 steht?

Aber ich möchte deine Geduld auf keinen Fall weiter strapazieren. Ich werde ein ander Mal in Ruhe versuchen mich da weiter durchzukämpfen wollte aber nochmal danke sagen und respekt! =)

photo
1

Ich hab mir die Antwort zu c34 usw überlegt und dabei bemerkt, dass Objekt[......] gar nicht notwendig ist.

Aber der Reihe nach:

c34 ist in der Version01 in der Algebraansicht definiert als c34=UnicodeZuBuchstabe[34].

34 entspricht dem Anführungszeichen ("). Objekt[<string>] dient üblicherweise dazu um ein Objekt mittels eines String (Text) anzusprechen (anstelle mit dem Namen). Dieser Befehl ist in jenen Situation recht hilfreich, wo der Name eines anzusprechenden Objektes in Abhängigkeit des Statuses (zB. Antwort-Status) verändert werden soll. (Leider funktioniert dieser Befehl nicht in allen Konstellationen, siehe Manual).

.

Liegt in Objekt[<string>] der <String> als Direktwert vor (also nicht als Wert eines Objektes), zum Beispiel als "Antwort", so muss er in Anführungszeichen gesetzt werden, sodass GGB erkennt dass Antwort nicht der Name eines Objektes ist, wo sich der zu verwendende String befindet. Mit Objekt["Antwort"] wird also das Objekt mit dem Namen Antwort angesprochen. Der String "Antwort" wird also zur Laufzeit in einen Objekt-Namen umgewandelt. Der generierte Skript-Befehl enthält also ein Anführungszeichen (bei Verwendung von Object[]). Es ist aber nicht möglich ein Anführungszeichen innerhalb eines Strings einzugeben, weil dies den String abschliessen würde. Stattdessen wird c34 als Konstante an den (in den) String als Variable eingefügt.

.

Nun ist es so, dass in einer Skript-Liste alle Befehle (in englisch) inklusive der verwendeten Objektnamen als String vorliegen müssen . Zur Laufzeit werden die Elemente der Script-Liste in Befehle und Objekt-Namen umgewandelt (ähnlich wie in der Eingabezeile, dort aber nicht zur Laufzeit, sondern wärend der Applet-Erstellung).

Damit ist die Verwendung von Objekt[<string>] in einer Skript-Liste unnötig, da ja sowieso der ganze Befehl (inklusive Objekt-Namen umgewandelt (Interpretiert) wird. Im Anhang die verbesserte Version02.

Dort Setzt sich der zu generierende Befehl (als String) aus drei String-Teilen zusammen:

1) "SetValue[AufgabeTxt,AufgabeTxt+RandomElement("

2) der Inhalt des Objektes nam (nam ist der Verweis auf das aktuelle Zip-Element von Anweisung)

3) ")] "

Ich hoffe ich habe mit diesem Exkurs, nicht die letzten Reste von Verständnis vernichtet.

.

Aber, wenn Du als normal, in Sinnzusammenhängen, denkender Mensch den folgenden (leicht gekürzten) Witz nicht lustig findest, dann bist Du auf gutem Wege:

Ein Informatiker wird von seiner Frau beauftragt im Suppermarkt einzukaufen. "Bring 1 Liter Milch und wenn es frische Brötchen hat, dann bring 3". Der brave Mann kommt mit 3 Liter Milch zurück.

photo
1

Ich sehe erst jetzt, dass du mir gestern nochmal vor meinem Post geschrieben hattest. =)

Als ziemlicher Geogebra Noob würde ich zwar weiterhin die Finger von dem Skript lassen, aber jetzt Blicke ich zumindest das Vorgehen und die einzelnen Befehle. Außerdem finde ich das so sehr elegant gelöst, vor allem im Gegensatz zu meiner Erstellung derZufallsfunktio, die ich ja auch verschiedenen Wenn (...) Textelementen aneinandergereiht habe. Umso passender war dazu auch der Witz :D

photo
photo
1

So hier jetzt das fertige Applet falls jemand das gebrauchen kann =)

© 2023 International GeoGebra Institute