Sida 2 av 4
Re: Tidskontinuerlig matematisk modell i en mikrokontroller?
Postat: 30 juli 2017, 16:30:55
av Volvo740
lillahuset skrev:Vad hade du tänkt att använda för datatyper för beräkningarna? Heltal, flyttal? Hur långa.
Jag har tänkt att använda korta flyttal. Max 3 decimaler.
Hur många matematiska operationer blir det per loop?
Det blir en matematisk operation per loop. Filtret tar hand om bruset.
Addition, subtraktion, multiplikation, division, annat?
Det blir endast addition, subtraktion, multiplikation, transponat och invers(division i linjär algebra). Finns C++ bibliotek för detta.
Hur mycket data behandlar du per loop? Alltså hur många, låt oss kalla det "variabler", handlar det om? En matris MxN är MxN "variabler". Konstanter?
Ja.
\(F(t)\) är alltså
\(NxN\) matris. Det kommer max bli
\(10x10\) då
\(6x6\) så han man behandla en hydraulisk cylinder med fjäder och tämpare + massa med fjäder och dämpare + balk med fjäder och dämpare. Alltså 3-DOF system =
\(6x6\)
Edit: Jag förstår inte men det är ingen idé att du försöker förklara.
Du bör lära dig LQ-teknik om du vill hålla på med reglerteknik för flervariabla system. LQ-teknik används oftast inom robotik och rymdteknik. Men jag vill tillämpa detta i mitt egna hem då jag tycker PID-regulatorer är för mainstream.
Men frågan gäller:
Kan jag använda en tidskontinuerlig matematisk modell i en mikrokontroller?
Re: Tidskontinuerlig matematisk modell i en mikrokontroller?
Postat: 30 juli 2017, 16:48:19
av Volvo740
Greve Hamilton skrev:Volvo740 skrev:Vänta lite. Hur menar du? Måste jag använda en diskret modell eller tidskontiunerlig modell?
Jag menar att din metod i ditt ursprungliga inlägg i princip är rätt, men att det du har kommit fram till faktiskt är en tidsdiskret modell.
Jag föreslår att du sätter dig och labbar med detta i Matlab/Octave/IPython eller liknande innan du implementerar det på en mcu.
Jag är pro-master på Octave och har byggt många LQG regulatorer igenom endast matrisberäkningar.
Men jag håller inte med att du anser att jag har byggt en diskret matematisk modell. För det första är detta en linjär tidskontinuerlig matematisk tillståndsmodell:
\(\dot{x}(t) = Ax(t) + Bu(t)\)
\(y(t) = Cx(t) + Du(t)\)
För att göra om denna modell till en diskret modell som görs följande:
\(F = e^{At} = I + At + \frac{A^2t^2}{2!} + \frac{A^3t^3}{3!} + \frac{A^3t^4}{4!} + ... = {\sum_{k = 0}^{\infty }\frac{A^kt^k}{k!}}\)
Där
\(t\) bestäms som ett samplingsintervall
\(h\) och därmed:
\(F = e^{Ah}\)
För insignalerna:
\(G = \int_0^h e^{At}Bdt\)
Och därmed blir den diskreta modellen följande:
\(\dot{x}(k + 1) = Fx(k) + Gu(k)\)
\(y(k) = Cx(k) + Du(k)\)
Det
här är alltså en diskret matematisk linjär tillståndsmodell. Nackdelen är att det är mycket svårt att beräkna denna då symbolisk matematik krävs. Datorer är inte expert på hantera symboliska variabler då datorer vill oftast hålla sig abstrakta och exakta. Resultatet är att om
\(A\) är en
\(6x6\) matris så kan detta riskera att
\(F\) blir en enorm matrix, trots att
\(F\) är också en
\(6x6\) matris.
För det andra: Nej till Python och IPython. Dem är inte gjorda för att hålla på med matematiska beräkningar, trots att vissa grupper tjurar att göra om Python till ett universalt programmeringsspråk. C++ har gått samma väg och resultatet blev ett kladdigt språk.
Matlab och Octave är dem enda kandidaterna om man ska hålla på med matrisberäkningar. Allt annat kan fara åt skogen.
Tro mig. Jag har testat både R och Python för att lösa linjäralgebraiska problem och differentialekvationer. Resultatet är att man har fått skriva enormt mycket kod för att göra en addition av två matriser.
Re: Tidskontinuerlig matematisk modell i en mikrokontroller?
Postat: 30 juli 2017, 16:54:45
av Volvo740
lillahuset skrev:Och sedan i C på en PC om du ska implementera det i C på en MCU.
Jag kan använda Arduino? Det lär spara lite tid? Eller? Jag tänkte först använda Codesys i Raspberry Pi, men då insåg jag att Codesys har ett bibliotek för matrisberäkningar...som kostar 2500 kr. Då blev jag snål.
Dessutom är Raspberry Pi med Codesys rätt segt. Jag vill köra så snabbt som det går.
Re: Tidskontinuerlig matematisk modell i en mikrokontroller?
Postat: 30 juli 2017, 17:22:56
av hawkan
Du kan använda Arduino. Det är som en vanlig dator fast typ en miljon gånger långsammare för sådant här.
Vad är du specifikt ute efter när du nämner mikroprocessor? Vad är det för egenskap du är ute efter?
Vad jag fattar så är det en ODE-lösare du vill ha. Det finns till PC, börja där.
Börja med t ex octave och lös problemet där.
Gör om till C++ men håll dej på PC så länge. Funkar det bra, gå vidare.
Välj den snabbaste mikroprocessor med hårdvara för flyttal. Det är inte en Arduino Uno eller Mega.
Se om det går att få in ODE-lösaren och om den hinner med. Då är du nästan framme.
Re: Tidskontinuerlig matematisk modell i en mikrokontroller?
Postat: 30 juli 2017, 17:27:24
av lillahuset
Jag har tänkt att använda korta flyttal. Max 3 decimaler.
Läs på om flyttal och återkom.
Det blir en matematisk operation per loop. Filtret tar hand om bruset.
Jag menade +, -, *, / etc.
Det blir endast addition, subtraktion, multiplikation, transponat och invers(division i linjär algebra). Finns C++ bibliotek för detta.
Låter som om det kan bli väldigt många instruktioner per loop.
Ja. \(F(t)\) är alltså \(NxN\) matris. Det kommer max bli \(10x10\) då \(6x6\) så han man behandla en hydraulisk cylinder med fjäder och tämpare + massa med fjäder och dämpare + balk med fjäder och dämpare. Alltså 3-DOF system = \(6x6\)
Så hundra stycken alltså?
Du bör lära dig LQ-teknik om du vill hålla på med reglerteknik för flervariabla system. LQ-teknik används oftast inom robotik och rymdteknik. Men jag vill tillämpa detta i mitt egna hem då jag tycker PID-regulatorer är för mainstream.
Det blir nog bra ska du se. Folk roar sig på de konstigaste sätt. Och reglerteknik är inget jag tänker roa mig med.
Men frågan gäller:
Kan jag använda en tidskontinuerlig matematisk modell i en mikrokontroller?
Det borde väl du kunna svara på som gillar och har läst reglerteknik. Jag har ingen aning.
Re: Tidskontinuerlig matematisk modell i en mikrokontroller?
Postat: 30 juli 2017, 17:28:52
av lillahuset
Lyssna på hawkans råd. Han verkar veta vad han pratar om.
Re: Tidskontinuerlig matematisk modell i en mikrokontroller?
Postat: 30 juli 2017, 17:32:16
av Mr Andersson
Körde just en test i atmels avr-simulator. En enda floating point multiplikation är strax över 160 instruktioner. En division är över 500 st.
Valfri ARM med hårdvaru-FPU skulle vara avsevärt mycket bättre än en arduino. De kostar inte heller speciellt många kronor mer.
Re: Tidskontinuerlig matematisk modell i en mikrokontroller?
Postat: 30 juli 2017, 17:34:33
av Greve Hamilton
Volvo740 skrev:
Jag är pro-master på Octave och har byggt många LQG regulatorer igenom endast matrisberäkningar.
Men jag håller inte med att du anser att jag har byggt en diskret matematisk modell. För det första är detta en linjär tidskontinuerlig matematisk tillståndsmodell:
\(\dot{x}(t) = Ax(t) + Bu(t)\)
\(y(t) = Cx(t) + Du(t)\)
För att göra om denna modell till en diskret modell som görs följande:
\(F = e^{At} = I + At + \frac{A^2t^2}{2!} + \frac{A^3t^3}{3!} + \frac{A^3t^4}{4!} + ... = {\sum_{k = 0}^{\infty }\frac{A^kt^k}{k!}}\)
Där \(t\) bestäms som ett samplingsintervall \(h\) och därmed:
\(F = e^{Ah}\)
För insignalerna:
\(G = \int_0^h e^{At}Bdt\)
Nu ska jag erkänna att det var ett tag sedan jag höll på med sådant här, men det du här beskriver är väl vad man kallar exakt diskretisering under antagandet att insignalen är konstant mellan tidpunkterna för sampling. Som du säger kan det bli stökiga matriser, men du kan ju alltid testa att trunkera matrisexponenten och bara använda första ordningen termer I+At. Eventuellt är det även möjligt att egenvärdesfaktorisera
\(A=Q\Lambda Q^{-1}\) och sedan substituera
\(z=Q^{-1}x\). Eftersom
\(\Lambda\) är diagonal så blir matrisexponenten enkel.
Volvo740 skrev:
Och därmed blir den diskreta modellen följande:
\(\dot{x}(k + 1) = Fx(k) + Gu(k)\)
\(y(k) = Cx(k) + Du(k)\)
Det här är alltså en diskret matematisk linjär tillståndsmodell....
Nja, ta bort pricken på x:et så är det rätt. Då har du samma form som jag skrev förut men med
\(F(x_k,u_k) = Fx_k+Gu_k\). Varför är det fel menar du?
Re: Tidskontinuerlig matematisk modell i en mikrokontroller?
Postat: 30 juli 2017, 17:51:06
av Volvo740
hawkan skrev:Du kan använda Arduino. Det är som en vanlig dator fast typ en miljon gånger långsammare för sådant här.
Fördelen med en Arduino är att den har I/O-pinnar, vilket inte en PC har
Vad är du specifikt ute efter när du nämner mikroprocessor? Vad är det för egenskap du är ute efter?
Jag ska reglera mekanik
Vad jag fattar så är det en ODE-lösare du vill ha. Det finns till PC, börja där.
Jag ska implementera en regulator i en Arduino.
Börja med t ex octave och lös problemet där.
Jag kan Octave redan.
Gör om till C++ men håll dej på PC så länge. Funkar det bra, gå vidare.
Inga I/O pinnar.
Välj den snabbaste mikroprocessor med hårdvara för flyttal. Det är inte en Arduino Uno eller Mega.
Se om det går att få in ODE-lösaren och om den hinner med. Då är du nästan framme.
Jag har en Raspberry Pi B+ och en Arduino UNO och Arduino Mega.
Re: Tidskontinuerlig matematisk modell i en mikrokontroller?
Postat: 30 juli 2017, 17:53:55
av Volvo740
lillahuset skrev:
Läs på om flyttal och återkom.
Så en mikrokontroller kan inte hantera 0.45?
Låter som om det kan bli väldigt många instruktioner per loop.
Det finns väll C++ bibliotek för Arduino?
Så hundra stycken alltså?
Nej. Kansk 20.
Det borde väl du kunna svara på som gillar och har läst reglerteknik. Jag har ingen aning.
Jag har aldrig byggt ett reglersystem med en Arduino. Jag simulerar för det mesta.
Re: Tidskontinuerlig matematisk modell i en mikrokontroller?
Postat: 30 juli 2017, 17:55:44
av Volvo740
Mr Andersson skrev:Körde just en test i atmels avr-simulator. En enda floating point multiplikation är strax över 160 instruktioner. En division är över 500 st.
Valfri ARM med hårdvaru-FPU skulle vara avsevärt mycket bättre än en arduino. De kostar inte heller speciellt många kronor mer.
Jag förstår inte vad du menar med floating point. Är det maximala decimallängd?
Eller max gånger man kan dividera?
Jag har en Raspberry Pi B+ hemma här.
Re: Tidskontinuerlig matematisk modell i en mikrokontroller?
Postat: 30 juli 2017, 18:02:23
av Volvo740
Greve Hamilton skrev:
Nja, ta bort pricken på x:et så är det rätt. Då har du samma form som jag skrev förut men med \(F(x_k,u_k) = Fx_k+Gu_k\). Varför är det fel menar du?
Glömde pricken. Jag kopierade bara.
Problemet är att jag vill inte använda en diskret matematisk modell då jag tycker det är onödigt och dåligt samt svårt. Varför ska man ha en diskret matematisk modell när man kan egentligen köra istället med mycket kort sampling t.ex. 0.0001 sekunder?
Många jag har pratat med uppmanar mig att välja diskreta modeller om jag ska implementera en regulator i en mikrokontroller, men de kan inte förklara varför jag måste ha en diskret modell. Det är som det vore en norm från 50-talet att använda diskreta modeller.
Jag kan simulera en tidskontinuerlig ODE (Ordinär Differentialekvation) med hjälp av en for-loop i C. Inga problem alls!
Kod: Markera allt
u = 10;
for(int i = 0; i < 100; i++)
{
dx = A*x + B*u;
y[i] = C*x;
T[i] = t;
x = x + dx*t; // Uppdatera nästa tillstånd
}
Där t är samplingstiden och y
kan nu plottas över tiden T.
Re: Tidskontinuerlig matematisk modell i en mikrokontroller?
Postat: 30 juli 2017, 18:28:02
av lillahuset
Volvo740: Sluta sprattla och bjud till istället.
Flyttal:
https://en.wikipedia.org/wiki/IEEE_754
Arduino: Extremt långsam för flyttal.
PC: Endast avsedd för simulering och felsökning av algoritm.
Om du skulle gissa, dra till med något bara, hur många cykler i en AVR tror du att din ODE i inlägget ovanför tar att räkna? Ta i ordentligt.
Hur många instruktioner har du tillgängliga för varje sampel? Jo, i bästa fall 16E6 * 1E-4 = 16E2, dvs 1600. Nu är ju inte alla encykels så räkna med 1200.
Hur många blir det per loop?
Re: Tidskontinuerlig matematisk modell i en mikrokontroller?
Postat: 30 juli 2017, 18:47:29
av Greve Hamilton
Volvo740 skrev:Greve Hamilton skrev:
Nja, ta bort pricken på x:et så är det rätt. Då har du samma form som jag skrev förut men med \(F(x_k,u_k) = Fx_k+Gu_k\). Varför är det fel menar du?
Glömde pricken. Jag kopierade bara.
Problemet är att jag vill inte använda en diskret matematisk modell då jag tycker det är onödigt och dåligt samt svårt. Varför ska man ha en diskret matematisk modell när man kan egentligen köra istället med mycket kort sampling t.ex. 0.0001 sekunder?
Många jag har pratat med uppmanar mig att välja diskreta modeller om jag ska implementera en regulator i en mikrokontroller, men de kan inte förklara varför jag måste ha en diskret modell. Det är som det vore en norm från 50-talet att använda diskreta modeller.
Jag kan simulera en tidskontinuerlig ODE (Ordinär Differentialekvation) med hjälp av en for-loop i C. Inga problem alls!
Kod: Markera allt
u = 10;
for(int i = 0; i < 100; i++)
{
dx = A*x + B*u;
y[i] = C*x;
T[i] = t;
x = x + dx*t; // Uppdatera nästa tillstånd
}
Där t är samplingstiden och y
kan nu plottas över tiden T.
OK, jag tror att vi pratar förbi varandra. Jag fortsätter dock hävda att så fort ett dt är inblandat så har du att göra med ett tidsdiskret system. Oavsett hur litet det är. Ditt kodexempel implementerar på sista raden just den diskretisering jag beskrev först.
MEN, det är ju så att ju mindre dt desto mer likt blir det diskreta systemet det kontinuerliga. Så om du vill kalla din metod med litet dt för kontinuerlig så låt inte mig hindra dig.
Re: Tidskontinuerlig matematisk modell i en mikrokontroller?
Postat: 30 juli 2017, 19:05:34
av Volvo740
lillahuset skrev:Volvo740: Sluta sprattla och bjud till istället.
Flyttal:
https://en.wikipedia.org/wiki/IEEE_754
Arduino: Extremt långsam för flyttal.
PC: Endast avsedd för simulering och felsökning av algoritm.
Om du skulle gissa, dra till med något bara, hur många cykler i en AVR tror du att din ODE i inlägget ovanför tar att räkna? Ta i ordentligt.
Hur många instruktioner har du tillgängliga för varje sampel? Jo, i bästa fall 16E6 * 1E-4 = 16E2, dvs 1600. Nu är ju inte alla encykels så räkna med 1200.
Hur många blir det per loop?
Med två matriser
\(A = \in \Re ^{n x n}\) och
\(B = \in \Re ^{n x n}\) samt en vektor
\(v = \in \Re ^{n}\) så blir det följande antal matematiska operationer:
\(A + B\) =
\(nxn\) operationer
\(AxB\) =
\(nxn\) operationer
\(Axv\) =
\(nxn\) operationer. Dock så resulterar
\(Axv\) en ny vektor.
Så:
\(AxAxAxAxAxA\) =
\(6(nxn)\) operationer
Om vi nu säger att
\(n = 6\) så innebär det att vi får
\(6x36 = 216\) operationer per rad i en loop.
Så då är det mycket. Då kanske jag ska titta på min Raspberry Pi istället?