Hystere Fläche berechnen

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
earloop
User
Beiträge: 38
Registriert: Sonntag 11. Oktober 2020, 13:54

Ich will die Fläche berechnen, die von einer Hysteresekurve eingeschlossen ist:
Bild

Im Prinzip ist das Vorgehen klar: Differenzfunktion aus oberer und unterer Funktion bilden und integrieren.

Aber wie kriege ich aus den Daten die beiden Funktionen?
Ich bin ratlos. Woher weiß ich bei einem Wertepaar, ob der zugehörige y-Wert zur oberen oder zur unteren Funktion gehört?

Hier der code für den Plot:

Code: Alles auswählen

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import pandas as pd
import matplotlib.pyplot as plt

Data = pd.read_table('Hysteresis.txt')
x = Data['x']
y = Data['y']
plt.plot(x,y,'-+')
und das sind die Daten:

Code: Alles auswählen

x	y
35.9307443420176	-0.191901865222846
35.6670474416698	-0.200838913213536
35.2344165474585	-0.259922961683301
34.1226799544098	-0.221357180813058
34.1591299961967	-0.263672349321205
33.5592641742585	-0.186660310090812
32.8528535160655	-0.195834125722639
31.5983508984898	-0.188377277968906
31.0746982919466	-0.198998800093223
30.8176180682795	-0.271224850295297
30.0825630277145	-0.232518553892631
28.9230405952447	-0.174184282564319
28.3083117256312	-0.263343019683032
26.8473131031507	-0.260481204118715
25.910658761394	-0.202204856956762
25.4723581391883	-0.165429415904899
24.1758185792159	-0.253207829560623
23.3963445767977	-0.249974648541638
22.2095156070142	-0.186160904565804
20.3561380829646	-0.173841072554599
19.8255102464114	-0.183632130672549
19.0452252235958	-0.180032326649609
17.0830957017215	-0.223820537678153
16.3009467256727	-0.128641438596803
15.3768334759558	-0.126100300669175
14.6576548262143	-0.170372141140331
13.0696231894975	-0.200105519586146
12.0374147903637	-0.175622769315825
10.9194589498444	-0.146289405358936
9.85025481327598	-0.163471733646969
8.03851746623995	-0.144679902447216
7.18538723661614	-0.132758607584156
5.94219654807712	-0.097271943704147
5.12269647054134	-0.114694650901819
3.84886276732788	-0.07302041065087
2.55114642000557	-0.064766243523384
1.55619192293032	-0.106921498656165
0.356190623299433	-0.079845256322253
-0.392793236358212	-0.066985680078291
-1.70645562462673	-0.037399692694098
-2.88481686367973	-0.107880883847764
-4.05407612920525	-0.100676543382227
-4.10386772466071	-0.10691984914286
-6.08059390453804	-0.073540380647832
-6.927819413012	-0.049591693708892
-6.96415735045038	-0.000610177413177
-8.29727918578558	-0.05336711388947
-9.54960489478283	-0.014858445951114
-9.84694827572167	-0.047286261347557
-10.746029421262	-0.038216783547336
-10.9141256290356	0.012062070868437
-11.59497823671	-0.003060483215139
-12.8128822550667	0.04622580310813
-12.9056588497232	0.054202543494621
-13.7807653529668	0.09290674915213
-13.7088697462888	0.014810414925466
-14.3071987320217	0.083247040837398
-15.232472964667	0.069989286772442
-14.930591765144	0.109228440501079
-15.9498324230239	0.06746250714397
-16.1576261703213	0.115859090794062
-16.8014447794562	0.046872589731414
-17.0332578529212	0.12711231725876
-16.762186015561	0.139172416157264
-17.1193675866728	0.154970896505042
-17.5703273475188	0.110395902773139
-18.4570197226246	0.176977899864258
-18.0809584938309	0.178033077455948
-18.4427457223509	0.116138153053036
-18.964037704551	0.170775481178706
-19.435509732696	0.184104182040474
-19.6461044666292	0.124834018522108
-19.9147688940025	0.16166804525355
-20.3415651162187	0.178170114314092
-20.8636671149559	0.219184035450983
-21.1898431559532	0.152659167680134
-21.2367474078854	0.181841465625264
-21.2757798926059	0.218955793408674
-21.5796358956486	0.21426027611824
-21.9720116662781	0.219256561887657
-22.8161327114492	0.167348614155763
-22.2663178951708	0.204257426647587
-22.7074176120614	0.258722404910764
-23.3888452225049	0.229334975282895
-23.260010929025	0.271897862148561
-23.8129806109596	0.199180467822436
-24.6924393524933	0.265143952202513
-24.5606853480215	0.211272174919705
-24.791262170533	0.215386689772363
-25.3801373114211	0.253119008944881
-25.9274013728152	0.284286802527332
-25.8030292842025	0.230874124501871
-26.5511908091906	0.307021195826888
-26.9172667856941	0.233994666427686
-27.4053228131254	0.299833227710711
-27.5073733323691	0.255822807132647
-28.2115478045299	0.289663892618729
-28.4027053647474	0.265347927676538
-29.6790252859532	0.27162589354064
-30.0242408081538	0.323219082661619
-30.2285761994525	0.306402539868874
-30.3648849143672	0.308458849887677
-31.6293396867393	0.261732456990885
-31.9364784806139	0.338953174638749
-32.4682693952582	0.341850885292079
-32.7782323421134	0.370386980100586
-33.1852484200841	0.345988594245481
-34.6086556981081	0.312283182468204
-34.602993359	0.32423880312027
-34.7056219417449	0.383749084956955
-34.0043687770426	0.289688493303773
-34.9209504197826	0.370617859760116
-34.6437352863535	0.290739405367451
-34.1337876448628	0.287658270898409
-34.7309270973174	0.315022252097824
-34.2530710906501	0.289864204983111
-34.1182939148804	0.351946675880373
-34.5840758433625	0.346594263547106
-34.3143407612027	0.307409367793086
-34.0998139889208	0.373490350030498
-34.1540120273586	0.315287213290263
-34.5063388646479	0.36058087885802
-34.8367560148042	0.303032836082603
-34.099284341576	0.323585824269922
-34.8716785033432	0.36872890299574
-34.7079083983059	0.31178406937135
-34.5125582964692	0.36156553591168
-34.4648466640451	0.379493535462278
-34.5035070445183	0.339608635769584
-34.0264659868292	0.378861956052902
-33.8865735916535	0.328291630428028
-33.9020029033458	0.296132164986271
-33.4578500430198	0.295249064683826
-32.6053537638653	0.287240997056534
-32.4166104202469	0.306475052973077
-31.6860279361142	0.362838430499455
-30.5908285321325	0.340259150441737
-30.2548542835036	0.359853257794099
-29.5984409970628	0.363787074142582
-29.0599503489448	0.320425427129486
-28.1975607338305	0.282802433882949
-27.2649327529473	0.336075133407282
-26.3619117313911	0.33755684692519
-25.9257060862983	0.285463641137866
-24.178279410182	0.338610814652712
-23.1633790830481	0.328372828725449
-22.4164089750005	0.300551476271691
-21.1812104591469	0.314849908745882
-19.9925731447809	0.287177387160231
-18.8641843592168	0.299808745713743
-17.641705157255	0.325845384687493
-15.6100191671825	0.252571457282796
-14.3212479407163	0.244242607359965
-13.9875217918551	0.282769897000552
-11.876751964351	0.257679622069194
-11.0081319698606	0.262697301178427
-9.62709553356711	0.294136355445664
-7.60657655103477	0.240892721903206
-6.37412280252089	0.266052982691277
-5.15884322766788	0.268722816447792
-3.2311811899973	0.242244283137853
-2.65533776860064	0.218551768975815
-0.325217767121938	0.248795609724991
0.602793210468003	0.262368749246697
2.47114429923117	0.241408249072655
2.98790676641076	0.246101765263814
5.13397614924368	0.259361247228171
6.44949467341648	0.25114188528967
7.85406363119481	0.235014400613051
9.21515288979263	0.194135995495522
10.9396566150865	0.17150084190439
11.9324969713241	0.139666733352115
12.7008550135433	0.141953703796066
14.2824095130251	0.108677495498889
15.3240126413303	0.119163094389952
17.0491223028049	0.147646771025465
17.5732492196526	0.144655150129889
18.8828089417953	0.061404106341334
19.7937894265675	0.051105637205975
20.08201938226	0.077535958315544
20.8301463349116	0.04962784178525
20.8379796588739	0.061303546681648
22.2065028552158	-0.029125599413635
22.4767824622441	0.034819106664975
23.2860402879061	-0.042077761278392
23.5614527874071	0.000759562859847
24.0679870441508	-0.015530001578427
24.372923773379	-0.070327487817818
24.4458204421864	-0.031032294850089
24.3127471816936	0.007718691737174
24.8649011776585	-0.00769932097316
25.3060416553446	-0.026875537073993
26.130257735242	-0.072185620976605
26.1620214899325	-0.062110418824492
25.7930587146182	-0.104846911139847
26.2509741572456	-0.046708757429412
26.753725178651	-0.103242348425877
26.8091503684851	-0.093620902670146
27.4747467057715	-0.084216468668079
27.9863108568992	-0.090050855959182
28.0748452545047	-0.111074318740834
28.2670491213529	-0.130163022378029
28.7155638887211	-0.082080565848183
28.762669532993	-0.102762625348404
29.5599109380859	-0.086981422256283
29.8817001104743	-0.160315231235385
30.3722762748859	-0.162618659693437
30.4143420753007	-0.168302324893675
30.6717240587053	-0.122832665866492
31.4991302969722	-0.164016726688451
31.479285310156	-0.159118801079233
31.8397921776117	-0.183692001348916
32.7660160723845	-0.22458589981995
32.7369750023824	-0.161042557952344
32.7157383646113	-0.196273752296122
33.9817185844937	-0.217655285645124
34.3585747309932	-0.230248920696348
34.6474577420535	-0.249365215903829
34.8543928154035	-0.177113982642412
34.9921839905252	-0.176757038048526
35.6591689093548	-0.186880802173261
35.2111616215667	-0.262380995397053
35.3612692531806	-0.27011584437443
35.1084821174158	-0.206624616096003
34.9470246186084	-0.19864324303405
35.0821512335894	-0.26350407847603
35.4474545516664	-0.198670372929304
35.5499979003216	-0.23065142517625
35.5688925117384	-0.263320519015021
35.4101528987098	-0.198190224950301
35.1974876353718	-0.268942361720097
35.7253700454662	-0.232323021136332
35.8438398036925	-0.22886048409888
35.3013677538702	-0.249094562750026
35.6688080488773	-0.244918292375675
Bl3nder
User
Beiträge: 139
Registriert: Freitag 3. Januar 2020, 17:07

