Funktion durch mehrere Punkte [Dreiecksfunktion]

serc shared this question 4 years ago
Answered

Hallo liebe GeoGebra Gemeinde,


folgendes Problem: ich habe mehrere Punkte (Liste1). Und aus diesen möchte ich eine Funktion erzeugen die möglichst genau einer Dreiecksfunktion entspricht.

Ich habe es schon mit TrendPoly und Spline versucht, sieht nicht gut aus, bzw. entspricht nicht meiner Erwartungen.


    Liste1 = {(0, 0), (7, 16), (22, 0), (27, 13), (35, 0), (40, 11), (46, 0), (52, 7), (58, 0)}


Das sind die Punkte aus welcher ich eine Dreiecksfunktion haben möchte. Diese soll z.B. f(x) sein.

Zudem soll danach noch die Fläche berechnet werden.


Zuvor habe ich das mit einem Vieleck realisiert, alle Punkte verbunden als Vieleck -> Voila die Fläche war da, aber nicht die Funktion.


Die Funktion benötige ich für eine andere Funktion, die sich aus dem Integral von f(x) / konst. zusammen setzt.


Aber da ich die Punkte als Vieleck verbunden habe konnte ich keine neue Funktion daraus bilden.


= Ich möchte also aus den Punkten eine Dreiecksfunktion haben, und weiß nicht wie :(. Eventuell ein Spline nehmen und diesen so stark verändern dass dieser einer Dreiecksfunktion ähnelt?


Also eine abfallende und enger werdende Dreiecksfunktion!


Schaut euch am Besten die Punkte an und verbindet diese von links nach rechts. So soll die Funktion dann aussehen :D


Beispiel einer normalen Dreiecksfunktion: 4fbd498ce16e0f18125d59fd6d44cee0


Danke schonmal! :)

Comments (13)

photo
1

Hallo,

wenn ich die Aufgabe richtig verstanden habe, ist die angehängte Datei die Lösung.

Die Idee ist, aus je zwei aufeinander folgenden Punkte eine Polynomfunktion vom Grad 1, d.h. eine lineare Funktion zu bauen, aus denen man dann per Fallunterscheidungen die gesuchte Dreiecksfunktion konstruiert.

Gruß, Günter

https://ggbm.at/599995

photo
1

normalen Dreiecksfunktion
Mit floor() - ,ceil() - , sgn() - und/oder Wenn[] - Funktionen:

    f(x) = (x - floor(x)) (floor(x) <= x <= ceil(x) - 0.5) + (-x + ceil(x)) (ceil(x) - 0.5 < x < ceil(x))

    g(x) = Wenn[floor(x) < x < floor(x) + 0.5, sgn(sin(2π x)) (x - floor(x)),

    Wenn[floor(x) + 0.5 < x < floor(x) + 1, sgn(sin(2π x)) (x - floor(x) - 1),

    Wenn[x == floor(x), 0,0.5]]]

    h(x) = (1 - 2 ceil(abs(x) - floor(abs(x)) - 0.5)) (abs(x) - floor(abs(x)) - ceil(abs(x) - floor(abs(x)) - 0.5))

    i(x) = Wenn[floor(x) <= x < ceil(x) - 0.5, x - floor(x),-x + ceil(x)]

usw. ...

Schaut euch am Besten die Punkte an und verbindet diese von links nach rechts.
Das ist eine abschnittsweise definierte Funktion.

Das hier macht im Grunde das gleiche wie die Lösung von Günter (das ist ein Script, einfach in die Eingabezeile kopieren):

    Ausführen[{UnicodeZuText[Verbinde[Zip[TextZuUnicode[K], K, Verbinde[{{"f(x) = "}, Folge["If[ x(Element[Liste1, " k "]) <= x <= x(Element[Liste1, " + (k + 1) + "]) , y(Element[Liste1, " + (k + 1) + ("] - Element[Liste1, " k "]) / x(Element[Liste1, ") + (k + 1) + ("] - Element[Liste1, " k "]) (x - x(Element[Liste1, " k "])) + y(Element[Liste1, " k " ]) , "), k, 1, Länge[Liste1] - 1], {"0"}, Folge["]", k, 1, Länge[Liste1] - 1]}]]]]}]

