• Register

Numerični odvod s šumom.

–2 votes
299 views

Pozdravljeni, 

pri domači nalogi za numerično odvajanje sem doletel do problema pri 5. vprašanju:
4. vprašanje me sprašuje za določiti numerični odvod r'(t) funkcije r(t) = a*sin(t)+b*t v časovnem intervalu [0,t2] z n ekvidistantnimi odseki, s centralno diferenčno shemo. Časovni interval sem pravilno nastavil, saj je bilo to potrebno izračunati v 3. vprašanju. Ustrezno sem postavil meje intervala in pravilno sem izračunal odvod.
5. vprašanje pa zahteva da funkciji r(t) dodam še šum ("šum" sem pravilno izračunal, saj je bilo zahtevano v 2. vprašanju.) in nato naj izračunam odvod na istem časovnem intervalu kot pri vprašanju 4. Končna enačba torej je: r(t) = a*sin(t)+b*t+šum/1000
Moja koda (ki vrne napačno rešitev) je sledeča:
def rsum(t):
    return a*np.sin(t)+b*t+šum[1:-1]/1000
rs_1 = (rsum(h+interval[1:-1])-rsum(-h+interval[1:-1]))/(2*h)
odgovor5 = rs_1

 

Ne razumem kje bi lahko bila napaka, saj sem na podoben način rešil 4. vprašanje.
Je lahko problem zaradi šuma? Ker sem ga moral generirati z funkcijama  numpy.random.seed(i)  in numpy.random.rand in sem mogoče celico večkrat pognal? 

 

LP Adam

asked Apr 27, 2017 by nanuta (1,300 points)
Koeficienta a in b sta podana.

1 Answer

+2 votes

Težava ni v šumu, temveč v vašem načinu izračuna odvoda.

Numeričnega odvajanja se običajno poslužujemo, kadar ne poznamo funkcijskega predpisa izraza, ki ga odvajamo, poznamo pa njegove numerične vrednosti. 

Vi ste v svoji kodi centralne difernčne sheme uporabili kar funkcijo rsum, izračunali ste njene vrednosti pri (interval+h), (interval-h):

rsum(h+interval[1:-1])-rsum(-h+interval[1:-1])

Za demonstracijo metod numeričnega odvajanja je tak pristop v redu, v resnici pa, kadar numerično odvajamo, to počnemo zato, ker funkcije (v vašem primeru rsum) ne poznamo (sicer bi jo lahko odvajali simbolno, recimo v sympy. Prav tako ne bi imeli težav z izračunom vrednosti odvoda v robnih točkah intervala - do teh pride le takrat, ko poznamo le določene numerične vrednosti naše fukcije, pri metodi končnih razlik pa za izračun odvoda v neki točki vedno potrebujemo vrednosti funkcije pred ali po njej). 

Ko ste pri 3. vprašanju določili vrednosti na x-osi, pri katerih ste nato lahko izračunali vrednosti vaše funkcije rsum, bi nato morali nadaljevati z izračunom odvoda izključno na podlagi izračunanih numeričnih vrednosti rsum(interval). (S centralno diferenčno shemo tega ne morete storiti v robnih točkah - zato interval[1:-1] v vaši kodi.)

P.S.: Prvi vprašanju brez šuma se vaš in pričakovan način po rezultatu ne razlikujeta. Pri zadnjm vprašanju pa ste računali vrednosti rsum pri različnih točkah na x osi (interval+h, interval-h), vedno pa ste prištevali iste vrednosti šuma. To seveda ni ustrezno - vsaka točka naključnega šuma "pripada" točno določeni točki na x-osi. Če bi vašim izračunanim vrednostim najprej prišteli šum, nato pa nadaljevali le s temi numeričnimi vrednostmi, težav ne bi imeli.

answered Apr 27, 2017 by dgorjup (60,170 points)
Glede vprašanja brez šuma (jaz sem šel po predavanjih, in sem apliciral sledečo enačbo f'(x)=(f(x+h)-f(x-h))/(2h)), kakšen pa bi bil pričakovan način, ki se po rezultatu ne razlikuje od mojega?
Ker še vedno mi ni jasno.
In glede vprašanja z šumom, jaz iz teksta razumem da funkciji r(t)=a*sin(t)+b*t dodamo še: +šum/1000 (ki glede na to, da ni pomnožena z spremenljivko t, po kateri funkcijo odvajamo, lahko smatramo kot konstanto)
Je mogoče mišljeno, na tak način: r(t+šum/1000) = a*sin(t+šum/1000)+b*(t+šum/1000) ?
Ker sicer ne bi bil odvod konstante enak nič?
Torej še enkrat, ko ste določili numerino polje vrednosti na x osi (recimo x) in lahko v teh točkah izračunate vrednosti funkcije, ki jo odvajate (recimo f(x)) imate vse potrebne podatke, da numerično izračunate odvod f'(x).

Pri centralni diferenčni shemi za izračun f'(x_i) v neki določeni točki x_i potrebujete vrednosti f(x_i+h) in f(x_i-h), kot ste zapisali zgoraj. Po tem, ko ste izračunali vrednosti funkcije f(x) za vse podane vrednosti x, torej že imate vse kar potrebujete, da izračunate odvod f' v vseh točkah na x-osi razen prve (ker ne poznate vrednosti v točki pred njo, f(x_{-1})) in zadnje (ne poznate f(x_n)).

Če vas naloga sprašuje po odvodu šumnih podatkov je edina razlika ta, da namesto z vrednostimi numeričnega polja f(x) računate z f(x) z dodanim amplitudnim šumom. Ne vem od kod dilema kako šum prišteti funkcijskim vrednostim - to zelo jasno piše v navodilu naloge.
Ja, jaz sem to naredu:
začetni funkciji r(t) = a*sin(t)+b*t sem dodal še šum, tako da je na koncu funkcija zgledala kot tista ki je v definiciji vprašanja: r_sum(t) = a*sin(t)+b*t+šum/1000
Nato sem to končno funkcijo r_sum odvajal z centralno difenenčno shemo (s tem, da sem ustrezno skrajšal bodisi časovni kot interval šuma, glede na zahteve centralne diferenlne sheme):
rs_1 = (r_sum(h+interval[1:-1])-r_sum(-h+interval[1:-1]))/(2*h)

Vendar dobim, da rešitev ni pravilna.
In glede na to, da je šum prištet kot konstanta, saj ni pomnožen s spremenljivko t, dobim rezuiltate odvoda funkcije r(t) = a*sin(t)+b*t enake rezultatom odvoda funkcije r_sum(t) = a*sin(t)+b*t+šum/1000, kar po logiki bi moralo biti pravilno, če se ne motim.
Poskusite izrisati potek šuma v času. Morda bo tako bolj jasno, da šum ni konstanta (tudi, če ga ne prištevamo pomnoženega s t) in da ni vseeno, ali te iste vrednosti enkrat prištevate k f(x+h), enkrat pa k f(x-h), kot ste storili v vaši rešitvi.

Če boste še imeli težave se oglasite na govorilnih urah.
...