Hey also falls es nur um das farblich machen in deinem Plot geht versuch folgendes

Code: Alles auswählen

plt.fill_between(x,y)
bei der Berechnung kann Ich dir jedoch leider nicht helfen :/
Eine Vision ohne Aktion bleibe eine Illusion
Benutzeravatar
Dennis89
User
Beiträge: 1152
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,

es ist eigentlich egal ob der y-Wert zur oberen oder unteren Funktion gehört, da du den Betrag der Differenz aus den Werten benötigst.

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
earloop
User
Beiträge: 38
Registriert: Sonntag 11. Oktober 2020, 13:54

Ich verstehe nicht ganz. Welche Differenzen soll ich denn bilden?
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

Du hast eigentlich zwei Kurven in einer Liste. Diese Liste mußt Du an der Stelle des Minimalen x in zwei aufteilen und für beide die Fläche unter der Kurve berechnen.
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

sirius3 hat recht, bei der Fläche unter der Kurve muss dann aber zwingend sowas wie die Trapezmethode angewandt werden. Sonst erzeugen Unterscheide in der Menge der abgetasteten Werte einen uUnterschied.
earloop
User
Beiträge: 38
Registriert: Sonntag 11. Oktober 2020, 13:54

Sirius3 hat geschrieben: Mittwoch 10. Februar 2021, 14:53 Du hast eigentlich zwei Kurven in einer Liste. Diese Liste mußt Du an der Stelle des Minimalen x in zwei aufteilen und für beide die Fläche unter der Kurve berechnen.
Ja, das ist klar :wink:
Aber wie mache ich das :?:

