Werte aus range Umgebung plotten

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
mkr227
User
Beiträge: 2
Registriert: Montag 26. November 2018, 19:57

Hallo liebe Forengemeinde,

erst einmal vielen Dank für die aufnahme :D

Nun zu meinem Problem:

Ich soll eine simple Berechnung über einen Wertebereich von x plotten. Die Berechnung ist alles kein Problem, aber beim plotten komme ich nicht zu meinem gewünschten Ergebnis. Wenn ich in meinem range plotte, dann wird mir für jede Brechnung nur der eine Punkt im Diagramm gezeigt, ich möchte aber eine Kurve erhalten. Meine Recherche brachte mir keine adequate Lösung, drum hoffe ich, dass ihr mir helfen könnt.
Ich habe es auch schon geschafft, das mir über alle Werte nur ein Diagramm ausgegeben wird, aber da sind dann keine Werte zu finden.

Hier mein code:

Code: Alles auswählen

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt

#define x and z(x)

def z(a):
    if a < 0:
        z = 0
        return z
    else:
        z = np.sqrt(a)
        return z


#value range for x

def frange(start, stop, step):
    '''function to use the ability from range with floating numbers'''
    i = start
    while i < stop:
        yield i
        i += step


for x in range(-7, 8, 1):


#define w(x)
    '''function of w(x) more specific than shown in task, because with the definition from the task,
        w(x) will not calculate any value. If x = 0 or (x/7)^2>1 the sqrt will not work.'''
    def w(x):
        if x == 0:
            w = 0
            return w
        elif np.square(x/7) > 1:
            w = 0
            return w
        else:
             w = 3*np.sqrt(1-(np.square(x/7)))
             return w

#define m(x)            
    m = abs(x/2) + z(1-np.square(abs(abs(x)-2)-1)) - (1/112)*(3*np.sqrt(33)-7)*np.square(x)*w(x) -3

#define k(x)
    k = 0.5*(3.0*(abs(x+0.5) + abs(x-0.5) + 6) -11 * (abs(x+0.75) + abs(x-0.75)))

#define r(x)
    r = 1/2 * (3-x) + 6/7*np.sqrt(10) - 3/7 *np.sqrt(10) * z(4-np.square(x-1))

#define l(x)
    l = 1/2 * (3+x) + 6/7*np.sqrt(10) - 3/7 *np.sqrt(10) * z(4-np.square(x+1))

#Heaviside function
    '''the heaviside function is defined in numpy
        Because x2 from the function isn't given in the task, I use x2 = 0'''
    

#final functions

    f = w(x) +(l - w(x))*np.heaviside(x+3, 0) + (k - l)*np.heaviside(x+1, 0) + (r - k) * np.heaviside(x-1, 0) + (w(x) - r) * np.heaviside(x-3, 0)

    g = 1/2 * (np.sign(x+4) - np.sign(x-4)) * m - w(x)

    print("\n\n", x, "\n", f, "\n", g)
    
# plot
    
    plt.figure(figsize = (12,5))
    plt.plot(x, f, 'r', label ='f(x)')
    plt.plot(x, g, 'k', label = 'g(x)')

    plt.title('Plot for f(x) and g(x)')
    plt. legend(loc = 'best')
    plt.show()

input('Press return to exit')
VG mkr227
Bolitho
User
Beiträge: 219
Registriert: Donnerstag 21. Juli 2011, 07:01
Wohnort: Stade / Hamburg
Kontaktdaten:

kurz gesagt: du erstellst ja auch nur Diagramme mit jeweils einem Datenpunkt. Dafür aber eben entsprechend viele Diagramme, also für jeden Datenpunkt ein eigenes Diagramm. Ein Ansatz wäre die Datenpunkte in Listen zu speichern und dann nach der Berechnung aller Punkte ein Diagramm mit einer "Kurve" zu zeichnen.

Du hast bisher wahrscheinlich keine Antwort erhalten, weil dein Code echt abschreckend ist. Nicht bös gemeint. Aber wenn man da nicht drin ist, liest sich eine Funktion mit dem Namen z nicht wirklich gut. was macht die Funktion? Der Name sollte das zumindest andeuten. Und wenn Funktion z Variable a bekommt, wird es noch unübersichtlicher. Auch hier ist ein sprechender Name von Vorteil. Hier gibt es entsprechende Hinweise: https://www.python.org/dev/peps/pep-0008/
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Ich habe mal deinen Code so verändert, dass er funktioniert und ein schöner Plot dabei raus kommt.
Er ist noch erheblich optimierbar.

Code: Alles auswählen

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt

def z(a):
    if a < 0:
        return 0
    else:
        return np.sqrt(a)
    
def frange(start, stop, step):
    '''function to use the ability from range with floating numbers'''
    i = start
    while i < stop:
        yield i
        i += step

def w(x):
    if x == 0 or np.square(x/7) > 1:
        return 0
    else:
         return 3 * np.sqrt(1 - (np.square(x / 7)))

x_achse = []
f_von_x = []
g_von_x = []

for x in range(-7, 8, 1):
    m = abs(x / 2) + z(1 - np.square(abs(abs(x) - 2) - 1)) - (1 / 112) * (3 * np.sqrt(33) - 7) * np.square(x) * w(x) -3
    k = 0.5 * (3.0 * (abs(x + 0.5) + abs(x - 0.5) + 6) - 11 * (abs(x + 0.75) + abs(x - 0.75)))
    r = 0.5 * (3 - x) + 6 / 7 * np.sqrt(10) - 3 / 7 * np.sqrt(10) * z(4 - np.square(x - 1))
    l = 0.5 * (3 + x) + 6 / 7 * np.sqrt(10) - 3 / 7 * np.sqrt(10) * z(4 - np.square(x + 1))

    f = w(x) + (l - w(x)) * np.heaviside(x + 3, 0) + (k - l) * np.heaviside(x + 1, 0) + (r - k) * np.heaviside(x - 1, 0) + (w(x) - r) * np.heaviside(x - 3, 0)
    g = 0.5 * (np.sign(x + 4) - np.sign(x - 4)) * m - w(x)

    x_achse.append(x)
    f_von_x.append(f)
    g_von_x.append(g)

plt.figure(figsize=(12,5))
plt.plot(x_achse, f_von_x, 'r', label='f(x)')
plt.plot(x_achse, g_von_x, 'k', label='g(x)')

plt.title('Plot for f(x) and g(x)')
plt.legend(loc='best')
plt.show()
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Habe mal die von dir definierte frange Funktion benutzt und die Stepweite auf 1/10 gesetzt, dann bekomme ich diesen Plot.
Ich dachte, das kommt mir das bekannt vor, aber es stimmt nicht mit dem Logo überein, das ich im Kopf hatte.... :lol:
Bild
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
mkr227
User
Beiträge: 2
Registriert: Montag 26. November 2018, 19:57

Bitte entschuldigt, die späte Antwort.
Leider war diese Woche mein Kind krank und da kam ich absolut nicht dazu, mich an den Laptop zu setzen.

Vielen lieben dank für eure Antworten und die Hilfe. Ich werde mir eure Tips merken.

VG mkr227
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Statt hier mit for-Schleifen zu hantieren, versuche die Funktionen w und und z so umzuschreiben, dass sie mit Vektoren zurecht kommen. `frange` durch `arange` oder `linspace` ersetzen.
Antworten