Analyse mathematischer Funktionen

  • VB.NET

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

    Analyse mathematischer Funktionen

    Einen schönen Montag-Morgen, liebes vb-Paradise Forum :)

    Eine kleine Frage, wie ich folgendes Problem lösen kann:
    Auf einer Form existiert eine Textbox, in die der Benutzer des Programmes eine mathematische Funktion (Bsp: [f(x)=] 3x^4 + 7x^3 - 2x + 1) eingibt.
    Ich würde gerne wissen, wie man das Programme erkennen lassen kann, was zB der höchste Exponent in der Formel ist.
    Ich denke mal, man müsste zu aller erst nach dem "^" Zeichen im string suchen lassen und dann die Zahl, die sich dahinter befindet abfragen, aber wie mache ich das?
    Gibt es eine Funktion mit der man einen String char für char durchgehen kann und jedes Zeichen einzelnd abfragt?
    (dann könnte man ja nach jeder Zeichen-abfrage ein "if charx = ..." setzen)

    Vielleicht denke ich ja auch zu engstirnig oder so und es gibt eine viel leichtere Lösung :D

    Mfg
    LevelXProject
    Du könntest (einfach) mit IndexOf arbeiten oder aber professioneller, allerdings auch vlt. für dich schwieriger verständlich, mit Regular Expressions. Vorteil von RegEx du bekämst die Exponenten direkt in einem Array und könntest es Sortieren.
    Du solltest bedenken, dass
    x*x*x*x
    (x*x)^2
    x^3 * x
    alles dasselbe ist.
    Das müsstest Du dann auch alles abprüfen.
    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!
    Ich traue den Leuten schon zu dass sie die Formel in Summen-Schreibweise angeben können :D
    Aber stimmt, das müsste ich auch berücksichtigen ;/

    Wie kann ich das Problem denn mit IndexOf lösen? ^^
    Wenn ich dann die Stelle als Integer angegeben bekomme (nullbasiert, so wie ich das gesehen habe), an der das Zeichen steht, dann nützt mir das doch relativ wenig, oder? ^^

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

    Denk mal über einen Formelparser nach.
    (x-1) * (x-2 * (x-3) * (x-4)
    Wenn Du Deinen Leuten sagst, wie sie das eingeben müssen, werden sie garantiert auch andere Schreibweisen ausprobieren.
    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!
    Es geht um strukturierte Formelanalyse, die einem helfen soll - nicht darum, herauszufinden wie man das Programm am besten austricksen kann :P
    Aber ich werde noch schauen wie ich das hinbekommen kann :)

    Ich hab die MidFunktion gefunden, denkt ihr dass die dafür passend ist?

    VB.NET-Quellcode

    1. dim num as char = Mid(quelle as string, position as integer, länge der Abfrage as integer)

    Wenn ich die Länge der Abfrage immer auf "1" setzte, fragt er also nur ein einzelnes Zeichen ab, und keine Zeichenreihenfolge.
    Denkt ihr es wird angenommen, wenn man es als char zu speichern versucht, obwohl die funktion eigentlich als output einen string hat? (Der hier aber eben nur 1 Zeichen lang ist)
    1. Mid() is eine VB6 Funktion und out of Date ... äquivalent ist die Substring()-Methode
    2. Anstatt jedes Zeichen zu durchgehen kannst du wie ich bereits erwähnte die IndexOf()-Methode nutzen, die gibt dir die position des Gesuchten Zeichens zurück
    Aber es geht doch darum dass ich den String in jeden einzelnes Zeichen zerlegen muss, denn schließlich brauch ich ja jeden wert und jedes Zeichen.
    Bringt es mir da irgendwas, wenn ich nach bestimmten Zeichen suche, wenn ich sie eigentlich mit der anderen Funktion sowieso abdecke? ^^
    Nunja im prinzip willst du ja nur Exponenten suchen, wenn also irgendwo in der Formel 1+54-4/43 vorkommt brauchst du das nicht. Also suchst du erstmal nur nach dem Multiplikationsoperator (*) prüfst ob die Zahl davor identisch mit der Zahl danach ist. Ebenso kannst du das Exponentzeichen Suchen und so alles prüfen.

    Ansonsten brauchst du einen String nicht "Zerlegen" denn ein String ist bereits ein Array vom Typ Char. Heißt du könntest auf ein String ohne weiteres wie auf ein Array zugreifen

    VB.NET-Quellcode

    1. Dim s As String = "Hallo"
    2. MsgBox(s(2)) ' würde den Buchstaben l ausgeben


    oder in einer Schleife durchlaufen

    VB.NET-Quellcode

    1. For Each c As Char in "Hallo Welt!"
    2. Next

    LevelXProject schrieb:

    Am Ende soll es eine komplette Funktionsanalyse werden - Extrema, Ableitungen, etc.

    RodFromGermany schrieb:

    Denk mal über einen Formelparser nach.
    Es ist jetzt nicht sinnvoll, klein anzufangen und dann weitere Funktionen zuzulassen, sondern kümmere Dich um das Große und Ganze.
    Ich will nicht Dein Programm austricksen, ich will Dir zeigen, an was alles Du denken musst. Denn wenn Du zur nächsten Stufe wechseln willst, kommt ein Post von Dir, dass Dein Programm das Ausmultiplizieren von Klammerausdrücken falsch macht usw.
    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 für die nütztlichen Hilfen :)

    @RodFromGermany
    Okay - also einen Parser.
    Da gerät man ganz schön ins Schwitzen bei dem Teil... ;/
    Aber stimmt, wenn ich jetzt beschränkt anfangen würde, wäre das wirklich suboptimal.

    @Eistee
    Stimmt... jetzt wo ich mich so ein wenig in dem Thema Funktionsparser umgesehen habe, merke ich echt dass das kein Zuckerschlecken ist (*bodenlose Untertreibung*)
    Ich respektiere echt die Mathematica-Engine von WolframAlpha :)
    Hättest du irgendwelche Tipps für mich, oder Erfahrungen die du gemacht hast? ^^

    Und eine Frage nebenbei - ich wollte kein neues Thema extra nur dafür erstellen.
    Wie kann ich zwei Spalten einer zweidimensionalen Array sortieren, und zwar nur nach einer einzigen Spalte geordnet? Die Methode Sort gibt es in allen Variationen nur für eindimensionale Arrays.
    Könnte ich das Bubblesort-Verfahren anwenden?
    Mein Problem ist, dass ich ein Array mit 2 Spalten, und x Zeilen habe. Kann ich beide Spalten gleichzeitig sortieren, aber so, dass quasi alle Zeilen zusammengehören und das Sortierkriterium nur nach der ersten Spalte gerichtet ist? (Ich hoffe mal, das ist verständlich genug formuliert :D)

    MfG
    LevelXProject

    LevelXProject schrieb:

    Wie kann ich zwei Spalten einer zweidimensionalen Array sortieren, und zwar nur nach einer einzigen Spalte geordnet?
    Probier mal dies:

    VB.NET-Quellcode

    1. Dim a() As Integer = {4, 3, 2, 1}
    2. Dim b() As Double = {1.1, 1, 2, 3}
    3. Array.Sort(a, b)
    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!
    Ich frage lieber nach bevor ich etwas davon nicht verstehe ^^
    Heißt das nun, dass b mit dem array a verlinkt wird, und dann beide nach dem Größer-Kleiner-Kriterium von a geordnet werden?
    (Danach könnte man beide ja theoretisch in einen Array packen.)
    Sieh Dir einfach an, was hinten raus kommt. :D
    a wird sortiert und mit b werden die identischen Operationen ausgeführt, unabhängig vom Inhalt.
    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!
    Okay - klappt super :)
    Vielen lieben Dank.
    So... und jetzt damit weiter am Parser arbeiten :D
    (Ich hoffe mal es ist Ok wenn ich - falls ich Fragen zu Sachen haben sollte, die ich dafür brauche - diese weiteren Fragen hier stelle? ^^)

    LevelXProject schrieb:

    diese weiteren Fragen hier stelle?
    :thumbsup:
    Oder Du machst einen neuen Thread auf und klickst hier auf Erledigt.
    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!
    Dann müsste ich doch nur unnötig viele Threads erstellen ^^

    Jetzt wollte ich kurz einmal nachfragen, wie ich die InvalidCastException behandeln kann.
    ("Das Objekt des Typs "System.Double" kann nicht in Typ "System.Double[]" umgewandelt werden.")
    Ich will einfach nur eine Array erstellen, die die Größe und die Werte der Array übernimmt, auf die ich verweise.

    VB.NET-Quellcode

    1. Hier wird der Fehler angezeigt:
    2. Dim a() As Double = Solver.GiveKoArray() <--
    3. Dim n() As Double = Solver.GivePoArray() <--
    4. ///
    5. Und hier ist der Befehl in der Klasse:
    6. Public Function GiveKoArray()
    7. Return a(s)
    8. End Function
    9. Public Function GivePoArray()
    10. Return n(p)
    11. End Function


    Ich verstehe die Lösungsvorschläge nicht genau. Gibt es da vielleicht etwas, was ich genau falsch gemacht habe oder wo ich etwas verbessern kann?

    (Achja: Und wie heißt es eigentlich? Der, Die oder Das Array? ^^)

    MfG
    LevelXProject
    Probier mal

    VB.NET-Quellcode

    1. Dim a() As Double = DirectCast(Solver.GiveKoArray(), Double())
    Ansonsten über Marshal und IntPtr.
    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!