Lösung einer quadratischen Gleichung mit enthaltener Sinusfunktion

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
sebbog
User
Beiträge: 4
Registriert: Dienstag 30. August 2022, 13:00

Hallo liebes Forum,

mein Name ist Sebastian, ich bin 33 Jahre alt, neu hier im Forum und beschäftige mich derzeit mit der vereinfachten Modellierung einer technischen Anlage. Als Wirtschaftsingenieur zählt das Programmieren mit Python zwar nicht zu meinen Schwerpunktthemen, ich konnte mich allerdings bislang ganz gut einarbeiten und weiß die Vorzüge des Rechnens mit Python mehr und mehr zu schätzen :)

Bei folgender Problematik komme ich derzeit nicht alleine weiter und hoffe, dass meine Frage hier richtig platziert ist und ihr mir als Community vielleicht einen Tipp geben könnt. Es soll nachfolgende quadratische Gleichung nach x aufgelöst werden, wobei die Variablen F_0 und R_i bekannt sind (beispielsweise F_0 = 0,000013 und R_i = 0,15):

F_0 = ((R_i**2 / 2) + (2*x - np.sin(2*x))) / ((np.pi * R_i**2) - ((R_i**2 / 2) + (2*x - np.sin(2*x))))

Der zu berechnende Wert von x entspricht einem Winkel, der dann als Ergbnis in [rad] ausgegeben werden soll.

Ich habe dazu folgenden Code geschrieben, der offenbar noch nicht vollständig korrekt ist:

Code: Alles auswählen

### Datenbank Import ###

import numpy as np
from sympy import *
import math

x, F_0, R_i = symbols("x F_0 R_i")


### Eingabe Daten ###

R_i = 0.15   # Bekannte Variable, Einheit: m
F_0 = 0.000013   # Bekannte Variable, Einheit: %


### Definition der zu lösenden Gleichung ###

solution = solve(F_0 = ((R_i**2 / 2) + (2*x - np.sin(2*x))) / ((np.pi * R_i**2) - ((R_i**2 / 2) + (2*x - np.sin(2*x)))), x)  # x entspricht dem gesuchten Winkel, der als Ergebnis in [rad] ausgegeben werden soll.


### Ergebnisausgabe ###

