• Register

prištevanje +1 k elementu matrike ob določeni kombinaciji (4-Parametrični RAINFLOW)

+6 votes
439 views

Zdravo,

Sicer dvomim, da se je veliko forumašev tu že srečalo z 4-parametrično rainflow metodo, ampak kar meni dela težave je bolj programerske narave.

Torej ta metoda se uporablja za izločevanje obremenitvenih ciklov iz zgodovine obremenitev, ki je praviloma podana v diagramu F-t ali pa sigma-t in sestoji iz ogromnega števila točk (100.000 +). Ideja je v tem, da se iz te zgodovine obremenitve, ki ponavadi zgleda kot nekakšen šum, izloči standardne obremenitvene cikle in se jih zapiše v FROM-TO tabelo oz. FROM-TO matriko, kot je prikazano na primeru spodaj 

primer from-to tabele/matrike

Jaz sem program naredil tako, da sem najprej oblikoval vrednosti FROM v svoj vektor in vrednosti TO v svoj vektor. Elementa v enaki zaporedni legi posameznega vektorja torej predstavljata svojo kombinacijo, v tem primeru npr. [1,2], [2,2], [1,2], [4,1],...

In glede na dolžino teh dveh vektorjev se oblikuje kvadratna matrika ustrezne velikosti. Za izhodišče vzamemo matriko ničel in tako na mestih kombinacij prištejemo +1, ko se ta kombinacija pojavi. Seveda v realnem primeru se lahko določeni obremenitveni cikel pojavi 1000x ali celo več, zato bo tam matrika velikosti npr, 100x100 in ne bodo vrednosti v njej samo enice in dvojke. 

Mene zanima, kako bi napisal kodo, da ko se pojavi določena kombinacija, da se tam prišteje +1. Sam sem celotni algoritem že napisal, dobim torej vektor vrednosti from in vektor vrednosti to, ne znam pa napisati ustrezen algoritem, ki bi glede na te vrednosti na lokaciji prišteval +1. Zaenkrat sem zapisal takole:

mat_from_to = np.zeros(shape=(int(d),int(d)))
    MAT = np.zeros(shape=(int(d),int(d)))
    s=int(d-1)
    for i in range(s):
        mat_from_to[vek_from[i]-2, vek_to[i]-2] += 1 

To seveda ni OK, saj mi v takšnem primeru samo prejšnjo vrednost nadomesti z 1, kar pomeni, da četudi se določena kombinacija pojavi večkrat, ne morem preseči 1. Sam sem preizkusil že več kombinacij, a mi ni uspelo...

Mislim da obstaja neka zelo preprosta rešitev, ki pa mi zaenkrat žal še ni prišla na pamet, zato bi prosil, če ima kdo kakšno idejo, kako bi to lahko rešil.

Lep pozdrav,

 

Luka   
 

 

asked Mar 21, 2016 by tonc (690 points)
retagged Mar 21, 2016 by tonc
Kako to mislite, da "v takšnem primeru samo prejšnjo vrednost nadomesti z 1"? Operator " ... += 1" vam prišteje vrednost 1. Lahko podate še vhodne podatke, da bomo imeli enak input/output?
možno je, da program vsako kombinacijo zazna le enkrat

1 Answer

+3 votes
 
Best answer

Tule imaš (upam da željeno) rešitev za podan primer. Predvidevam, da tvoj problem ne zajema le števil 1-4, tako da boš moral In[3] in In[4] dopolniti v skladu s problemom. Jaz sem uporabil najlažji možni način za podan primer

answered Mar 21, 2016 by Blaž Velkavrh (29,970 points)
selected Mar 21, 2016 by tonc
Hvala, zadeva na mojem testnem primeru deluje, upam da bo tudi na končnem z več točkami. Sicer se mi zdi čudno, da mi += 1 ne deluje, mogoče je problem res v tem ,da ga upošteva samo na začetku...

Mi lahko samo prosim obrazložiš indeksa v par[], torej zakaj je par[0] in par[1], tega ne razumem čisto.

Lep pozdrav,

Luka
Uporabil sem majhen trik. Tvoji podatki so samo števila od 1 do 4, zato sem lahko za pozicijo v matriki uporabil kar ta števila (število - 1 za pretvorbo v python).

Na hitro razlaga for zanke:

Vsak par oziroma kombinacija  je v from_to zapisana kot posamezen array. Ko želiš pozicijo kjer moraš prišteti 1, potrebuješ število vrstice in stolpca (v obeh primerih 1-4). Vrednosti 'from' predstavljajo vrstice, vrednosti 'to' pa stolpce.

Torej pozicijo v matriki za vsako kombinacijo določiš z ['from' -1, 'to' - 1], oziroma [par[0] - 1, par[1] - 1], če je par = ['from', 'to']
...