Datentyperkennung beim Lösen von Gleichungen

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
botil02
User
Beiträge: 4
Registriert: Mittwoch 28. Februar 2018, 18:21

Hallo an alle,
ich möchte Gleichungen lösen.
Dabei möchte ich bei den Ergebnissen zwischen reelen und komplexen Zahlen unterscheiden.

Bei x = 2I ist der type <class 'sympy.core.mul.Mul'> Multiplikative Verknüpfung ??

bei x = I ist der type <class 'sympy.core.numbers.ImaginaryUnit'>

Kann man nicht type(x) == complex fragen?

Ich habe das Problem bis jetzt so gelöst:

#Nullstellen ausgeben

if len(x_0)==0:
print('keine Nullstellen.')
else:
print('Nullstellen')
z=1

for i in x_0:
if type(i)==Mul or i==I :
print(' x'+str(z),' = ',i,' , ist keine reele Lösung')
z+=1
else:
print(' x'+str(z),' = ',i)
z+=1


Geht das auch eleganter ?

Danke für eure Hilfe.
Benutzeravatar
Dennis89
User
Beiträge: 1503
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,
botil02 hat geschrieben: Samstag 14. Dezember 2024, 16:42 Kann man nicht type(x) == complex fragen?
Mir würde `isinstance` einfallen:

Code: Alles auswählen

>>>isinstance(2j, complex)
True
>>>isinstance(2.3, complex)
False
Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
botil02
User
Beiträge: 4
Registriert: Mittwoch 28. Februar 2018, 18:21

Danke, werde ich gleich ausprobieren.
botil02
User
Beiträge: 4
Registriert: Mittwoch 28. Februar 2018, 18:21

Hallo Dennis,
das funktioniert bei mir leider nicht.

Hier ein Beispiel

Code: Alles auswählen

from sympy import *

x=symbols('x')


fx = x**2+1

print('f(x) = ',expand(fx))

#Nullsellen der Funktion und der Ableitungen finden
x_0=solve(fx,x)    #Nullstellen

print(x_0)

for i in x_0: 
    print(i, isinstance(i, complex))
    if isinstance(i, complex):
        print(i,' ist keine reele Lösung')
        
    else: 
        print('  x = ',i)
Ausgabe:

Code: Alles auswählen

f(x) =  x**2 + 1
[-I, I]
-I False
  x =  -I
I False
  x =  I
Das komplexe Ergebnis wird nicht mit j sondern mit I ausgegeben.

Grüße Tilo
Sirius3
User
Beiträge: 18215
Registriert: Sonntag 21. Oktober 2012, 17:20

Wenn Du wissen willst, ob eine Lösung reell ist, dann gibt es dafür `is_real`.
Variablennamen sind für das Verständnis wichtig. Vor allem wenn Du Dich eh im mathematischen Umfeld bewegst, weißt Du, daß `i` für eine ganze Zahl steht. Wenn etwas sowohl im if- als auch im else-Zweig steht, kann man es auch einfach einmal danach schreiben. Jedoch, wenn man einen Zählerstand bei for-Schleife braucht, benutzt man enumerate.

Code: Alles auswählen

if len(solutions)==0:
    print('keine Nullstellen.')
else:
    print('Nullstellen')
    for i, solution in enumerate(solutions, 1):
        if solution.is_real:
            print(f"  x{i} = {solution}")
        else:
            print(f"   x{i} = {solution} ist keine reele Lösung")
botil02
User
Beiträge: 4
Registriert: Mittwoch 28. Februar 2018, 18:21

Hallo Sirius3,

das hat mir sehr geholfen und gezeigt, dass man immer immer wieder dazulernen kann.
Danke und viele Grüße
Tilo
Antworten