Ausgehend vom kleinsten x-Wert muss ich ja für jeden weiteren Punkt entscheiden, zu welcher Kurve er gehört. Besonders am Anfang und am Ende weiß nicht wie ich die zuordnen soll.
Benutzeravatar
__blackjack__
User
Beiträge: 13061
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@earloop: Du könntest die Punkte auch als Punkte eines Polygons auffassen wenn ich das richtig sehe und die Fläche von dem Polygon berechnen.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

@earloop: die sind doch geordnet. Nicht ineinander verschachtelt. Sobald du den Wendepunkt (also min x oder Max x) gefunden hast, ist das deine Stelle zur Zweiteilung. Alles vorher inklusive ist ein Teil der Kurve. Alles danach inklusive das andere.
Benutzeravatar
__blackjack__
User
Beiträge: 13061
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Wobei das dann ungefährt 130 zu 106 Punkte sind wobei es auch nicht *den* Wendepunkt gibt — die schwanken da ein bischen. Müsste man also ”entprellen”.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wegen der unterschiedlichen Anzahl muss man eben die etwas aufwändigere Integration machen.
nezzcarth
User
Beiträge: 1633
Registriert: Samstag 16. April 2011, 12:47

__deets__ hat geschrieben: Mittwoch 10. Februar 2021, 17:54 @earloop: die sind doch geordnet.
Ich habe den Eindruck, dass es kleine Schwankungen im Kommabereich gibt. Z.b. ist der 5. X Wert größer als sein direkter Vorgänger/Nachfolger. Eine ganz naive Aufteilungsmethode anhand der vorgegebenen Reihenfolge klappt also vielleicht nicht.
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich habe mich hauptsächlich in der Nähe der Mitte umgeschaut. Und da nur ein simples in Augenschein nehmen.
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

Die Trapezformel funktioniert auch bei negativer Schrittweite dx, so dass die Hysteresefläche einfach

Code: Alles auswählen

numpy.trapz(y, x)
ist.
Antworten