Kurve fitten

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Micha_uni
User
Beiträge: 15
Registriert: Dienstag 23. Mai 2017, 12:14

Hallo liebe Python-Profies!

Bin blutiger Python-Anfänger ;-)
Ich bin dabei eine Simulation durchzuführen. Die drei Graphen( y1 , y2 , y3) sollen sich. laut Theorie, bei x= 2,26 treffen. (Was sie Anschau nach ungefähr tun).Ich wusste nicht, wie man den Graphen dazu hochladen kann, deshalb hier nur die Werte.
Die Werte habe ich durch eine ziemlich komplizierte Funktion ausgerechnet. Nun weiß ich nicht, wie ich die Werte fitten kann.
Da ich nicht wusste, wie ich den Schnittpunkt raus bekommen soll, habe ich eine Funktion geschrieben, die mir die gleichen Werte in allen drei Kurven raus piksen kann.

Code: Alles auswählen

def schnittpunkt(y1,y2,y3):
	schnitt = []
	for i in y1:
		if i in y2 and i in y3:
			schnitt.append(i)
	return schnitt
Damit ich immer eine Schnittmenge aus allen drei Kurven habe, müsste ich sogar die Werte auf zwei Stellen aufrunden.
Der Grund für diesen Umweg, der auch meine Daten ungenau macht, ist es , dass ich nicht weiß, wie ich die Abweichungen und das Fitten in Python nicht kann.
auf vielen Internetseiten sind Erklärungen, wie man Funktionen fitten kann. Aber aus Datenmengen, weiß nicht.
Die aufgenommenen Punkte sollen eigentlich 200 Punkte sein und nicht aufgerundet, damit man möglichst nahe an den theoretischen Wert rankommt. Ich musste die Werte aufrunden, sonst ergeben sich keine Schnittmengen.
Es soll aber elegantere und praktischere Wege geben oder?
Könnte mir jemand vielleicht helfen?
Bedanke mich vielmals.
Hier sind die Werte:

Code: Alles auswählen

x= [ 2.     2.01   2.02   2.031  2.041  2.051  2.061  2.071  2.082  2.092
  2.102  2.112  2.122  2.133  2.143  2.153  2.163  2.173  2.184  2.194
  2.204  2.214  2.224  2.235  2.245  2.255  2.265  2.276  2.286  2.296
  2.306  2.316  2.327  2.337  2.347  2.357  2.367  2.378  2.388  2.398
  2.408  2.418  2.429  2.439  2.449  2.459  2.469  2.48   2.49   2.5  ]
  y1= [ 1.067  1.067  1.072  1.071  1.078  1.077  1.076  1.083  1.086  1.077
  1.086  1.091  1.092  1.103  1.101  1.108  1.105  1.109  1.114  1.121
  1.121  1.131  1.136  1.133  1.14   1.147  1.151  1.149  1.16   1.163
  1.174  1.166  1.179  1.179  1.182  1.184  1.195  1.202  1.19   1.199
  1.21   1.215  1.217  1.232  1.231  1.228  1.238  1.245  1.247  1.262]
y2= [ 1.034  1.037  1.037  1.04   1.043  1.043  1.047  1.053  1.052  1.062
  1.069  1.07   1.068  1.087  1.083  1.083  1.09   1.096  1.099  1.119  1.1
  1.115  1.135  1.14   1.147  1.161  1.135  1.145  1.174  1.179  1.198
  1.209  1.21   1.214  1.22   1.257  1.245  1.271  1.288  1.268  1.316
  1.292  1.331  1.328  1.354  1.344  1.424  1.382  1.424  1.446]
y3= [ 1.021  1.019  1.022  1.027  1.027  1.029  1.031  1.031  1.036  1.043
  1.046  1.053  1.047  1.045  1.063  1.062  1.061  1.077  1.084  1.093
  1.083  1.119  1.128  1.123  1.154  1.156  1.16   1.137  1.219  1.199
  1.228  1.232  1.247  1.244  1.246  1.321  1.265  1.318  1.392  1.37
  1.376  1.428  1.479  1.473  1.457  1.487  1.528  1.604  1.589  1.612]
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

also wenn du aus einer Punktemenge fitten willst, dann solltest du für den bestmöglichen fit zumindest wissen, wie sich deine Daten ungefähr verhalten (linear, Polynom X-ten Grades, logarithmisch, ...) sonst bekommst du keinen guten Fit mit minimaler Abweichung hin.

Fitten willst du auch nicht unbedingt selber programmieren, dafür gibt es fertige Bibliotheken wie numpy oder scipy. Da gibt's auch Funktionen, die fitten (z.B.: https://docs.scipy.org/doc/numpy-1.13.0 ... lyfit.html, um mit numpy aus einer Punktemen mit einem Polynon vorzugebenden Grades zu fitten.

numpy und scipy haben auch Funktionen, um Schnittpunkte zu berechnen.

Gruß, noisefloor
Micha_uni
User
Beiträge: 15
Registriert: Dienstag 23. Mai 2017, 12:14

Danke für die schnelle Antwort.
Im youtube habe ich auch ein Video gefunden, das deinen Vorschlag erklärt.
Es funktioniert!
;-)
Antworten