Du bist nicht eingeloggt.

Login

Pass

Registrieren

Community
Szene & News
Locations
Impressum

Forum / Bits und Bytes

Mathematischer Parser

Protagonist - 30
Champion (offline)

Dabei seit 05.2010
2451 Beiträge
Geschrieben am: 22.01.2012 um 17:40 Uhr
Zuletzt editiert am: 22.01.2012 um 17:40 Uhr

Hi,
ich will eine App schreiben, mit der man das Integral berechnen kann.
Wie hier zu sehen ist, geht das mit einfachen Funktionen nach dem Prinzip a*x^b ganz gut.
Jetzt will ich das ganze aber noch erweitern, indem der User in einem einzigen Textfeld eine Funktion eingeben kann, von der dann (im gewünschten Intervall) das Integral berechnet wird.
Die Empfehlung eines Users war ein mathematischer Parser wie dieser hier.
Das wäre schon mal ein Anfang, aber ich will die Gleichung ja nicht lösen, sondern mit Variablen weiterrechnen, was dieser nicht kann.

Hätte jemand einen Tipp für mich?

P.S.: Die Sprache ist VB.NET.
s1m0n - 33
Experte (offline)

Dabei seit 11.2007
1294 Beiträge

Geschrieben am: 22.01.2012 um 17:43 Uhr

Wolframalpha App :P

http://www.sysprofile.de/id54604

Protagonist - 30
Champion (offline)

Dabei seit 05.2010
2451 Beiträge
Geschrieben am: 22.01.2012 um 17:57 Uhr

Zitat von s1m0n:

Wolframalpha App :P

Ich weiß dass es diverse andere Programme können, nur würde ich das gerne auch mal als Übung machen.
piepmax - 37
Profi (offline)

Dabei seit 04.2006
794 Beiträge
Geschrieben am: 24.01.2012 um 14:54 Uhr

Zitat von Protagonist:

Zitat von s1m0n:

Wolframalpha App :P

Ich weiß dass es diverse andere Programme können, nur würde ich das gerne auch mal als Übung machen.

Es gibt die Möglichkeit Code direkt aus der Anwendung heraus zu kompilieren. Damit wäre es möglich.
Wäre aber mit Kanonen auf Spatzen geschossen.

Die Feder ist mächtiger als das Schwert - Die Ignoranz gefährlicher als das Messer.

EE_Toddi_EE - 28
Halbprofi (offline)

Dabei seit 01.2010
101 Beiträge
Geschrieben am: 24.01.2012 um 15:07 Uhr

schreib lieber ne app die die lösungen von jedem mathe buch hat
the_pen
Profi (offline)

Dabei seit 05.2009
665 Beiträge

Geschrieben am: 24.01.2012 um 15:13 Uhr

Zitat von EE_Toddi_EE:

schreib lieber ne app die die lösungen von jedem mathe buch hat

Und wo soll er die lösungen herbekommen ??

\_/ This is my cup of care. Oh look, it's EMPTY!

Protagonist - 30
Champion (offline)

Dabei seit 05.2010
2451 Beiträge
Geschrieben am: 24.01.2012 um 16:44 Uhr

Zitat von the_pen:

Zitat von EE_Toddi_EE:

schreib lieber ne app die die lösungen von jedem mathe buch hat

Und wo soll er die lösungen herbekommen ??

Beziehungsweise warum sollte ich mir die Mühe machen?
Das ist sowieso illegal, also würde das heißen, dass ich mich für eine Abmahnung bemühe.
bredator - 41
Champion (offline)

Dabei seit 03.2008
5319 Beiträge

Geschrieben am: 24.01.2012 um 16:58 Uhr

Zitat von Protagonist:

Zitat von the_pen:

Zitat von EE_Toddi_EE:

schreib lieber ne app die die lösungen von jedem mathe buch hat

Und wo soll er die lösungen herbekommen ??

Beziehungsweise warum sollte ich mir die Mühe machen?
Das ist sowieso illegal, also würde das heißen, dass ich mich für eine Abmahnung bemühe.


Na ja, so schwachsinnig der Vorschlag auch ist, illegal wäre es nicht.

Lache nicht über jemanden, der einen Schritt zurück macht. Er könnte Anlauf nehmen.

Protagonist - 30
Champion (offline)

Dabei seit 05.2010
2451 Beiträge
Geschrieben am: 24.01.2012 um 17:13 Uhr

Hab mal irgendwo gelesen dass es illegal sein soll.
Aber auch wenn's legal wäre würde ich mir wohl kaum die Mühe machen ^^
bredator - 41
Champion (offline)

Dabei seit 03.2008
5319 Beiträge

Geschrieben am: 26.01.2012 um 12:06 Uhr

Schau dir mal die Seite hier an:

MyCSharp

Ist zwar in C#, aber ein Umwandeln in VB.NET ist ja recht einfach.

Lache nicht über jemanden, der einen Schritt zurück macht. Er könnte Anlauf nehmen.

Protagonist - 30
Champion (offline)

Dabei seit 05.2010
2451 Beiträge
Geschrieben am: 26.01.2012 um 13:46 Uhr

Aha ich hätte hier einen Code gefunden:

Zitat:

