Jump to content

Gleichungen lösen unter C#

Empfohlene Beiträge

Hi Leute...

Da ich mit hilfe von euch das letzte Problem mit den Strings lösen konnte, habe ich schon ein weiteres und hoffe ihr könnt mir hierbei genau so gut helfen.

Möchte ein kleines Programm in C# schreiben, welches lienare Gleichungen oder ggf auch Gleichungssysteme lösen kann. Hat vielleicht schon jemand Erfahrung damit gemacht?

Wie soll ich am besten das "Problem" anpacken?

Ich danke euch jetzt schon wieder für die Interessanten Tipps und Hilfen!

Gruss Roger

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
Möchte ein kleines Programm in C# schreiben

also ich kann dir jetzt schon sagen, klein wird es nicht.

also mein tipp, aber das weißt du mit sicherheit, in einer gleichung rechnet man immer mit dem gegenteil. als beispiel nehmen wir ma diese kleine:

x²-4=0 da würde man ja erst -4 zu +4 ändern also gegenteil, dannach würde man aus x² die wurzel ziehen. du müsstest die also erstma was ausdenken, dass alles ins gegenteil ändert.

bei solchen gleichungen is das ja noch leicht zu proggen, wenn man die ganzen if anweisungen fertig hat, aber es gibt ja auch "brutalere" gleichungen.

btw:

sowas hab ich auch schon mal versucht, aber hab aufgegeben. dann habe ich ne ganze weile pause gemacht und das wars. ich wusste garnicht mehr wie ich es weitermachen sollte. ich wusste nicht mal wirklich was ich da geschrieben hatte. die pause war anscheinend zu lang ^^"

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Vom Primzip her nicht schwer, es geht z.B. mit Gauss. Das kann man noch beschleunigen, z.B. durch LR-Zerlegung. Es gibt aber auch approximative Lösungsverfahren.

Eine Beschreibung vom Gauss-Verfahren (unter Gauss-Verfahren zum Lösen linearer Gleichungssysteme) findest Du sicher selbst in einem Mathebuch, weiteres kannst Du mich gerne fragen, wenn es Dich interessiert.

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

was willst du den für gleichungssystem lösen? mal ein beispiel bitte.-

willst du gleichungssysteme 2. grades lösen wird das kein problem sein.

aber sobald du höhere Systeme hast wirst du probleme bekommen und solltest zuerst einmal die systeme zu fuß lösen können

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

solange es nicht irgend welche limes +- unendliche Werte sind würde ich die Rechenfähigkeiten der CPUs nutzen, also try and failure ;)

dieses gepaart mit hardcodierten Ableitungsregeln für Standardsachen um Rechenzeit einzusparen -> voila :D

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Guten Morgen allerseits...

Das hagelg ja richtig von Tipps. Zuerst mal zu baba007:

solange es nicht irgend welche limes +- unendliche Werte sind würde ich die Rechenfähigkeiten der CPUs nutzen, also try and failure

Das habe ich ehrlichgesagt auch schon versucht, nur ist das Problem da, der Benutzer kann eine Gleichung via GUI eingeben, sommit ist die Gleichung zuerst mal ein String. Ich weiss nicht wie ich diese "einfach" in einen double wandlen kann (habe ich auch schon versucht und zur laufzeit gab es mir immer einen Fehler bei den Konvertierung der Opperationszeichen (fast logisch ;) )) dess halb habe ich diese Variante mal zur Seite gelegt.

Zu imatt:

was willst du den für gleichungssystem lösen?

in erster Linie mal ersten Grades, wenn es Zeitlich mir möglich ist auch noch zweiten Grades, höher momentan nicht. Zu Fuss, wie du das nennst, ist kein Problem, nur ist das mit dem Coden bisschen anders ;)

und noch zu Bubble:

Ja das Gauss-Verfahren ist mir auch noch irendwie geläufig, hatte ich auchmal in der Schule, schaue jetzt mal was ihr für weitere Tipps geben könnt und dann wird ich mich wohl oder übel mit einer diesen Varianten auseinandersetzen :confused:

Danke für die Anregungnen

Gruss Roger

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Naja da es dir ja anscheind nur um eine Übungsaufgabe geht könntest du die Gleichung vorgeben und den Benutzer nur die Werte eingeben lassen:

Also so das am Bildschirm meinetwegen _ X _ _Y = _ steht

so das der benutzer dann z.B. 3 + 2 5 eingegebn würde und daraus dann 3x + 2y = 5 wird.

Ansonsten wenn du den Benutzer direkt "3x + 2y = 5" eingeben lässt müsstest du ersteinmal einen Parser basteln der das Ganze in seine einzelteile zerlegt und erkennt. Das dürfte das schwierigste an dem Thema sein...

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

