Verschachtelte Funktion mit Listendaten berechnen?

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
raspPy
User
Beiträge: 15
Registriert: Dienstag 15. September 2020, 13:54

Hallo,

ich stehe gerade auf dem Schlauch und habe das Gefühl, dass ich den Wald vor lauter Bäumen nicht sehe. Ich hoffe, ihr könnt mir helfen?

Was ich berechnen will:
"N" ist eine Zahl aus einem Bereich von 50 bis 55. Ich möchte mit allen Zahlen aus diesem Intervall im Abstand 0.05 ("N_step") arbeiten. Dafür lasse ich eine Liste per for-schleife erstellen, die genau diese 100 Zahlen enthält. Dann möchte ich jedoch eine Berechnung mit jedem N durchführen, dann anschließend mit jedem neuen Wert(N) erneut eine Berechnung durchführen und dann anschließend mit einer definierten Funktion den Funktionswert an diesen vorher berechneten Stellen berechnen.

Leider komme ich nach dem erstellen der Liste "lst_N" nicht wirklich weiter, wie ich diese Verschachtelung machen kann. Habt ihr einen Tipp?

Mein Code:

Code: Alles auswählen

import math

N_start = 50.0
N_stop = 55.0
N_step = 0.05
digits = 5

A = 10.0
E = 50.0 

def frange(start, stop, step, digits):
     for i in range(int(stop/step)+1):
         yield round(i*step, digits)
# Liste zeigen
print(list(frange(N_start, N_stop, N_step, digits)))
# Liste speichern
lst_N = list(frange(N_start, N_stop, N_step, digits))

# Berechnung f_1 mit jedem N aus lst_N
f_1 = 0.5*(A+N)

# Berechnung F_1 mit jedem N aus lst_N
F_1 = sqrt(f_1)

# Berechnung des Funktionswert der Funktion "ergebnis" für jedes N:
def ergebnis(lst_N, E):
  ergebnis_f= A+E+F_1
  return ergebnis_f
__deets__
User
Beiträge: 14537
Registriert: Mittwoch 14. Oktober 2015, 14:29

Dein frange ist falsch. Die Anzahl der Schritte ist die Intervallgrösse durch Schrittweite. Du berechnest aber rechte Grenze durch Schrittweite, und das sind dann viel zu viele. Und den Start berücksichtigst du bei den Resultaten auch nicht. Such dir mal da draussen eine funktionierende frange, da gibt’s Rezepte oder was in numpy.
einfachTobi
User
Beiträge: 491
Registriert: Mittwoch 13. November 2019, 08:38

Ich gehe davon aus, dass das Beispiel hier stark abstrahiert ist. Deshalb würde ich direkt zu numpy raten. Damit erledigst du auch gleich den Rest in Windeseile und ohne Schleifen.
raspPy
User
Beiträge: 15
Registriert: Dienstag 15. September 2020, 13:54

Hallo,
danke für eure Antworten. Ich habe es jetzt mit NumPy probiert und das klappt auch grundsätzlich ganz gut. Bleiben zwei Sachen, die ich bisher nicht gelöst bekommen habe:

- ich kann zwar die Ergebnisse einfach aus der Konsole rauskopieren, doch ich hätte gerne den print von ERGEBNIS als eine einzige Spalte und nicht gemischt als Zeilen und Spalten.

- Außerdem verstehe ich nicht warum trotz meines integers "Nst_int" meine N nicht genau in 0.05 Schritte gehen sondern nur gerundet so sind.

Würde mich freuen, wenn ihr mir da noch einen Tipp geben könntet. Hier der Code:

Code: Alles auswählen

import numpy as np

##Konstanten
A = 10.0
E = 50.0 

N_start = 50.0
N_end = 55.0
N_step = 0.05

## Array
Nst_int = int((N_end-N_start)/N_step)
print("Anzahl Schritte", Nst_int)
N=np.linspace(N_start, N_end, Nst_int)
print("Schritte", N)


# Berechnung f_1 mit jedem N aus array
f_1 = 0.5*(A+N)
print("f_1", f_1)

# Berechnung F_1 mit jedem N aus array
F_1 = f_1**2
print("F_1: ", F_1)

# Berechnung des Funktionswert der Funktion "ergebnis" für jedes N:
def ergebnis(N, E):
  ergebnis_f= A+E+F_1
  return ergebnis_f

ERGEBNIS=ergebnis(N, E)
                                
print("Ergebnis: ", ERGEBNIS)                                
Sirius3
User
Beiträge: 17748
Registriert: Sonntag 21. Oktober 2012, 17:20

Was meinst Du mit gerundet?
Du solltest Dich mit dem Problem beschäftigen, wie viele Zaunpfähle Du brauchst, wenn Du einen 50 Meter langen Zaun bauen willst und alle 50cm einen Pfahl in die Erde setzen mußt.

Konstanten werden komplett groß geschrieben, Variablennamen komplett klein. Du hast da ein wildes Mischmasch.
`ergebnis` ist ein seltsamer Name für eine Funktion. Warum wird F_1 nicht als Argument übergeben?
einfachTobi
User
Beiträge: 491
Registriert: Mittwoch 13. November 2019, 08:38

Ich habe deinen Code nicht ausprobiert, aber bei numpy.linspace() gibt es tatsächlich eine Besonderheit. Die Funktion ist darauf ausgelegt _zwingend_ die korrekte Anzahl an Ergebnissen zu liefern. Dazu wird intern start + x * step gebildet. Es lässt sich aber nicht jede Zahl beliebig genau als float abbilden. Daher kann es durchaus zu kleinen Verschiebungen kommen. Details hier: https://stackoverflow.com/questions/649 ... t64-values
Antworten