Adaptīvā gaidīšanas kontrole ar vismazāko vidējo kvadrātu algoritmu

Subaru Outback 2015 vidējais degvielas patēriņš un adaptīvā kruīza kontrole (Maijs 2019).

$config[ads_text] not found
Anonim

Adaptīvā gaidīšanas kontrole ar vismazāko vidējo kvadrātu algoritmu


Šeit ir vēss triks, kuru jūs nekad neizmantosiet, ja vien neizmantosiet mikroprocesoru, kuru esat iegādājies par daļu centru daļās no centu - heck varbūt jūs pat vēlaties aprēķināt, cik daudz lielākā daļa šo mikrokontrolleru ir uz vienu vienību jūsu mikrokontrolleru, bet jūs nevarat, jo tas ir tik lēts, tā pat nevar sadalīt. Šī sadalījuma metode ir ievads adaptīvai guvumu kontrolei ar vismazāko kvadrātveida algoritmu, kas, manuprāt, atvieglos darbus, kā tas, ka iteratīvs process aprēķina vēlamos guvumus. Apskatiet šādu Matlab kodu, kas tuvinās pareizai vērtībai, kuru jūs mēģināt sadalīt (neizmantojot dalīšanas operatoru).

 DivideBy = 5; mu = .1; DivideByFactor = 1; ref = 1; num_iter = 20 for n = 1:num_iter y(n) = DivideBy * DivideByFactor; y_mag = abs(y(n)); err(n) = ref - y_mag; DivideByFactor_time(n) = DivideByFactor ; DivideByFactor = DivideByFactor +mu*err(n); end 

Tieši tā! Vai sadaliet 12 koda līnijas bez dalīšanas operatora. Šis algoritms ir iegūts no adaptīvā vai automātiskā pastiprinājuma vadības algoritma (AGC), ko izmanto, lai saglabātu noteiktu amplitūdu pie sistēmas izvades, neskatoties uz izmaiņām amplitūdā sistēmas ieejā. Piemēram, audio sistēmā AGC var samazināt skaļumu, ja signāls kļūst pārāk liels un palielinās, ja signāls kļūst pārāk mazs.

Digitālajā jomā sistēmas diagramma ir redzama 1. attēlā. Mēģiniet garīgi uzzināt, kā katrs algoritma atkārtojums pārvieto paraugus ap cilpu.

1. attēls

AGC izmanto mazāko vidējo laukumu (LMS) algoritmu, lai atjauninātu svaru, ko sauc DivideByFactor šajā īstenošanā. Ko šis algoritms cenšas darīt, ir samazināt kļūdu starp izvadi (y (n)) un atsauci, kuru mēs iestatījām kā vienu. Atsauces signāls ir iestatīts uz vienu, lai DivideBy * DivideByFactor = 1 pēc algoritma konverģences. Par LMS algoritma tēmu var rakstīt veselas grāmatas, tāpēc es to glabošu īsā laikā. Apakšējā cilpas ķēdi var ierakstīt šādi:

$ $ DivideByFactor (n) = DivideByFactor (n-1) + \ mu (ref-y (n)) $ $

Šī rinda pamatā aizņem nelielus soļus uz numuru, kas samazina kļūdas termiņu:

$ $ err (n) = ref-y (n) $ $

Tas aizņem soli $ $ \ mu $ $ no kļūdas izslēgšanas no DivideByFactor (ko sākotnēji iestatījām kā 1 pirms iteratīvās cilpas). Ar pietiekamām pakāpēm tas perfekti saplūst līdz 1 / DivideBy, samazinot kļūdas termiņu līdz nullei procesā. Mu ir stabils tikai noteiktā diapazonā, kas ir ārpus šī raksta darbības jomas, taču, ja vēlaties turpināt to izpētīt, es sniegšu tālāk norādītās atsauces. Varat pārbaudīt, kā sistēma darbojas ar dažādām $ $ \ mu $ $ vērtībām, mainot $$ \ mu $$ parametru kodu. Veicot $ $ \ mu $ $ mazāku, jūs varat redzēt, ka tas prasa vairāk atkārtojumu, lai saplūstu ar DivideByFactor. Ja jūs veicat $ $ \ mu $ $ pārāk lielu, jūs redzēsiet, ka DivideByFactor atšķiras un nepārtraukti palielinās (nav labi).

Jūs varat noskatīties, ka DivideByFactor sasniedz vēlamo vērtību, iekļaujot šādu kodu, kas apzīmē DivideByFactor_time terminu pret katru iterāciju:

 plot((1:num_iter), DivideByFactor_time) hold on plot((1:num_iter), 1/DivideBy, 'color', 'r') axis((0 num_iter -0.05 1)) grid on 

Šajā piemērā esmu iestatījis DivideBy līdz 10 un uzzīmējis DivideByFactor_time pret katru iterāciju. Mēs ceram, ka tas tuvināsies 0, 10 punktam (punktēta sarkanā līnija), un mēs redzam, ka pēc pāris iterācijām tas diezgan labi tuvojas vēlamajai vērtībai. Ja mēs iestatām $ $ \ mu $$ uz kaut ko ļoti mazu, piemēram, 1/10 tās sākotnējās vērtības, mēs varam redzēt, ka vērtība, kas tuvojas vēlamajai vērtībai, aizņem daudz ilgāku laiku

Mēģiniet mainīt $ $ \ mu $$ uz kaut ko lielu un atzīmējiet to, kas notiek (iespējams, jums jāpaplašina x ass un y ass, lai skatītu tā darbību). Arī mēģiniet uzzīmēt kļūdu (n) pret iterācijām, lai skatītos, kā tas saskan ar 0!

Tā tas ir - iteratīvs sadalīšanas algoritms, kas balstīts uz automātisko guvumu kontroli. Ja jums nav Matlab, mēģiniet to izpildīt Octavā, kas ir atvērtā koda un gandrīz tāda pati kā Matlab valodā (atskaitot dažas funkcijas). Ja jūs nevēlaties lejupielādēt Octave, mēģiniet pārnest iepriekš minētos kodus savā iecienītākajā valodā un iekļaut to zemāk esošajos komentāros, lai citi varētu spēlēt! Ņemiet vērā, ka, ja jūs nesaņemat pareizās vērtības, jums, iespējams, ir jāpalielina iterāciju skaits!

Lai lasītu LMS algoritmā, pārbaudiet to.