ich würde bestimmte formeln vorgeben, wie mein vorredner schon gesagt hat. die wählt man aus und setzt die variablen werte ein und drückt auf feuer !

ansonsten stinkt es nach regulären Ausdrücken ;) und dieses mit () [] Brüchen, GANZ ÜBEL ! :eek

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Eigentlich will ich schon dass der Benutzer ein Gleichung mit einer Variable eingeben kann z.B

"3*x+2=5-x". einen kleine Parser habe ich bereits erstellt. Es ist damit möglich z.B. "3+4-2*5" einzugeben und das wird dann auch ausgerechnet, das Problem wo ich bei diesem Parser noch habe ist, dass er die Regel Punkt vor Strich noch nicht berücksichtigt...

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
Eigentlich will ich schon dass der Benutzer ein Gleichung mit einer Variable eingeben kann z.B

"3*x+2=5-x".

Wenn du schon einen Parser hast, dann solltest du als nächstes einen Algorithmus zum Auflösen nach x formulieren. Vielleicht solltest du dich dabei zunächst auf Ausdrücke beschränken, in denen nur ein x auftaucht, damit du nur mit linearen Gleichungen zu tun hast. Sonst könnte dir auch die eine oder andere quadratische begegnen.

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

zum jetzigen zeitpunt habe ich den parser noch nicht soweit das er auch variablen erkennt. erst zahlen und opperationszeichen (+,-,*,/)

funktionsweise des Parser:

....

switch (expression[i])

                    {

                        case '(':

                            numBrackets++;

                            break;

                        case ')':

                            numBrackets--;

                            break;


                        case '+':

                            if (numBrackets == 0 && type == OperationType.None)

                            {

                                type = OperationType.Addition;

                                operationSignPos = i;

                            }

                            break;

                            ....
beim durchgehen der eingabe wird das erste opperationszeichen in "operationSignPos" gespeichert.

String firstOperand = expression.Substring(0, operationSignPos);

String secondOperand = expression.Substring(operationSignPos + 1, expression.Length - operationSignPos - 1);


                    _op1 = new Operation(firstOperand);

                    _op2 = new Operation(secondOperand);

da teile ich den string in 2 teile... und genau da ist der fehler auch begrabe. es wird einfach das erste opperationszeichen genommen.

bsp. eingabe: "3*3+5" ergiebt richtig 14

bei meinem parser teilt er den string in firstOpernad = "3"

und secondOperand = "3+5"

mit diesen beiden operanden geht er den Parser wieder durch bis effektiv eine zahl übrig bleibt. Bei firstOperand ist das bereits der fall, somit wird die 5 als double mal gespeichert...

wenn der parser den secondOperand "2+5" durch geht, erkennt er eine Addition und speichert das ergebnis (7) auch als double.

erst jetzt macht er die eigentliche multiplikation, aber eben jetzt mit firstOperand (5) * secondOperand (7) und das gibt 35.

kann mir da jemand helfen wie ich punkt vor strich operationen richtig handlen kann?

besten dank

Roger

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Erfasse das LGS doch am besten gleich in Matrix-Notation. Dann kannst Du es gleich mit Gauss lösen. Die paar kleinen Umformungen, um eine Gleichung in die nötige Form zu bringen, kann man eh problemlos von Hand machen.

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Juhui

habe das Parser problem mit dem Punkt vor Strich jetzt gelösst.

Mit den Gleichungen habe ich das jetzt mal mit "Schablone" a la Guybrush Threepwood:

Also so das am Bildschirm meinetwegen _ X _ _Y = _ steht

so das der benutzer dann z.B. 3 + 2 5 eingegebn würde und daraus dann 3x + 2y = 5 wird.

Falls jemand interesse hat und wissen will, wie man diese Probleme die ich jetzt hatte, lösen kann, soll sich bei mir melden...

Gruss und nochmals danke an alle die mir weitergeholfen haben!:)

Roger

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

hmm da bin ich wieder mit dem alten Problem

wie zuvor geschrieben habe ich das mit den Gleichungen mal mit einer "Schablone" gelösst.

Nun will ich es trotz dem Schwirigkeitsgrad anderst versuchen sodass man z.B. "2*x*2 = 4*x-3" eingeben kann und das ausgerechnet wird.

bin wieder auf Unterstützung angewiesen.

Gruss Roger

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
Ihr könnt mir helfen indem ihr mir lösungansätze geben könnt oder sonnst allgemein tipps wie ich die gleichung sortieren kann