photo
1

Super,


danke euch beiden.


@Günter: Falls ich nun neue Punkte einfügen möchte wäre das doch nun total umständlich. Das heißt ich müsste ja noch die jeweiligen Parameter hinzufügen etc. bei Locos Lösung geht das mit Beliebig vielen Punkten aus der Liste raus. Habe aber beide Lösungen verstanden und angewandt danke nochmals!


@Loco: Deine Funktion bein bei -inf und geht nach dem letzten Punkt nach inf. jeweils mit dem Funktionswert 0.

Mich stört das :) das Intervall vom 1. bis zum letzten Punkt.


Das wäre doch einfach ,x(A),x(Z))] oder ? Funktion[.... ,(Intervall)]

Will aber irgendwie nicht, oder ich mache etwas falsch :(


Danke!

photo
1


@Loco: Deine Funktion bein bei -inf und geht nach dem letzten Punkt nach inf. jeweils mit dem Funktionswert 0.

Mich stört das :) das Intervall vom 1. bis zum letzten Punkt.



Ups :)


geht bei -inf los und nach dem letzten Punkt weiter nach inf. jeweils mit dem Funktionswert 0.

Hätte aber nur gern das Intervall vom ersten bis zum letzten Punkt.

Danke :D

photo
1

Bei euch beiden Funktioniert die Dreiecksfunktion, aber leider nicht richtig die Funktion des Integrals anschließend.

Bei Günter gar nicht und bei Loco ist die Funktion des Integrals falsch, sie hat Sprünge und verläuft auch im neg. Funktionswerte Bereich was ja nicht stimmt.

Es könnte sein dass hierbei die Funktion für die einzelnen Punkte undefiniert ist und deswegen er dort Sprünge in der Funktion für das Integral macht.

photo
1

geht bei -inf los und nach dem letzten Punkt weiter nach inf. jeweils mit dem Funktionswert 0.

Hätte aber nur gern das Intervall vom ersten bis zum letzten Punkt.

Danke :D

Achtung, bei nicht durchgängig Definierten, abschnittsweise definierten Funktionen funktioniert der Integral[] - Befehl nicht!
    Ausführen[{UnicodeZuText[Verbinde[Zip[TextZuUnicode[K], K, Verbinde[{{"f(x) = "}, Folge["If[ x(Element[Liste1, " k "]) <= x <"+(If[k != Länge[Liste1] -1 , "","="])+" x(Element[Liste1, " + (k + 1) + "]) , y(Element[Liste1, " + (k + 1) + ("] - Element[Liste1, " k "]) / x(Element[Liste1, ") + (k + 1) + ("] - Element[Liste1, " k "]) (x - x(Element[Liste1, " k "])) + y(Element[Liste1, " k " ]) ") + (If[k != Länge[Liste1] -1 , ", ",""]), k, 1, Länge[Liste1] - 1], Folge["]", k, 1, Länge[Liste1] - 1]}]]]]}]

Bei euch beiden Funktioniert die Dreiecksfunktion, aber leider nicht richtig [...], sie hat Sprünge und verläuft auch im neg. Funktionswerte Bereich was ja nicht stimmt.

Es könnte sein dass hierbei die Funktion für die einzelnen Punkte undefiniert ist und deswegen er dort Sprünge in der Funktion für das Integral macht.

Ist für die einzelnen Punkte definiert.

Wegen den Sprüngen siehe:

photo
1

Danke für die schnelle Hilfe immer Loco! :) Hätte ich nicht erwartet.


Also die Fkt f(x) mit den Linearen Teilfunktionen habe ich nun durch dein Script erhalten.


Wie bekomme ich denn nun die (Teil-) Integralfunktion(en) zu diesen? Es geht ja nur Abschnittsweise oder?

