Tangens korrekt darstellen



  • Hallo,

    ich schreibe gerade ein Programm, das eine beliebige Funktion plotten und darstellen kann. Das funktioniert auch soweit... Bis auf:

    die Tangensfunktion.

    Bei dieser Tangensfunktion gibt es ja bekanntlich diese "Sprünge" (nicht im mathematischen Sinn) vom positiven y zum negativen y. Also etwa (tan(1.5) -> 14.101) - Der nächste Wert (tan(1.75) -> -5.520). Dieses Verhalten erzeugt jetzt in meinem Funktionsplotter eine Gerade zwischen diesen beiden Punkten, die nicht erwünscht ist.

    Meine Frage nun: Gibt es eine Möglichkeit das "elegant" abzufangen??

    Sicher könnte man jetzt in diesem Programm den Tangens seperat programmieren und hätte damit das Problem gelöst (wobei was passiert bei sin(x)/cos(x))...

    Also nochmal: Gibt es eine Möglichkeit dieses Verhalten der Tangensfunktion an zwei Punkten festzustellen??

    Danke im voraus!



  • Wenn du weißt, dass tan(x) = sin(x)/cos(x), kannst du natürlich versuchen, die Nullstellen von cos(x) herauszufinden und dort nicht zu verbinden. Aber es wäre wahrscheinlich einfacher, wenn du grafisch die zweite Ableitung bestimmst und wenn die zu groß ist, verbindest du die Punkte nicht mehr. Oder wenn der Abstand zwischen zwei Punkten zu groß ist, verbindest du die Punkte einfach auch nicht mehr.



  • wxSkip schrieb:

    Wenn du weißt, dass tan(x) = sin(x)/cos(x), kannst du natürlich versuchen, die Nullstellen von cos(x) herauszufinden und dort nicht zu verbinden. Aber es wäre wahrscheinlich einfacher, wenn du grafisch die zweite Ableitung bestimmst und wenn die zu groß ist, verbindest du die Punkte nicht mehr. Oder wenn der Abstand zwischen zwei Punkten zu groß ist, verbindest du die Punkte einfach auch nicht mehr.

    Danke für den Tipp! Wenn ich eine klare 3er Trennung zwischen Funktionsauflösung (Interpretation), Berechnung und Darstellung habe, ist es extrem unschön bei der Darstellung eine Funktion (hier Tangens) berücksichtigen zu müssen. Bei allen anderen Funktionen etwa log(x) entstehen ja ungültige Werte (nan), die von der Darstellung ausgeschlossen werden.

    Und was ist ein zu grosser Abstand?? Bei "(1/8)*tan(x)" habe ich ähnliche Abstände, wie etwa bei "x^2"...

    Ich sehe schon... ich muss da noch ein paar Nächte "hirnen" - andererseits gibt es so viele Funktionsplotter und -Taschenrechner, die das Problem ja irgendwie schon gelöst haben...



  • Das mit dem zu großen Abstand ist in der Tat problematisch - ich dachte schon, ob du das von der Anzeigegröße abhängig machen könntest, aber das erscheint mir als nicht so gute Idee. Wie wäre es denn, wenn du eine Verbindung mit großem Abstand nur entfernst, wenn die Ableitung bei den umgebenden zwei Verbindungen ein anderes Vorzeichen hat?



  • wenn die Sache für sin(x)/cos(x) geklärt ist, kann er sich dann mit 1/sin(1/x) beschäftigen ...

    ein Test auf |Steigung| > c läßt sich ja leider austricksen, 102030^40*sin(x) ist auch ganz schön steil, verschwindet aber nicht ins Unendliche

    für eingeschränkte Klassen von Funktionen kann man es systematisch machen, etwa Partialbruchzerlegung für ganzrationale Fkt und Berechnung der Nullstellen in den Nennern usw

    aber - hab' ich was übersehen oder was spricht eig dagegen, den Linienzug abzubrechen, wenn er oben oder unten durch den Rand des Plot-Rechtecks stößt, so lange auszusetzen, wie die Funktionswerte außerhalb dieses Fensters liegen, und eine neue Linie anzusetzen, sobald die Werte wieder innerhalb des Plot-Rechtecks liegen ?



  • großschreibung schrieb:

    aber - hab' ich was übersehen oder was spricht eig dagegen, den Linienzug abzubrechen, wenn er oben oder unten durch den Rand des Plot-Rechtecks stößt, so lange auszusetzen, wie die Funktionswerte außerhalb dieses Fensters liegen, und eine neue Linie anzusetzen, sobald die Werte wieder innerhalb des Plot-Rechtecks liegen ?

    Plotte so mal y = sin(x) für -0.5 < y < 0.5

    Ohne es groß durchdacht zu haben, vermute ich, dass es keine sinnvolle, allgemein gültige Lösung gibt. Sonst würden die 1001 Plotprogramme auf dieser Welt genau eine solche Lösung verwenden.



  • Ich danke allen, die hier Gedankenanstösse gepostet haben...

    Mups schrieb:

    Plotte so mal y = sin(x) für -0.5 < y < 0.5

    Ohne es groß durchdacht zu haben, vermute ich, dass es keine sinnvolle, allgemein gültige Lösung gibt. Sonst würden die 1001 Plotprogramme auf dieser Welt genau eine solche Lösung verwenden.

    Es ist doch so, dass sich unabhängig vom Koeffizienten die Tangenskurve immer folgenden Werten nähert:

    1/2*[e]pi[/e]+(n*[e]pi[/e])

    Somit lassen sich die relevanten Punkte - sagen wir auf einer x - Achse von -10 bis 10 auf 6 Kandidaten reduzieren die da wären:

    +7.85,+4.71,+1.57+-7.85, +-4.71, +-1.57

    Man muss jetzt also nur im "Dunstkreis" dieser Werte den Abstand der 2 Punkte untersuchen und zeichnet die entsprechende Gerade nicht.
    Ich habe das jetzt mal programmtechnisch umgesetzt - es funktioniert - und soweit ich mit weiteren Funktionen getestet habe, gibt es keinen Konflikt. Ob das jetzt die allgemeine Vorgehensweise bei 1001 Plottern und Rechnern ist, weiss ich natürlich nicht. Ich kann jedenfalls mit dieser Lösung leben...
    Ach ja LateX war noch nie meine Stärke 🙂



  • Plotte mal mit einem Programm tan(x) für x=1.5705..1.5705


Log in to reply