Matroids Matheplanet Forum Index
Forumbereich moderiert von: matroid
Mathematik » Numerik & Optimierung » Nichtlinearer Fit mit scipy
Druckversion
Druckversion
Antworten
Antworten
Universität/Hochschule Nichtlinearer Fit mit scipy
capstrovor Aktiv Letzter Besuch: im letzten Monat
Mitglied seit: 16.05.2018, Mitteilungen: 40, aus: Österreich
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum ersten Beitrag
Themenstart: 2020-10-28

Hallo,

ich habe einen Datensatz (Photozelle, Spannung U zwischen Kathode und Anode, Licht einer bestimmten Wellenlänge fällt auf die Kathode, es ensteht ein "Photostrom" der abhängig ist von der Spannung U; der Datensatz ist also der Photostrom bei verschiedenen Werten für U) den ich mit folgender Funktion fitten soll:
y(x) = C - B^(x-A)

Ich mache das ganze mit Python und verwende die curve_fit Funktion von scipy.optimize.

Meine Fragen:
1.: curve_fit gibt zwei arrays zurück: popt und pcov
also die fit parameter (hier A,B,C) und die covariance matrix. Dann müsste ja der Fehler der Parameter (nenne sie dA, dB und dC) die Wurzel aus den Diagonalelementen der pcov matrix sein (also Fehler von A ist die Wurzel aus dem 1,1 Eintrag, Fehler von B die Wurzel aus dem 2,2 Eintrag, usw). Ist dieser Wert jetzt als absoluter Fehler der Paramter zu interpretieren? Also dass A mit 64%-iger Wahrscheinlichkeit in dem Intervall [A-dA, A+dA] liegt?

2.: Der resultierende Fit passt ziemlich gut zu den Daten (Summe der Abstandsquadrate zwischen fit und Datenpunkte ca 0.1), die Fehler für die Parameter sind aber teilweise sehr groß. Was sagt das genau über den Fit aus? Die Fit-Funktion wurde eigentlich für diesen Datensatz vorgegeben; dieser sollte also passen? Bedeutet also wahrscheinlich dass ich schlecht gemessen habe, oder?😂

3.: Ich muss dann die Nullstelle der Fit-funktion finden. Dazu brauche ich noch den Fehler dieser Nullstelle. Wenn ich die Fitparameter kenne, kann ich diese ja mit
x0 = ln(C)/ln(B)+A
berechnen. Kann ich dann den Fehler mit Gauss'scher Fehlerpropagation berechnen?

Vielen Dank für die Hilfe!



Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
Spock Senior Letzter Besuch: in der letzten Woche
Mitglied seit: 25.04.2002, Mitteilungen: 8121, aus: Schi'Kahr/Vulkan
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum ersten Beitrag
Beitrag No.1, eingetragen 2020-10-28

Hallo!

Vorneweg: Hätte ich numerische Probleme, wäre Python nicht meine erste Wahl, :-), aber zu Deinen Fragen:

1. Die Antwort ist nein, wenn mit Covarianz-Matrix die Inverse der Hessematrix gemeint ist. Um den Standardfehler der Fit-Parameter zu bekommen, mußt Du die Diagonalelemente der Covarianzmatrix noch skalieren, d.h. Du multiplizierst sie mit der Fehlerquadratsumme und dividierst sie durch die Zahl der Freiheitsgrade. Daraus dann die Wurzel und Du hast einen Schätzwert für die Standardfehler.

2. Diese Aussage widerspricht sich, was mit 1. zusammenhängt, Du darfst nicht einfach die Wurzel aus den Diagonalelementen der Covarianzmatrix nehmen.

3. Ja, Fehlerfortpflanzung ist hier der Weg.

Vielleicht solltest Du Dich noch nach einer alternativen Software umsehen, viele "gute" Softwaretools liefern den Standardfehler der nichtlinearen Fitparameter samt weiterer statistischer Parameter wie Korrelations-Koeffizienten, usw. gleich mit, als bloßer "Anwender" muß man da nicht noch groß drüber nachdenken. Trotzdem kann es nicht schaden, die Theorie dahinter nachzulesen, auf die Schnelle fällt mir da das Buch ein

Wolberg: "Data Analysis Using the Method of Least Squares"

Das ist recht nahe an der Praxis, und dort findest Du auch weiterführende Literatur.

Und wenn dann alles scheitert, kannst Du immer noch Deine Meßwerte hier reinstellen, :-)

Grüße
Juergen




Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
DerEinfaeltige Senior Letzter Besuch: in der letzten Woche
Mitglied seit: 11.02.2015, Mitteilungen: 2529
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum ersten Beitrag
Beitrag No.2, eingetragen 2020-10-28

