MathLib

Es gibt 45 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Heyho,

    Ich möchte gerne eine Funktionslib schreiben die möglichst viele unterschiedliche mathematische Funktionen bereitstellt. Hättet ihr Ideen was ich einbauen könnte?

    Folgende Ideen habe ich:

    - Funktionsparser

    - Stochastik
    ____Bernoullikette
    ____Binomialverteilung

    - Kombinatorik


    Eine weitere Sache die mir gerade einfällt: Kennt jemand von euch eine Seite die den Shunting-Yard-Algorythmus verständlich erklärt, denn bei Wikipedia komm ich nicht mit (Oder ein gleichwertiger Algoryhtmus).

    Danke für eure Ideen/Hilfe :thumbup:

    8-) faxe1008 8-)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Artentus“ ()

    ErfinderDesRades hat da auch mal ein schönes Tutorial rausgebracht.
    [VB 2010] FormelParser und ExpressionTree
    "Zwei Dinge sind unendlich, das Universum und die menschliche Dummheit, aber bei dem Universum bin ich mir noch nicht ganz sicher." Albert Einstein
    Newton-Verfahren!

    Edit:// Zu langsam :(
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    @LaMiy:

    Danke :thumbsup: . Das Newton verfahren war mir bereits bekannt hatte das aber vergessen. Problem hierbei ist allerdings auch, dass ich zunächst einen Parser brauche um aus der Funktionen die Ableitungen zu bilden bzw. deren Funktionswert ;)

    Integralrechnung so wie das kurz in Wikipedia überfolgen habe: selbe Hürde. Aber danke!

    8-) faxe1008 8-)
    Hi
    nein, modelliere dir abstrakte Funktionen, wie f(x) ^ g(x), f(g(x)), usw. und finde allgemeingültige Regeln. Den Parser lässt du dann aus einer Eingabe genau so eine Expression erzeugen. Auf den Expressions definierst du dann die Funktionalität, wie z.B. n-maliges differenzieren, was für n < 0 eben integrieren ist.

    Gruß
    ~blaze~
    @~blaze~:

    Was genau meinst du mit allgemein gültige Regeln? Bei deinem Beispiel: f(x) ^ g(x) müsste ich immer noch die einzelenen Funktionen kennen um die Funktionswerte zu bestimmen, um diese miteinander zu verrechnen.

    Was genau meinst du mit Funktionalität?

    8-) faxe1008 8-)
    Wieso? Definiere eine abstrakte Klasse Mapping, die Mappings als Parameter annimmt:

    VB.NET-Quellcode

    1. Public MustInherit Class Mapping
    2. Public MustOverride Function Apply(parameters() As Mapping) As Expression
    3. Public Overridable Function Create(indices() As Mapping) As Mapping
    4. Throw New NotSupportedException()
    5. End Function
    6. Public Overridable ReadOnly Property IndexCount As Integer
    7. Get
    8. Return 0
    9. End Get
    10. End Property
    11. '...
    12. Public MustOverride Function Differentiate() As Mapping
    13. Public Mustoverride Function Integrate(constant As ConstantExpression) As Mapping
    14. End Class
    15. Public MustInherit Class Expression
    16. Inherits Mapping
    17. End Class


    Folglich ist g(x)^f(x) also eine Klasse, die von Mapping erbt und den ^-Operator über zwei im Konstruktor übergebenen Abbildungen definiert. Außerdem werden sonstige Regeln umgesetzt.
    (f(x) ^ g(x))' = (e^(ln f(x) * g(x)))' = f(x) ^ g(x) * (ln(f(x)) * g'(x) + f'(x) * g(x) / f(x))
    z.B., wenn ich mich gerade nicht verrechnet hab'. So wäre für
    x^5 z.B. die Ableitung eben (5^x)' = (e^(ln x * 5))' = x^5 * (ln x * 0 + 1 * 5 / x) = 5x^5/x = 5x^4

    Edit: nat. brauchst du dafür eine Klasse für die Log-Abbildung, also log_(b(x)) (a(x)) Da funktioniert das analog, wie oben. log_b(x) (a(x)) = ln a(x) / ln b(x), somit bildest du einfach die Ableitungen der jeweiligen Funktionen über die Produktregel oder Quotientenregel (die sich aus der Produktregel ergibt):
    (ln a(x) * (ln b(x))^-1)' = a'(x) / (ln (b(x)) * a(x)) - ln a(x) * (ln b(x))^-2 * b'(x) / b(x)
    und du hast natürlich noch eine Klasse ConstantExpression, die Werte vom Typ Double enthält. Deren Ableitung ist natürlich 0.

    Edit 2.5: Mapping ist nat. die Basisklasse, nicht Expression. Expression musst du entsprechend noch ergänzen oder rein auf Mapping arbeiten.

    Gruß
    ~blaze~

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „~blaze~“ ()

    An das verstehen der Klasse die du mir erklärt hast mach ich mal morgen früh.

    (5^x)' = (e^(ln x * 5))' = x^5 * (ln x * 0 + 1 * 5 / x) = 5x^5/x = 5x^4


    An dieser Stelle passt etwas nicht oder?:
    x^5 * (ln x * 0 + 1 * 5 / x) = 5x^5/x = 5x^4

    fehlt da nicht eine Klammer denn (ln x * 0 + 1 * 5 / x)
    der ln aus x*0 ist immer 0 => fällt folglich weg
    => 6/x (denn 1*5/x ist 6/x)

    aber x^5*6/x ist nicht 5x^5/x oder?

    So würde es passen: x^5 * ((ln x * 0 + 1 * 5) / x) = 5x^5/x = 5x^4


    Sorry passt doch :wacko: . Aber warum verwendest du diesen Teil ln x * 0 denn der Logarythmus egal zu welcher Basis ist immer 0, oder?

    8-) faxe1008 8-)
    ln x * 0 = (ln x) * 0. ln 0 wäre nicht definiert. 1 * 5 ist 5, somit ist auch 1* 5/x = 5/x. ;)
    Das war ein Anwendungsbeispiel, das zeigen soll, wie die Funktion letztendlich arbeitet, da du es ja auf zwei beliebigen Mapping-Instanzen definierst - Base und Exponent sind die beiden Mappings, die du auf ihrer abstrakten Definition ableitest und ineinander einsetzt.

    Gruß
    ~blaze~
    Ja, klar. Wenn du es weiter vereinfachst. Du arbeitest aber auf abstrakten Klassen, da kannst du nicht wissen, ob eine 0 rauskommt, da es ja nicht x^5 sein muss, sondern auch x^5x sein kann oder (sin x * cos x * e^-x^2)^(tan x / ln (sin (e^x))), um mal ein möglichst sinnloses Beispiel zu nennen.
    Hab's oben noch paar mal angepasst, btw.

    Gruß
    ~blaze~
    @faxe1008:: 3-reihige Matrizen z.B. zur Beschreibung von Rotationen im Raum.
    n-Dinensionale Optimierung zur Beschreibung von Punktwolken durch (relativ) einfache Gleichungen.
    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!
    Schau ich mir heute mal an :). @LaMiy: Ich habe mich nun näher mit Integralrechnung beschäftigt und ich werde die Annährungsmethode über Rechtecke ausprobieren :thumbup:

    EDIT:// @ErfinderDesRades: Was genau muss ich importieren um mit Tokens zu arbeiten? Ich bekomme nur den Fehler: Der Typ Token wurde nicht deklariert.

    Sehe gerade dass das eine extra Klasse ist.

    EDIT:// @Artentus: Habe als ich festgestellt habe, dass das rumgeschmiere mit RegEx nicht zielführend ist, mir deinen Parser genauer angesehen(GitHub). Könntest du (ich weiß dass es sehr viel Arbeit ist) das kommentieren mit Erläuterungen?

    8-) faxe1008 8-)

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „faxe1008“ ()

    Warum sollte RegEx nicht Zielführend sein? Ich habs ja auch benutzt, es eignet sich hervorragend, um den Eingabestring in Tokens zu zerlegen.

    Naja, wie dem auch sei, ich setzt mich nachher mal dran und kommentiere alles. Wissen in C# setze ich aber voraus, ich erkläre nur die Funktion des Codes.
    Danke :thumbup: .

    Was ich mit "RegEx ist nicht Zielführend" gemeint habe war z.B.:
    expression = RegEx.Replace(expression,"(.[0-9]*)\*(.[0-9]*)", (CInt("$1") * CInt("$2")).ToString)

    Ich weiß mittlerweile auch dass das Schwachsinn ist und nicht funktionieren kann :D

    8-) faxe1008 8-)