Ich habe im Forum von Birgit Lachner einen Post gelesen, wo sie schreibt, dass Sie dies in Ihrem GeoGebra Handbuch beschreibt.

http://forum.geogebra.org/v...


Ich sitze aber leider im Geschäft und darf keine pdfs. downloaden :(


Wenn dass also niemand auf die schnelle weiß, heißt es wohl "Home Office" für mich.


*******

Wie gesagt, aus den Teilfunktionen, Teilstammfunktionen und die wieder als Teilfunktionen einer Funktion erzeugen lassen, und dies falls möglich ohne Def. lücken. Habe schon einiges probiert, aber habe leider Effektiv noch keine 10h mit GeoGebra gearbeitet.

Falls ich hier einen Thread zu Integration von Teilfunktion oder ähnliches übersehen habe, lasst es mich bitte wissen!


Mfg

Serc

photo
1

Ich schaff es nicht :(

Ich krieg es einfach nicht ihn. So ein Mist...


:confused:

photo
1

Da

  • du eine auf deine Punktliste beschränkte Funktion möchtest
  • diese aus einem Guss also abschnittsweise Definiert haben möchtest
  • GGb dies aus diversen Gründen nicht automatisiert Integrieren kann

ist Handarbeit angesagt.

Da dies aber mit einer tüchtigen Portion Denkens skript-bar ist gibt es hier nochmal alles als Skript:

    Execute[{"Liste1 = {(0, 0), (7, 16), (22, 0), (27, 13), (35, 0), (40, 11), (46, 0), (52, 7), (58, 0)}"}]

    Execute[{UnicodeToText[Join[Zip[TextToUnicode[K], K, Join[{{"f(x) = "}, Sequence["If[ x(Element[Liste1, " k "]) <= x <"+(If[k != Length[Liste1] -1 , "","="])+" x(Element[Liste1, " + (k + 1) + "]) , y(Element[Liste1, " + (k + 1) + ("] - Element[Liste1, " k "]) / x(Element[Liste1, ") + (k + 1) + ("] - Element[Liste1, " k "]) (x - x(Element[Liste1, " k "])) + y(Element[Liste1, " k " ]) ") + (If[k != Length[Liste1] -1 , ", ",""]), k, 1, Length[Liste1] - 1], Sequence["]", k, 1, Length[Liste1] - 1]}]]]]}]

    Execute[{UnicodeToText[Join[Zip[TextToUnicode[K], K, Join[{{"F(x) = "}, Sequence["If[ x(Element[Liste1, " k "]) <= x <"+(If[k != Length[Liste1] -1 , "","="])+" x(Element[Liste1, " + (k + 1) + "]) , y(Element[Liste1, " + (k + 1) + ("] - Element[Liste1, " k "]) / x(Element[Liste1, ") + (k + 1) + ("] - Element[Liste1, " k "]) (1/2 x^2 ") + (If[ k > 1 , "- 1/2 x(Element[Liste1, " k "])^2 " , ""]) + (" - x(Element[Liste1, " k "]) (x ") + (If[ k > 1 , "- x(Element[Liste1, " k "]) " , ""]) + (" ) ) + y(Element[Liste1, " k " ]) (x ") + (If[ k > 1 , "- x(Element[Liste1, " k "]) " , ""]) + (" )") + (If[ k > 1 , " + Sum[Sequence[1 / 2 x(Element[Liste1, h] - Element[Liste1, h - 1]) Max[y(Element[Liste1, h]), y(Element[Liste1, h - 1])], h, 2, " + k + "]]" , "" ]) + (If[k != Length[Liste1] -1 , ", ",""]), k, 1, Length[Liste1] - 1], Sequence["]", k, 1, Length[Liste1] - 1]}]]]]}]

    Execute[{"SetLineThickness[ f , 4]","SetLineThickness[ F , 4] ","SetColor[ f, ""Orange"" ] ","SetColor[ F, ""DarkBlue"" ] ","ZoomIn[-3, -15, 60, 400] "}]

Anleitung:[list=1][/li]

  • neues GeoGebra-Fenster öffnen
  • neue Schaltfläche erzeugen
  • beim Erzeugen den ganzen Codebatzen in das Feld "GeoGebra Skript" kopieren
  • "Übernehmen" klicken
  • die Schaltfläche anklicken
  • Schaltfläche löschen
  • [/ul]Dieser Umstand muss gemacht werden, da GGb bei einer Überschreitung der Grenze der Maximalen Zeichen in der Eingabezeile abstürzt/einfriert/Kaffee trinken geht.


    Habe schon einiges probiert, aber habe leider Effektiv noch keine 10h mit GeoGebra gearbeitet.
    Da habe ich zu Beginn wohl zu unverdauliche Geschütze aufgefahren...

    Die Skripts selbst wirst du zur Zeit noch nicht vollständig durchschauen können.

    Folgende Tipps gebe ich dir aber zum an-Denken auf den Weg:

    • Versuche immer erst einmal kleinere Probleme anzugehen.
    • Beschäftige dich mit dem Wenn[] - Befehl , einfache Beispiele:
        Wenn[0 <= x < 2pi,sin(x)]

        Wenn[0 <= x < 2pi,sin(x), abs(x-pi) - pi ]

        Wenn[ x <= 0,-x^2, Wenn[ 2pi <= x , (x-2pi)^2, sin(x)] ]

    • der Folge[] - Befehl kommt in meiner Lösung zur auf-Addierung der Flächen zum Einsatz
    • Summe[] - Befehl wie der Name schon sagt
    • Die Struktur der erzeugten Funktionen untersuchst du am besten anhand der Funktionen selbst und nicht anhand des Skripts.

      Dazu kannst du entweder das Objekt anklicken und [F3] drücken und den Code in der Eingabezeile untersuchen oder den selbigen im Objekt-Eigenschaftsfenster.

    Für weiteres stöbere etwas im Forum und Frage bei Problemen nach.

    Die weiteren Forumsteilnehmer werden dir sicherlich mit Rat und Tat zur Seite stehen.


    Ich für meinen Teil klinke mich dann mal aus.

    over and out

    Loco

    photo
    1

    Nochmals zurück zur Version von Günter.


    @Günter: Falls ich nun neue Punkte einfügen möchte wäre das doch nun total umständlich.

    Dieser Nachteil lässt sich wie im Anhang gezeigt umgehen. Das an- oder einfügen von Punkten ist (fast) so einfach wie in einer Liste (auch dies liesse sich noch umgehen, lohnt sich aber kaum). Die erzeugte Funktion ist problemlos ableitbar (könnte man aber auch als eigenständige Funktion aus der Steigung herleiten).


    Eigentlich müsste sich dieses Prinzip auch mit Folge[] oder Zip[] realisieren lassen (also ohne Script-Befehle). Tut es auch, wenn man den Else-Fall nicht spezifiziert (dann ist der Else-Fall per default = undefiniert). Den muss man aber spezifizieren weil die Summe[] mit nur einem undefinierten Element (anstelle von 0) zu undefiniert führt. Sobald man aber den Else-Fall spezifiziert reagiert ggb für mich mit nicht nachvollziehbarer Syntax-Interpretation (möglicherweise ein bug).


    Eine einigermassen nachvollziehbare Lösung für das Integral bleibe ich vorerst "schuldig". Vielleicht finde ich noch eine vernünftige Lösung.


    Raymond

    https://ggbm.at/666563

    photo
    1

    Hallo zusammen,

    eine Erweiterung und den Graphen der Integralfunktion kann man so erhalten:


    1) Neuer Punkt in Spalte B

    2) Markieren C5 bis E5 und 'herunterziehen'.

    3) In Eingabezeile f(x) = 'letzte benutzte E-Zelle' (hier f(x) = E5)

    4) In Eingabezeile I = Integral[f,0,a]

    5) In Eingabezeile Px=(a,I)

    6) Ortslinie von Px in Abhängigkeit von a ist der Graph der Integralfunktion...


    Gruß, Günter

    https://ggbm.at/666579

    photo
    1

    Hallo


    Nun habe ich GGB doch noch eine Version ohne Tabelle, Scripts oder Ortslinien abgerungen.

    Dabei habe ich folgende Lösungsstrategieen verfolgt:


    1) Anstelle von Wenn[<Bedingung>,<funktion>] habe ich <Funktion> * <Bedingung> angewendet. Das heißt, die Funktion wird mit der Bedingung multipliziert. Dabei wird von GGB anstelle von true resp. false der numerische Wert 1 resp. 0 eingesetzt. Damit erledigt sich auch der Else-Fall.


    2) Zunächst wird mit den Funktionen über den gesamten Werte-Bereich von x gearbeitet (also ohne Multiplikation mit der Bedingung für die Segment-Grenzen). Erst ganz am Schluss wird das Segment extrahiert (durch Multiplikation mit der Segment-Grenzen-Bedingung).


    3) In den Listen L12 und L13 wird der Korrektur-Faktor für das Integral-Segment errechnet. Zunächst wird in L12 in einem "pseudo Punkt" der untere/linke (=x) und der obere/rechte (=y) Y-Wert des Teil-Integrals ermittelt. (Anmerkung: leider funktionier hier F(<wert>) nicht -- ich meine das ist ein Bug -- stattdessen habe ich Schneiden[] verwendet).

    Danach werden in der Liste L13 die Summe der "Y-Höhe" aller (einem bestimmen Segment) vorangehenden Segmente ermittelt (Summe der Differenz der beiden in L12 ermittelten Y-Werte), das ergibt den Soll-Wert. Davon wird der untere/linke Y-Ist-Wert des Integral-Segments subtrahiert. Das ergibt den Korrektur-Wert, der in L14 benötigt wird.


    Die Performance dieser Lösung ist schlecht (nur das Integral (rot) betreffend, nicht die Dreiecksfuntion (grün)). Das Betrifft vermutlich ausschliesslich den Befehl Integral[] und gilt vermutlich für alle Lösungsansätze, die Integral[] verwenden. Sollten sich die Punkte dynamisch verhalten, so sind alle (?) Lösungen die Integral[] verwenden unbrauchbar. Es ist auch denkbar, dass GGB (resp. das dahinterliegende CAS (?)) an die Grenze des Speicherbedarfs stösst, sodass die Anzahl Punkte möglicherweise limitiert ist. In meiner Umgebung ist es auch vorgekommen, dass sich GGB (resp. Java) bereits in der Initial-Phase verabschiedet hat.


    Im übrigen bin ich der Meinung, dass bei zusammengesetzten Funktionen Ergänzungs-Bedarf besteht, sodass man ohne grossartige Lösungsstrategien zum Resultat kommt.


    So ganz nebenbei noch eine Alternative zur etwas "minimalistisch" (ab GGB 5.0) gestalteten CheckBox.


    Raymond

    https://ggbm.at/666589

    photo
    1

    Hallo


    Und hier noch (aus meiner Sicht: abschliessend!) eine Lösung ohne Performance-Probleme.


    Auf den Einsatz von Integral[] ist vollständig verzichtet.

    Statt dessen wird in CAS das Integral der Funktion aus Liste L06 mit symbolischen Variabeln einmal ermittelt.

    Das Resultat (ein Polynom 2. Grades) aus CAS wird in Liste L11 (sinngemäss) angewendet.


    Der Rest ist kosmetischer Natur: Neu ist L03 um den Code in L06 und L11 zu entlasten. Die Namenskonvention innerhalb der verschiedenen Zip[] sind der Namenskonvention, die in CAS verwendet ist, angepasst.


    Ansonsten gelten dieselben Prinzipien/Lösungsstrategien wie im vorangegangenen Post erläutert.

    https://ggbm.at/666593


    Nun könnte die Punktliste durchaus dynamisch verwendet werden.

    https://ggbm.at/666597


    Raymond

    © 2019 International GeoGebra Institute