Die Covarianzmatrix wird nach meiner Lesart per Default korrekt skaliert ausgegeben.

Zitat Dokumentation:

pcov(absolute_sigma=False) = pcov(absolute_sigma=True) * chisq(popt)/(M-N)


To compute one standard deviation errors on the parameters use
perr = np.sqrt(np.diag(pcov)).


-----------------
Why waste time learning when ignorance is instantaneous?
- Bill Watterson -



Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
Spock Senior Letzter Besuch: in der letzten Woche
Mitglied seit: 25.04.2002, Mitteilungen: 8121, aus: Schi'Kahr/Vulkan
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum ersten Beitrag
Beitrag No.3, eingetragen 2020-10-29

Hallo!

Wenn wir mal Dank dem Beitrag No.2 davon ausgehen, daß die Covarianzmatrix schon automatisch richtig skaliert ist, noch eine Anmerkung:

2020-10-28 14:23 - capstrovor im Themenstart schreibt:
...
der Datensatz ist also der Photostrom bei verschiedenen Werten für U) den ich mit folgender Funktion fitten soll:
y(x) = C - B^(x-A)
...

Woher kommt diese Modellfunktion?
fed-Code einblenden

Aber vielleicht meinst Du ein ganz anderes "Experiment"?

Und noch zwei wichtige Sache, die man bei Nichtlinearen Regressionsverfahren beachten sollte:
1) Im Gegensatz zur Linearen Regression muß man bei der Nichtlinearen Regression für die zu fittende Modellparameter Startwerte vorgeben. Liegen diese Startwerte nicht nahe genug an den "wahren" Werten, kommt u.U. Unsinn heraus.
2) Es empfehlen sich numerische Programme, bei denen man die Jacobi-Matrix analytisch vorgeben kann.

Grüße
Juergen



Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
capstrovor Aktiv Letzter Besuch: im letzten Monat
Mitglied seit: 16.05.2018, Mitteilungen: 40, aus: Österreich
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum ersten Beitrag
Beitrag No.4, vom Themenstarter, eingetragen 2020-10-30

Vielen Dank schon mal für die Antworten!

Die Covarianzmatrix wird nach meiner Lesart per Default korrekt skaliert ausgegeben. [...]
pcov(absolute_sigma=False) = pcov(absolute_sigma=True) * chisq(popt)/(M-N)



Ah ok alles klar. Hab das auch schon gelesen, war mir aber nicht sicher ob ich das richtig verstanden habe. Noch eine Frage:
Gemessen habe ich mit einem Digitalmultimeter, mit einer Anzeige auf mV genau. Deshalb hab ich mal einen Messfehler von +- 0.5mV geschätzt. Da bei curve_fit ja standardmäßig absolute_sigma=False ist, muss ich dann also das sigma, welches ich curve_fit mitgebe, relativ zu den Messwerten angeben? Also wenn Uout mein Messwert-array ist, sigma_abs ein array mit 0.5 an jeder stelle, dann wäre sigma=sigma_abs/Uout?


"Vielleicht solltest Du Dich noch nach einer alternativen Software umsehen, viele "gute" Softwaretools liefern den Standardfehler der nichtlinearen Fitparameter samt weiterer statistischer Parameter wie Korrelations-Koeffizienten, usw. gleich mit, als bloßer "Anwender" muß man da nicht noch groß drüber nachdenken."

Ich hab dabei irgendwie immer so ein schlechtes Gefühl^^. Aber ja für den workflow wäre es vermutlich besser. Hast du einen Favoriten?


"Woher kommt diese Modellfunktion?"

Also die Modellfunktion wird in der Laboranleitung angegeben. Was ich vielleicht noch dazu sagen sollte: die Kathode und Anode bestehen aus zwei verschiedenen Materialien. Dadurch entsteht ein "reverse current". Die Daten die ich fitten möchte sind dann
sqrt(U_gemessen - U_reverse)
wobei U_gemessen bzw U_reverse direkt proportional zum Photostrim sind (U_reverse ist der Strom, der sich bei hoher Bias-Spannung der Photozelle ergibt (er ist negativ relativ zum "eigentlichen" Photostrom)).
Die Fitfunktion sollte also passen.

"Aber vielleicht meinst Du ein ganz anderes "Experiment"?"

