Mindmapper skrev:Intressant att höra hur ofta du går in och optimerar om din adaptiva regulator?
Har själv ingen aning om hur snabbt man kan behöva göra det vid snabba processer. Intressant att höra både i det program som du håller på med nu. Samt vid en process där du har behov av en extremt snabb uppdatering av optimeringen!
jesse skrev:Jag begriper inte hur
kvadratisk programmering fungerar, och orkar inte heller läsa om det då jag inte orkar med de matematiska uttrycken. Diskret matematik var det jag var sämst på att begripa... Jag fattar fortfarande inte hur det kan tillämpas. Men jag tänkte fråga dig,
AlBundy, vad det är för egenskaper hos kvadratisk programmering som krävs för dina beräkningar och på vilket vis det skiljer sig från enklare regulatorer (som t.ex. PID) ?
Exempelvis det där med fjädringen.... Har du jämfört resultatet med hur en enklare algoritm hade löst problemet? Jag tycker om matematik, men vid en viss nivå så slutar min hjärna att fungera. När det gäller numeriska metoder (alltså hur man med hjälp av dator kan beräkna olika saker) så brukar jag hitta på mina egna eftersom jag ofta förstår grundproblemet bättre än andras invecklade förklaringar.
Personligen tycker jag det är enklast att lösa matematiska problem med C-kod , allt annat är mest krångel.
Jag kan förklara kvadratisk programmering på en förenklad nivå. Låt oss säga att vi har en variabel T som är våran temperaturvariabel över tid. Vi har våran R som är en referens. Dit vill vi nå. Om R == T så har vi uppnått vårat mål. Vi har våran önskade temperatur. Men vårat system som tillverkar denna temperatur, drivs av energin U. Vi kan säga att U är t.ex. strömmen in till en doppvärmare eller värmeelement.
Om vi jämför energin in och energin ut så får vi skillnaden U - T. Om U - T = 0 så betyder det att vi har ett väldigt effektivt system som inte har några förluster. Systemet kan tolkas då som statiskt då det är dynamiken som orsakar förluster. I praktiken sker detta aldrig.
I praktiken så ser det mer ut som så här (R-T) - U. Om (R-T) - U = 0 så har vi ett perfekt system. I verkligheten så kommer (R-T) - U aldrig vara noll för T är beroende av U. Tänk nu om vi har en matematisk modell av vårat system och sedan simulerar vi vårat system med olika U = {0,1,2,3,4,5,6,7,8....1023} över t.ex. 10 sekunder. Då kommer vi få 1024 olika variabler av U och T som varierar över tid. Vi sätter in dem formler:
J0 = (R-T0) - U0;
J1 = (R-T1) - U1;
J2 = (R-T2) - U2;
J3 = (R-T3) - U3;
J4 = (R-T4) - U4;
.
.
.
.
J1023 = (R-T1023) - U1023;
Här betyder det att t.ex U4 är {4,4,4,4,4,4,4,4,4,4,4,4,4,4,4} över hela simuleringstiden 10 sekunder. Nu har vi alla J0 till J1023. Nu kollar vi vilken J som är minst. Om vi hittar att J75 är minst så vet vi vilken som är den bästa signalen.
Då applicerar vi signal U75 i en itteration hos CPU:n och sedan gör vi samma beräkning igen. Därför krävs det MYCKET processorkraft om man ska använda kvadratisk programmering då hålla på simulera över 1000 gånger är ännu mera krävande. Med kavadratisk programmering så är tänket fortfarande det samma.
Men jag tänkte fråga dig, AlBundy, vad det är för egenskaper hos kvadratisk programmering som krävs för dina beräkningar och på vilket vis det skiljer sig från enklare regulatorer (som t.ex. PID) ?
Med kvadratisk programmering kan man sätta gränser i systemet att man kan t.ex. inte "köra så fort upp" eller "man kan inte passera dessa insignalsvärden". Randvillkor eller signalmättningar som det heter.
En PID kräver att du hittar P,I,D värderna. En regulator med kvadratisk programmering kräver endast att du talar om hur mycket data den ska beräkna. Sådant höftar man bara till t.ex. 20 sekunder i framtiden ska regulatorn förutspå. Då räknar regulatorn och tar hänsyn till t.ex. dötider och begränsingar och sedan spottar den ut ett värde som du ska ha.
Notera att regulatorer med kvadratisk programmering är riktigt dyra. Men ska man ha ett optimerat system så duger inte en PID.
Exempelvis det där med fjädringen.... Har du jämfört resultatet med hur en enklare algoritm hade löst problemet? Jag tycker om matematik, men vid en viss nivå så slutar min hjärna att fungera. När det gäller numeriska metoder (alltså hur man med hjälp av dator kan beräkna olika saker) så brukar jag hitta på mina egna eftersom jag ofta förstår grundproblemet bättre än andras invecklade förklaringar.
Med enklare algoritm så hade jag fått överskjut och den inte kan ta hänsyn till fördröjning. Skit i matematik. Lär dig att läsa vetenskapliga rapporter och istället. Det viktigaste är att man förstår tanken bakom varför man gör detta, inte att man ska förstå exakt varje formel. Linjär algebra är ett måste att förstå. Men det är bara veta vad man gör, inte hur man med papper och penna räknar ut det.
Personligen tycker jag det är enklast att lösa matematiska problem med C-kod , allt annat är mest krångel.
Lycka till med kvadratisk programmering med C. Du kan väll titta på GNU Scentific library. Jag föredrar högnivåspråk.
Och det problem du jobbar på nu, är väl hemligt antar jag, men vad är det du behöver göra, rent praktiskt? Varför en långsam PWM? Vad ska regleras? Hur många insignaler handlar det om? Är det bara en utsignal (PWM)?
Rent praktiskt så ska jag använda min STM32 som ska fungera som en I/O modul. Denna modul ska ha UART kommunikation med en PC. STM:en ska även läsa temperatur som skickas till datorn. Datorn ska beräkna temperaturen i en matematisk modell och sedan spotta ut ett värde och ge den till STM:en via UART och STM:en ska ändra "PWM:en". I detta fall så ändras bara ett värde.
Det ska vara 3 stycken utgångar som ska "pulseras".