print("Der gesuchte Winkel beträgt: ", solution)
Könnt ihr, liebe Community, mir an dieser Stelle eventuell weiterhelfen und Tipps zur Richtigstellung des Codes geben?
Auch beim mehrmaligen Lesen komme ich leider von alleine nicht auf den/ die Fehler :(

Vielen herzlichen Dank vorab & beste Grüße,
Sebastian
Sirius3
User
Beiträge: 17757
Registriert: Sonntag 21. Oktober 2012, 17:20

Wenn Du eine Fehlermeldung erhältst, wäre es sinnvoll, diese hier kompletten zu posten, damit wir nicht erst anfangen müssen, den Fehler zu suchen.
*-Importe sind schlecht, weil sie unkontrolliert sehr viele Namen importieren. Bei Sympy sind das fast tausend, und etliche mit so allgemeinen Namen, dass sie leicht auch anderweitig verwendet werden könnten.

Funktionen, in denen sin(x) und x vorkommen, lassen sich oft nicht analytisch lösen. so dass Du mit sympy nicht sehr weit kommst. Du setzt auch sehr früh Fließkommazahlen ein, was beim symbolischen Lösen nicht üblich ist.

Du mußt die Lösung numerisch finden:

Code: Alles auswählen

R_i = 0.15   # Bekannte Variable, Einheit: m
F_0 = 0.000013   # Bekannte Variable, Einheit: %
func = lambda x:((R_i**2 / 2) + (2*x - np.sin(2*x))) / ((np.pi * R_i**2) - ((R_i**2 / 2) + (2*x - np.sin(2*x))))
x = scipy.optimize.fmin(lambda x: (func(x) - F_0)**2, x0=0, ftol=1e-24)[0]
Benutzeravatar
__blackjack__
User
Beiträge: 13121
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@sebbog: Der Fehler, der ausgegeben wird ist:

Code: Alles auswählen

$ python3.6 test2.py
  File "test2.py", line 18
    solution = solve(F_0 = ((R_i**2 / 2) + (2*x - np.sin(2*x))) / ((np.pi * R_i**2) - ((R_i**2 / 2) + (2*x - np.sin(2*x)))), x)  # x entspricht dem gesuchten Winkel, der als Ergebnis in [rad] ausgegeben werden soll.
                                                                                                                            ^
SyntaxError: positional argument follows keyword argument
Das erste Argument was Du da übergibst ist ein Schlüsselwort-Argument (``F_0 = ...``) und danach folgt ein Positionsargument (``x``). Das ist nicht erlaubt. Das erste bedeutet nicht was Du denkst was es bedeutet. `solve()` kennt kein Argument mit dem Namen `F_0`. `sympy` kann nicht mal eben so die Bedeutung von ``=`` in Python ändern, das hat in Python die Bedeutung von Zuweisung eines Wertes beziehungsweise in Aufrufern gibt man damit Name und Wert von Schlüsselwortargumenten an. Siehe beispielsweise die Abschnitte zu Funktionen im Tutorial in der Python-Dokumentation.

Und wie man eine Gleichung als symbolisches Objekt definiert (weil ``=`` nicht geht) sollte man in der Sympy-Dokumentation nachlesen können.

Und danach wirst Du dann Probleme mit den Funktionen/Werten aus dem Numpy-Modul bekommen. Sympy's `sin()`-”Funktion” rechnet ja nicht den Sinus aus, sondern steht als symbolisches Objekt für die Sinus-Funktion, damit Sympy auf Ausdrücken die Rechnungen repräsentieren, symbolische Operationen wie umstellen nach einer Variablen ausführen kann.

Was auch nicht wirklich Sinn macht, ist `F_0` und `R_i` erst als Symbole zu definieren, um sie dann gleich danach an konkrete GLeitkommawerte zu binden. Ich würde erst die symbolischen Operationen durchführen und danach erst konkrete Zahlen einsetzen, sonst schleppt man die Ungenauigkeit der Gleitkommawerte durch die Umformung und erhält eventuell andere Werte als erwartet.

Und wenn das alles richtig ist, könnte es sein, dass Sympy die Gleichung nicht nach `x` auflösen kann.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
sebbog
User
Beiträge: 4
Registriert: Dienstag 30. August 2022, 13:00

Hallo @Sirius3 und @__blackjack__,

vielen Dank für eure schnellen Antworten, das hat mir schon einmal sehr weitergeholfen.
Um die generelle Vorgehensweise komplett zu verstehen, habe ich nochmal ein einfacheres Beispiel gewählt:

Code: Alles auswählen

### Import Datenbanken ###

import numpy as np
from scipy.optimize import fsolve
import math

### Eingabe Basisdaten ###

R_i = 0.15 # Innenradius Drehrohr, Einheit: m
ε = 0.2 # Füllwinkel Epsilon am Austrag, Einheit: rad

### Gleichung & Lösung ###

def f(x):
    h0 = x
    f = np.arccos(1-(h0/R_i)-ε
    return f
                  
x = fsolve(f, (0.1))

print(x)
In diesem Falle wird mir noch folgender Fehler angezeigt:

Code: Alles auswählen

 return f
    ^
SyntaxError: invalid syntax
Könntet ihr mir hier nochmal auf die Sprünge helfen?
Ich denke, dass ich das Vorgehen dann Schritt für Schritt nachvollziehen kann :roll:

Vielen Dank & beste Grüße,
Sebastian
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Zaehl mal die Klammern in deiner Zeile davor...
sebbog
User
Beiträge: 4
Registriert: Dienstag 30. August 2022, 13:00

SORRY & Danke vielmals - Flüchtigkeitsfehler. Klammer ist gesetzt:

Code: Alles auswählen

### Import Datenbanken ###

import numpy as np
from scipy.optimize import fsolve
import math

### Eingabe Basisdaten ###

R_i = 0.15 # Innenradius Drehrohr, Einheit: m
ε = 0.1 # Füllwinkel Epsilon am Austrag, Einheit: rad

### Gleichung & Lösung ###

def f(x):
    h0 = x
    f = np.arccos(1-(h0/R_i))-ε
    return f
                  
x = fsolve(f, (0.01))

print(x)
Allerdings wird mir nun nur mein Guess-Wert [0,01] ausgegeben, gefolgt von diesem Hinweis:

Code: Alles auswählen

/tmp/ipykernel_2313318/4218073956.py:16: RuntimeWarning: invalid value encountered in arccos
  f = np.arccos(1-(h0/R_i))-ε
Übersehe ich noch etwas?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Mal ganz was wildes tun, und den Wert ausgeben, der da ungueltig ist? Vielleicht sieht man das dann. Der Klassiker waere ja etwas ausserhalb [-1,1].
Antworten