Arbeiten mit mathematischen Funktionen

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von ~blaze~.

    Arbeiten mit mathematischen Funktionen

    Hallo zusammen,

    ich habe nochmal eine Frage und hoffe, dass mir jemand weiterhelfen kann. Über die Suchfunktion und Google bin ich nicht wirklich weitergekommen.

    Zu meinem Problem:
    Ich schreibe gerade ein Programm in vb.net, in welchem nach diversen Eingaben etc. für eine Berechnung im Hintergrund eine mathematische Funktion 1. bis 3. Grades verarbeitet werden muss.
    Die Funktion an sich ist bekannt, das mathematische Bearbeiten der Funktion ist ebenfalls kein Problem. Jedoch weiß ich nicht, wie ich eine mathematische Funktion in einem Programm sinnvoll verarbeite?
    Folgendes muss ich mit der Funktion anstellen können:
    1. Ich muss aus dieser Funktion einen Graphen erstellen,
    2. die Funktion ableiten,
    3. aus der Ableitung ebenfalls einen Graphen erzeugen
    4. Maxima und Minima, sowie die Nullstellen der Funktion bestimmen und im Graphen der Funktion beschriften
    5. diese Werte entsprechend weiterverarbeiten können.

    Das ganze läuft mathematisch auf eine Kurvendiskussion hinaus.

    M.E. gibt es mehrere Möglichkeiten das Problem der Kurvendiskussion anzugehen:
    1. Man arbeitet mit einer Wertetabelle (über eine Datatable) und kann dann über Schleifen die Extremwerte und Nullstellen bestimmen
    2. Man arbeitet mit Variablen und bleibt bei einer rein mathematischen Lösung, was ich für ressourceneffizienter halte (oder?)

    Ich habe leider keine Ahnung, wie ich in vb.net einen Graphen erzeugen lassen kann. In Excel kann man bspw. nicht direkt einen Graphen anhand einer Funktion erstellen lassen und benötigt daher eine Wertetabelle. Ich hoffe, das das in vb.net nicht erforderlich ist, da dabei in meinem Fall etliche Werte (etwa 10.000-50.000 Werte) anfallen würden.
    Wie erarbeite ich eine sinnvolle Kurvendiskussion, welche direkt Funktionen unterschiedlichen Grades verarbeiten kann, mit einem möglichst einfachen, gut strukturierten Code?

    Ich möchte den Code gerne selbst entwickeln und euch auf gar keinen Fall zumuten, mir hier einen fertigen Code zu erstellen. Wenn es was fertiges schon gibt, erspare ich mir natürlich gern die Arbeit. Habt ihr vllt. ein paar Tipps, Literaturhinweise zu dem Thema oder gibt es irgendwo einen Codesnippet, welcher das Problem bereits gelöst hat? Da mathematische Funktionen in der Softwareentwicklung ja sehr häufig vorkommen, könnte ich mir gut vorstellen, dass es dafür bereits "fertige" Lösungen gibt.

    Für VBA bin ich für die Kurvendiskussion hier im Forum auf folgendes gestoßen. Den Code könnte ich in vb.net umwandeln. Der Code erscheint mir nur extrem lang. Gibt es in vb.net nicht eine einfachere Möglichkeit?
    Mathematik mit VBA - Teil 2: komplexe Zahlen und Nullstellen ganzrationaler Funktionen

    Wenn es zu meinem Problem bereits einen Thread gibt, freue ich mich auch über einen/mehrere Links. Vllt hab ich einfach nur falsch gesucht.

    Gruß,
    Samuel

    SamuelCooper schrieb:

    eine mathematische Funktion 1. bis 3. Grades
    kannst Du auf dem Papier vollständig beschreiben.
    Wenn Du damit fertig bist, stellst Du sie und ihre Ableitungen dar.
    Dazu gibt es z.B. das ChartControl. Dazu befragst Du das Forum AndAlso gugst hier.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Vielen Dank Rod für deine super schnelle Antwort. Ich gehe deinen Link mal in Ruhe durch und probiere das mal aus.
    Bedeutet aber, wenn ich das richtig verstehe, dass ich für das ChartControl eine Wertetabelle benötige, richtig? Diese Werte müssen ja vorab über eine Schleife berechnet werden. Frisst das nicht einiges an Speicher und verlangsamt das Programm, wenn dabei ca. 50.000 Werte erzeugt werden müssen?
    Für den Graphen, denke ich ist ein ChartControl eine gute Lösung. Muss ich aber mal tiefer einsteigen.

    Ja, ich kann auf dem Papier die Grundfunktion aufstellen, was aber für die Kurvendiskussion nicht viel hilft, da diese für eine Funktion 3. Grades so aussieht:
    f(x)=ax^3+bx^2+cx+d
    und die Funktion 2. Grades etwas anders. Die Werte a bis d sind nicht bekannt, sondern werden durch Eingaben festgelegt, sind also Variablen, was sich ja programmtechnisch dann auch mit Variablen lösen lässt.
    Somit müsste ich für jeden Grad der Funktion einen eigenen Algorithmus schreiben... Das Problem der Kurvendiskussion (Extremwerte und Nullstellen zurückgeben) löst ChartControl nicht, oder? Bzw. man müsste über eine Schleife die Werte der DT auslesen und miteinander vergleichen, sehe ich das richtig?

    SamuelCooper schrieb:

    Somit müsste ich für jeden Grad der Funktion einen eigenen Algorithmus schreiben.
    Nö.
    Mit a = 0 hast Du eine Funktion zweiten Grades.
    Und die Ableitung ist auch bekannt:
    f'(x) = 3xa^2 + 2bx + c
    Und 50.000 Werte berechnen sollte mit etwas Optimierung (Horner-Schema) auch recht flott gehen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hi
    modelliere dir Funktionen als Klassen. Z.B. Schreibe eine Klasse FunctionBase mit abstrakten Methoden für das Auswerten (z.B. double zurückgeben), Ableiten (gibt eine FunctionBase zurück) und ggf. ToString, das du abstrakt überschreibst. Anschließend führst du diese in primitiven Funktionstypen aus, also bspw. f(x)^g(x) (a^b=e^(b*ln a) für die Ableitung), sin f(x), x, a, f(x) * g(x), usw. und ergänzt jede diese Klasse vollständig. Speichere auch den Bezeichner der Funktion irgendwo.
    Wenn du damit fertig bist, gibt es numerische Verfahren zur Nullstellenfindung.
    Anschließend musst du nur noch die Eingabe übersetzen, d.h. jedes Zeichen durchgehen und je nach Zeichenart und Regeln eine entsprechende FunctionBase suchen.
    Wenn du's so machen willst, helf' ich dir gern dabei.
    Ach ja: Graph zeichnen geht über die Evaluate-Funktion auch sehr einfach.

    Viele Grüße
    ~blaze~
    @RodFromGermany: Das mit dem Graphen hat schon mal gefunzt. Vielen Dank dafür. Den Rest muss ich mir mal noch zusammenbasteln.

    @~blaze~: Deine Lösung klingt irgendwie sauberer. Vielen Dank für dein Angebot. Leider bin ich in vb.net und der Informatik noch nicht so fit, als das ich da sofort selbst durchsteigen würde. Hab mich bisher noch nicht wirklich mit dem Erstellen von Klassen beschäftigt. Hab mich mal kurz eingelesen. Das klingt sehr interessant und hilfreich. Ich werde mich damit zeitnah mal intensiver befassen müssen. Die Frage ist, ob ich das für mein Problem wirklich benötige, oder ob ich mir bei meinem aktuellen Problem mein Leben nicht schwerer mache, als nötig. Ich will kein Programm zur Kurvendiskussion schreiben und muss die auch nicht unbedingt durchlaufen lassen. Ich kenne die math. Funktionen und deren Ableitungen "auf Papier". Wichtig für mich ist vorallem der Graph und die Extremwerte. Selbst Nullstellen müssten nicht wirklich sein. Den Graph brauche ich zur Anzeige für den User als Kontrolle und die Extremwerte zur weiteren Verarbeitung. Meine Frage kam daher, da ich dachte, dass es so was bereits vorgefertigt schon gibt oder als Funktion in vb.net bereits integriert ist.
    Wie kann ich denn einen Graph über die Evaluate-Funktion zeichnen? Ich gehe jetzt mal davon aus, dass ich dafür dann keine Datatable mehr brauche?
    Schau dir mal das hier an:
    foren.activevb.de/forum/vb-net…und-Differenzieren/#forum
    Enthält Funktionsplots, Integrieren und Differenzieren (numerisch) und ein paar speziellere Dinge, wie z.B. ein Fadenkreuz um Werte auf der Funktion zu bestimmen.

    Lass dich nicht von Stichworten wie Doppelschicht oder Langmuir abschrecken. Die Mathe ist auf Schulniveau (Abi 2017)

    lg, vb3-Guru
    Numerische Lösungen für Ableitung und Integral sind i.a. fehlerbehaftet, je nach Fall auch sehr stark. Das würde ich an der Stelle nicht so sehr empfehlen.

    Arbeite dich mal in die Klassen ein, das ist ein so grundlegendes Konzept, dass du da kaum darum herum kommen wirst und selbst wenn, ist das Resultat zumeist eher mangelbehaftet.

    Graphen kannst du sehr einfach erstellen, indem du ein Graphics-Objekt erstellst (voraussetzend, du verwendest Windows Forms und nicht WPF) und dieses entsprechend bemalst.
    Um einen Graphen schön plotten zu können musst du
    1. entweder eine stetige Funktion plotten wollen oder die Stellen kenne, an denen der Graph nicht stetig ist (selbiges gilt für Definitionslücken) und
    2. einen geeigneten Algorithmus zum Zeichnen verwenden.

    Punkt 1 ist einfach realisierbar, sowohl wenn du mein Klassenkonzept verwendest (dieses einfach um alle benötigten Dinge, wie Urbild, usw. erweitern), als auch, wenn du es manuell eingeben musst. Punkt 2 ist etwas komplizierter: Zeichne alles, was sich zwischen Definitionslücken oder Unstetigkeitsstellen befindet und im sichtbaren Bereich ist (unterteile den Graphen also in Intervalle).
    Das Zeichnen an sich wird jetzt etwas umständlicher. Der einfachste Weg ist, einfach je eine Linie von (x, f(x)) nach (x+1, f(x+1)) zu zeichnen, aber wenn f(x+1) - f(x) > 1, wird das zu geraden Linien zwischen den Punkten führen.
    Die wahrscheinlich einfachste Lösung an dieser Stelle wäre, einen renommierten Plotter einzubinden.
    Wenn du das nicht möchtest, wäre es möglich, das trotzdem selbst in die Hand zu nehmen, aber dazu möchte ich erst mal wissen, ob du bereit bist, etwas Aufwand in das ganze zu stecken, das ist nicht trivial.

    Edit: Hier hatte ich sowas mal gemacht. Beachte aber, dass es nicht nur sichtbare Werte zeichnet und auch nicht sonderlich elegant ist.

    Viele Grüße
    ~blaze~

    ~blaze~ schrieb:

    Numerische Lösungen für Ableitung und Integral sind i.a. fehlerbehaftet, je nach Fall auch sehr stark. Das würde ich an der Stelle nicht so sehr empfehlen.


    Also das ist m.E. eine ziemlich gewagte These ;)

    Numerische Integration oder Differentiation ist in wissenschaftlichen Simulationsprogrammen Standard (siehe z.B. Poisson-Solver). Natürlich gibt es kleine Fehler - die muss man kennen und berücksichtigen, aber für einen Funktionsplot reicht es allemal. Die analytischen Methoden kann man immer verwenden, um die numerische Lösung zu verifizieren.

    lg, Vb3-Guru
    Genau das mein ich. Es kommt drauf an, die Schwächen zu kennen. Aber das erfordert Erfahrung, ist manchmal kompliziert und manchmal, wie beim Zeichnen von Graphen, ggf. auch unnötiger Aufwand. Ginge es jetzt darum, das Integral der Funktion zu zeichnen, würde ich dir zustimmen, da ist eine numerische Lösung sinnvoll und ggf. auch für die Berechnung der Extrema.

    Viele Grüße
    ~blaze~