Also die Photozelle besteht aus einer ringförmigen Kathode, auf die das Licht fällt. Die Kathode ist in einer Glaskugel, auf deren Rand das Anodenmaterial aufgedampft ist. Zwischen Kathode und Anode wird eine Spannung angelegt, und dann für jede Wellenlänge (Lichtquelle ist eine Hg-Lampe mit diskretem Spektrum) der Photostrom in Abhängigkeit von der Elektrodenspannung gemessen. Ziel ist es, die maximal stopping voltage U_max zu finden (das ist genau die Nullstelle meines fit). Diese U_max werden dann gegen die Frequenz aufgetragen. Der U_max hängt linear von der Frequenz ab, und der Schnittpunkt mit der y-Achse ergibt dann die Workfunction der Kathode.


"1) Im Gegensatz zur Linearen Regression muß man bei der Nichtlinearen Regression für die zu fittende Modellparameter Startwerte vorgeben. Liegen diese Startwerte nicht nahe genug an den "wahren" Werten, kommt u.U. Unsinn heraus."

Hmm und wie finde ich sinnvolle Startwerte? So wie ich es verstanden habe hängen die Parameter teilweise von der Geometrie der Photozelle ab, und die kenne ich nicht.


Ich weiß jetzt irgendwie nicht mehr weiter. Der Fit passt bei einigen Wellenlängen sehr gut, da ist dann auch der Parameter-error halbwegs annehmbar. Aber vor allem bei den Intensitätsschwachen Wellenlängen habe ich riesige Errorbars, der Plot sieht richtig lächerlich aus ( - das ist der Plot Umax - frequenz). Ich denke das einfach meine Messwerte nicht gut sind aus irgendeinem Grund... So macht das Laborbericht schreiben richtig Spaß 😂


Vielen Dank die Hilfe!




Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
rlk Senior Letzter Besuch: in der letzten Woche
Mitglied seit: 16.03.2007, Mitteilungen: 10910, aus: Wien
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum ersten Beitrag
Beitrag No.5, eingetragen 2020-11-01

Hallo capstrovor,
hier ist der Plot

Ich habe das Bild auf den MP kopiert und hier eingefügt, weil extern abgelegte Bilder leider oft schneller verschwinden als uns lieb ist. Sieh' Dir bei Gelegenheit diesen Artikel an, dort ist beschrieben, wie Du Bilder richtig verwendest.

Servus,
Roland



Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
Spock Senior Letzter Besuch: in der letzten Woche
Mitglied seit: 25.04.2002, Mitteilungen: 8121, aus: Schi'Kahr/Vulkan
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum ersten Beitrag
Beitrag No.6, eingetragen 2020-11-01

Hallo capstrovor,

vielleicht sollten wir zunächst die Physik klären. Die schönste Mathematik nützt nichts, wenn die Physik dahinter nicht klar ist, :-)

So, wie Du Dein Problem bisher beschrieben hast, ist es widersprüchlich:

Im Themenstart schreibst Du, daß Du den Photostrom in Abhängigkeit einer Spannung gemessen hast, und gibst dazu als Modellfunktion an:
fed-Code einblenden

Demnach wäre y der gemessene Photostrom und x die gemessene Spannung.

Nun zeigt Dein Bild, welches Roland in Beitrag No.5 freundlicherweise hochgeladen hat, eine Spannung als Funktion einer Frequenz, mit einer linearen Funktion als Fit. Das ist etwas völlig anderes als eingangs beschrieben.

Da ich erstmal nicht denke, daß es ein "numerisches Problem" irgendeiner Python Software ist, wären meine Vorschläge:

1.) Erkläre zunächst, welche Größen Du direkt gemessen hast, welche physikalische Größe Du daraus bestimmen sollst, und wie genau Deine zu fittende Modellgleichung lautet. Das Einfachste dabei wäre, Du gibst uns Zugang (z.B. einen Link) zu der Praktikumsanleitung.
2.) Wenn es nicht gerade 10000 Meßwerte sind, stell Deine gemessenen Größen als Zahlenwerte hier rein.

Andernfalls kann zumindest ich Dir im Moment nicht weiterhelfen.

Grüße
Juergen



Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
capstrovor Aktiv Letzter Besuch: im letzten Monat
Mitglied seit: 16.05.2018, Mitteilungen: 40, aus: Österreich
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum ersten Beitrag
Beitrag No.7, vom Themenstarter, eingetragen 2020-11-01

Hallo Jürgen,

ja ich hab befürchtet, dass das jetzt etwas unübersichtlich wird mit meinem Plot.

