for-Schleife

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
Student
User
Beiträge: 3
Registriert: Donnerstag 29. Oktober 2020, 15:20

Guten Tag Leute,

ich habe ein Problem und zwar folgendes. Ich habe letztens im Labor ein paar Messdaten aufgenommen und diese muss ich nun Auswerten, jedoch ist mein Problem ich weiß nicht wie ich dies richtig in mein Script implementiere.
Ich möchte quasi zwischen zwei Messdaten die Steigung berechnen und ab dem Zeitpunkt wo ich 50% über mein vorherigen Messpunkt ankomme dieses markieren und angeben. Ich weiß dass es eine for-Schleife sein muss, jedoch weiß ich nicht genau wie ich die schreiben soll

Vielen Dank für euer Hilfe

MfG
Benutzeravatar
__blackjack__
User
Beiträge: 13927
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Student: Ob das eine ``for``-Schleife sein muss oder gar eine sein sollte oder eben auch nicht, hängt davon ab wie Du die Daten vorliegen hast. Falls das Numpy oder Pandas Datentypen sind, dann ist ``for``-Schleife in der Regel ein Warnzeichen das man nicht wirklich *mit* den jeweiligen Bibliotheken arbeitet.
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
Student
User
Beiträge: 3
Registriert: Donnerstag 29. Oktober 2020, 15:20

Vielen Dank für die Antwort.
Da ich nur ein prozentualen Unterschied ermitteln wollte hat es sich einfacher gestaltet, als vermutet. Vielleicht eine unsaubere Lösung aber es hat geklappt.
Und zwar habe ich folgenden Code eingegeben
k= y[13]*1.5 um mir mein y-Wert ermitteln zu lassen.
jedoch fehlt mir jetzt mein dazugehöriger x-Wert und ich weiß nicht wie ich mir jenes Ausgeben lassen muss.
Also welchen Code ich angeben muss. Versucht habe ich mit np.where(x==k)
aber mir wir folgendes ausgegeben als Meldung.
<function where at 0x7f194d16d670>
Und ich möchte eigentlich nur den x-Wert zu meinem y-Wert haben. :D
Ich würde euch gerne mein Plot teilen, habe aber nicht rausgefunden wie das hier gehen soll.
Sirius3
User
Beiträge: 18220
Registriert: Sonntag 21. Oktober 2012, 17:20

Wichtiger ist erst einmal, dass Du Deinen Code teilst. Denn aus Deiner Beschreibung wird nicht wirklich klar, was Du denn versucht hast.
Student
User
Beiträge: 3
Registriert: Donnerstag 29. Oktober 2020, 15:20

Guten Tag,

Das ist mein Code, den ich geschrieben habe.
Und ich würde eigentlich nur gerne den X-Wert für K haben wollen.
Aber ich weiß nicht wie ich mir das angebe bzw wie ich das ausgeben lasse.
Im folgenden ist mein Script

Viele Grüße

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
from pylab import figure, axes, pie, title, show


y2data_original = ( -0.12608999999999998, -0.1935714, -0.213775, -0.221874, -0.23057499999999997, -0.24043099999999998, -0.25377700000000003, -0.26312299999999994, -0.27174599999999993, -0.280314, -0.291377, -0.30967, -0.36539200000000005, -0.528078, -0.872545, -1.441, -2.46995, -4.168059999999999)
x2data_original = (-10, -20, -30, -40, -50, -60, -70, -80, -90, -100, -110, -120, -130, -140, -150, -160, -170, -180)


points = np.array([(x2data_original, y2data_original)])

x=x2data_original
y=y2data_original
k= y[13]*1.5
print('Stromstärke', k ,'\mu A')


# calculate polynomial
z = np.polyfit(x, y, 3)
f = np.poly1d(z)

# calculate new x's and y's
x_new= np.linspace(x[0], x[-1], 18)
y_new = f(x_new)
np.where(x_new == k)
print(np.where)
plt.plot( abs(x_new), abs(y_new))

plt.plot(abs(x2data_original),abs(y2data_original), 'bx', label='nach dem Ätzen')

plt.title('IV for sensor 31223', fontsize='large')
plt.xlabel('U [V]', ha='right', va='top', x=1.0, fontsize='large')
plt.ylabel(r'I [${\mu}$A]', ha='right', va='bottom', y=1.0, fontsize='large')


plt.grid()
plt.legend()
plotname = 'Vergleich31223'
plt.tight_layout(pad=0.2)
plt.savefig(plotname+'.pdf'.format(), dpi=300)
plt.savefig(plotname+'.png'.format(), dpi=300)
meitnerium
User
Beiträge: 5
Registriert: Mittwoch 28. Oktober 2020, 17:58

Hey,

verstehe ich das richtig, dass du wissen möchtest, bei welchem Wert x deine aus den Daten interpolierte Funktion f den Wert k hat? Dann kannst du wie folgt vorgehen:
z enthält ja die Parameter des Polynoms, also gilt mathematisch gesehen: f(x) = z[0]*x³ + z[1]*x² + z[2]*x + z[3] und für dein gesuchtes x gilt dann 0 = z[0]*x³ + z[1]*x² + z[2]*x + z[3] - k, sodass

Code: Alles auswählen

print(np.roots([z[0], z[1], z[2], z[3]-k]))
dir diejenigen Stellen x angibt, an denen gilt: f(x)=k

Ich möchte aber nicht ausschließen, dass es noch einen eleganteren Weg dafür gibt, aber numpy.where macht auf jeden Fall etwas ganz anderes. Mich überrascht auch, dass du wenn es doch um eine Steigung geht eine Funktion dritten Grades gewählt hast, aber das liegt vielleicht auch daran, dass ich nicht die ganze Aufgabenstellung kenne.

Viel Erfolg noch!
Antworten