double simpsonFormel(double l, double r, long int d, double (*f)(double x))
{
if (l == r) return(0.0);
else if (l > r) {
//linke > rechte Grenze --> vertauschen
double swap = l;
l = r;
r = swap;
}
if (d < 4) d = 4;
if (fmod(d,2) > 0) d++; //gerade anzahl an stüzstellen schaffen
double delta = ((r - l) / (double)d); //deltaX = (rechte Grenze - linke Grenze) geteilt durch Schrittzahl
double A = 0.0;
double x = l + delta; //x = linke grenze + schritt (x1)
//gerade Summen : Summe 3 = 4*(y2 + y4 + ... + y(2n-2))
for(int i = 2; i < ((2*d)-2); i += 2) {
A += f(x);
x += delta; //x 1 schritt weiter setzen
}
A *= 2.0;
x = l + (0.5 * delta); //x = linke grenze + schritt (x1)
//ungerade Summen : Summe 2 = 2*(y1 + y3 + ... + y(2n-1))
for(int i = 1; i < ((2*d)-1); i += 2) {
A += f(x);
x += delta; //x 1 schritt weiter setzen
}
A *= 2.0;
A += f(l) + f(r); //Summe 1 = y0 + y(2n)
A *= (0.5 * delta / 3); //Fläche = (Summe 1 + Summe 2 + Summe 3) * h / 3 (h = delta/2)
return(A);
}

l = linke Grenze
r = rechte Grenze
d = Anzahl der Schritte
f = Funktion f(x) deren Integral berechnet werden soll
Als Funktion muss man dann eine eigene Funktion definieren, die Funktionswerte zurückgeben kann z.B. :
double f(double x)
{
return(sqrt(1.0 + (2.0*x*x*x*x)));
}

Wenn man das Integral beliebiger Funktionen errechnen will, muss man die Eingaben des Benutzers auswerten. Der gibt eine Funktion an, die dann anstatt "f" benutzt wird...


Ich muss mal schauen ob ich's mit dem hinkriege, ich werde dann hier meine Ergebnisse posten ^^
Rifleman - 40
Experte (offline)

Dabei seit 09.2003
1540 Beiträge
Geschrieben am: 26.01.2012 um 14:03 Uhr
Zuletzt editiert am: 26.01.2012 um 14:30 Uhr

Zitat von Protagonist:

Ich muss mal schauen ob ich's mit dem hinkriege, ich werde dann hier meine Ergebnisse posten ^^

Wie wärs damit:
Ein Parser mit Vorkompilierung (Auswertung sollte effizient sein). Siehe dazu Bredators Link.
Dann: Gauß-Quadratur n-ter Ordnung...
Wäre glaube ich eine gute Übung, und gleichzeitig kannst du dir etwas Numerik anschauen...
/edit:
Alternativ, aber etwas anspruchsvoller, falls dir Gauß zu einfach ist oder du eine Fehlerkontrolle willst: Romberg-Verfahren...

Es sind die kleinen Dinge, die einen zum Wahnsinn treiben.

Protagonist - 30
Champion (offline)

Dabei seit 05.2010
2451 Beiträge
Geschrieben am: 26.01.2012 um 14:43 Uhr

Naja zu einfach kann man eig. nicht sagen, in der Schule haben wir vor ca. 2 Wochen mit der Integralberechnung angefangen <.<
Rifleman - 40
Experte (offline)

Dabei seit 09.2003
1540 Beiträge
Geschrieben am: 26.01.2012 um 14:58 Uhr

Zitat von Protagonist:

Naja zu einfach kann man eig. nicht sagen, in der Schule haben wir vor ca. 2 Wochen mit der Integralberechnung angefangen <.<

Macht ja nichts. Dann schaust dir eben erst die Gauß-Quadratur an. Vielleicht verstehst du dann nicht genau, warum das genau so gemacht wird und was mathematisch dahinter steckt (versuchen kann mans allemal...), aber implementieren sollte kein Problem sein ;-)

Es sind die kleinen Dinge, die einen zum Wahnsinn treiben.

Protagonist - 30
Champion (offline)

Dabei seit 05.2010
2451 Beiträge
Geschrieben am: 27.01.2012 um 18:46 Uhr
Zuletzt editiert am: 27.01.2012 um 19:11 Uhr

Also ich habe mir die Gauß-Quadratur angeschaut, aber verstehen tu ich sie nicht ganz, ich frage mich auch wie ich die implementieren sollte.
Mein Hauptproblem ist ja eigentlich das Analysieren der Funktion (und das aufteilen in Teile, je nach Priorität der Operatoren.
Gibt's da nicht irgendwie einen schon geschriebenen Code für?
Alle Parser die ich bis jetzt gefunden habe lösen nur Gleichungen bzw. können z.B. sin etc. berechnen, aber zum Integrieren finde ich nichts.

Edit: Ich habe gerade eine Library namens ALGLIB gefunden, die das Integral u.a. mit der Gauss-Quadratur berechnen kann, womit für mich die Analyse wegfallen würde.
Nur komm ich grad nicht drauf wie ich die eingegebene Funktion an die Function übergeben kann, bzw. welche ich nehmen sollte.
  [Antwort schreiben]

Forum / Bits und Bytes

(c) 1999 - 2025 team-ulm.de - all rights reserved - hosted by ibTEC Team-Ulm

- Presse - Blog - Historie - Partner - Nutzungsbedingungen - Datenschutzerklärung - Jugendschutz -