Also zu 1)
Ich richte die Photozelle relativ zum Prisma so aus, dass nur eine Spektrallinie der Hg-Lampe auf die Kathode fällt. Dann lege ich eine Spannung zwischen Kathode und Anode an (diese verändere ich in 50mV-Schritten von -1V bis +2.8V). Durch den Photoeffekt fließt dann ein Strom zwischen Kathode und Anode. Dieser wird von einem Strom-Spannungswandler und einem Lockin-Amp auf (max) 800mV verstärkt (die Verstärkung des LockIn Amp stelle ich für jede Wellenlänge neu ein, so dass bei -1V maximal 800mV gemessen werden). Die Verstärkung ist in diesem Bereich linear, so dass die gemessene Spannung direkt proportional zum Photostrom ist (ich schreibe immer vom Photostrom - gemessen wird aber eben diese dazu prop. Spannung).
Je weiter ich die Elektrodenspannung von -1V an erhöhe, desto kleiner wird der Photostrom. Für große positive Elektrodenspannung (ab ca. 2.0V) stellt sich ein negativer Photostrom ein - dieser wird reverse current genann (I_reverse). Wenn die Elektrodenspannung gegen ca. 2.8V geht, nähert sich der Photostrom asymptotisch dem reverse-current an.

Diese Messdaten (also Photostrom in Abhängigkeit von der Elektrodenspannung) sind die Rohdaten. Der reverse-current ist nicht gewollt; er ist aber konstant über die gesamte Messung. Deshalb wird vom gemessenen Photostrom der reverse-current abgezogen, sodass er sich asymptotisch 0A annähert.
Aus den Daten, die daruch resultieren, wird noch die Wurzel gezogen (nur aus Photostrom - I_reverse, nicht aus der Elektrodenspannung), damit die Daten mit der Funktion
\(y(U) = C - B^{U-A}\)
gefittet werden können (U ist die Elektrodenspannung, y hat die Einheit \(sqrt(Ampere)\)). Warum die Wurzel gezogen wird, wird nicht wirklich erklärt; es hat etwas mit der Geometrie der Photozelle zu tun.
Von der gefitteten Funktion wird dann die Nullstelle ermittelt (inkl. Fehler). Diese wird als U_max bezeichnet (i.e. y(U_max)=0).

Die Messung wird für alle acht Spektrallinien der Hg-Lampe wiederholt. Die ermittelten Werte für U_max werden dann gegen die Frequenz der Spektrallinien aufgetragen. Laut der Einsteinformel für den Photoelektrischen Effekt (E_kin: kinetische Energie der Elektronen, W die Workfunction des Materials, f die Frequenz des Photons),
\(E_{kin} = hf - W\)
ist der Zusammenhang linear. Das folgt aus der folgenden Überlegung:
Bei U_max ist der Photostrom gleich null. Das bedeutet, dass die kinetische Energie der Elektronen (E_kin) gleich groß wie die potentielle Energie e*U_max ist (e: Ladung eines Elektron). Deshalb kann die Gleichung geschrieben werden als
\(U_{max}(f) = h/e \cdot f - W/e\)
Diese Kurve wird Millikan-curve genannt. Das war der Plot den ich hochgeladen habe. 😁 Und die Errorbars sind die Unsicherheiten in der Nullstelle der fit-funktion.

Aus der Millikan-curve sollte also die Workfunction und das Verhältnis h/e abgelesen werden. Das ist das eigentliche Ziel des Labors.

2.)
Messdaten sind hier:


Für jede Wellenlänge eine csv-Datei.
Elektrodenspannung ist in V, Photostrom in mV.
Das sind die Rohdaten; also noch kein reverse-current abgezogen oder Wurzel gezogen.

Vielen vielen Dank für die Hilfe!

EDIT:
Etwas sollte ich noch anmerken: Wenn man die sqrt(Photostrom - I_reverse) gegen U plottet, gibt es auf der rechten Seite so eine Art "Terasse". Diese sollte im Fit nicht berücksichtigt werden (i.e. die letzten 9-15 Messpunkte werden curve_fit nicht mitgegeben)



Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
capstrovor hat die Antworten auf ihre/seine Frage gesehen.
capstrovor wird per Mail über neue Antworten informiert.
Neues Thema [Neues Thema] Antworten [Antworten]    Druckversion [Druckversion]

 


Wechsel in ein anderes Forum:
 Suchen    
 
All logos and trademarks in this site are property of their respective owner. The comments are property of their posters, all the rest © 2001-2020 by Matroids Matheplanet
This web site was originally made with PHP-Nuke, a former web portal system written in PHP that seems no longer to be maintained nor supported. PHP-Nuke is Free Software released under the GNU/GPL license.
Ich distanziere mich von rechtswidrigen oder anstößigen Inhalten, die sich trotz aufmerksamer Prüfung hinter hier verwendeten Links verbergen mögen.
Lesen Sie die Nutzungsbedingungen, die Distanzierung, die Datenschutzerklärung und das Impressum.
[Seitenanfang]