Was meinst Du mit "sortieren"? Wenn Du einen Term (z.B. "2+4*3") ausrechnen möchtest, würde es Dir helfen aus dem String erst einmal einen Baum aufzubauen.

Wenn Du immer noch lineare Gleichungssysteme lösen möchtest, dann solltest Du sie wirklich in Matrixform eingeben - das erspart Dir viel unnötige Mühe.

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

ich hab ja schonmal einen link dazu gepostet

ansonsten kann ich bubble rechtgeben

du wirst die was überlegen müssen - was sich sowas wohl noch niemand im board überlegt hat

die idee mit dem baum ist nicht schlecht, dazu gibt es natürlich noch kein fertiges objekt, außer vllt. den treeview...

bau dir doch mal ne klasse wo dir einen string in deinen baum zerlegt und dann im treeview einträgt - zur visualisierung

du kannst die sache ja per javascript machen (ok, gibts kein so schönen treeview) und dann einen link posten...

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

das lösen von Mathematischen Rechnungen wie "2+4*3" ist kein problem, diesen Parser habe ich bereits implementiert.

jetzt geht es um z.b "2*x-3 = 5+x" und es wäre nicht so schwirig das zu lösen wenn ich es so in fertigen Matizen eingeben würde.

Nur möchte ich eben eine "grössere" herausforderung, eben mit direktem lösen von gleichungen

Gruss

Roger

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
das lösen von Mathematischen Rechnungen wie "2+4*3" ist kein problem, diesen Parser habe ich bereits implementiert.

jetzt geht es um z.b "2*x-3 = 5+x" und es wäre nicht so schwirig das zu lösen wenn ich es so in fertigen Matizen eingeben würde.

Nur möchte ich eben eine "grössere" herausforderung, eben mit direktem lösen von gleichungen

Hier ein Vorschlag für lineare Gleichungen in der speziellen Form

(Zahl_1*Unbekannte_1) + ... + (Zahl_1*Unbekannte_i) + (Zahl_2*Unbekannte_1) + ... + (Zahl_2*Unbekannte_i) + ... + (Zahl_j*Unbekannte_i) + Weitere_Zahlen_ohne_Variable = ... + (Zahl_k*Unbekannte_i) + Weitere_Zahlen_ohne_Variable

i geht von 1 bis N.

Und für j und k: 1..j..k..M (wobei, wenn es ein k gibt, j<k sein muss.)

Zahl_1 bis Zahl_N dürfen hierbei nicht von einer der Unbekannten abhängen.

Bestimme zuerst die Menge aller auftretenden Unbekannten. Wenn Du kein Gleichungssystem, sondern nur eine Gleichung hast, dann hast Du nur eine Unbekannte (N=1). Summiere die Vorfaktoren (Zahl_) für alle gleichen Unbekannten auf und ziehe dabei die rechte Seite von der linken Seite ab (=einfach weiter summieren, aber auf der rechten Seite einfach die Vorzeichen tauschen). Das gleiche machst Du für alle Zahlen ohne Unbekannte. Nun hast Du ein System der Form

(Zahl_1*Unbekannte_1) + (Zahl_2*Unbekannte_2) + ... + Weitere_Zahlen_ohne_Variable = 0,

welches Du lösen kannst.

So kannst Du bestimmte Gleichungen zusammenfassen. Weitere Erweiterungen würden mit der eben beschriebenen Vorgehensweise aber deutlich schwieriger werden. Beispiele:

(2x*3+4x)*3 = 7

Hier müsstest Du zuerst die Klammer ausrechnen und auflösen, um 18x+12x=7 zu erhalten, was auf x=7/30 führt.

(2x+3)*(3x+4)-6x*x=0

Trotz x*x ist das System linear, denn der quadartische Term fällt weg. Könntest Du behandeln, indem du x*x substituierst.

cos(x)=1

Hier müsstest Du den arccos bilden und Du erhälst x=0.

Aber folgende Gleichung ist schon schwieriger unzuformen:

(cos(x)*cos(x)+sin(x)*sin(x))*x=1

Das ist eine lineare Gleichung mit der Lösung x=1.

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Nimm an der Diskussion teil

Du kannst jetzt hier posten und Dich später registrieren. Wenn Du bereits über eine Konto verfügst, melde Dich jetzt an, um mit Deinem Konto zu posten.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.


Fachinformatiker.de, 2019 SE Internet Services

fidelogo_small.png

if_icon-6-mail-envelope-closed_314900.pnSchicken Sie uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App


Get it on Google Play

Kontakt

Hier werben?
Oder senden Sie eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...

Wichtige Information

Fachinformatiker.de verwendet Cookies. Mehr dazu in unserer Datenschutzerklärung