2017-06-17, 21:00
  #1
Medlem
Tom.Of.Finlands avatar
Hej!

Enkel fråga!
Hur lägger man till brus i en ODE funktion när det kommer till MATLAB?

Antar att vi har detta system:
Citat:
function xdot=sys(t,X,K,A,B,a)
u = a-K*x + <- % Här ska brus läggas till;
xdot = A*x+B*u;
end

>> tspan = [0 10]
>> X = [0; 0]
>>[t,y]=ode45(@(t,x) sys(t,x, K, A,B,a),tspan,x);
>>plot(t,y)

Matriser:
A = 2x2, B = 2x1, x = 2x1, K = 1x2, a = konstant
Problemet är inte att jag inte vet hur man gör en brusvektor. För att skapa en bursvektor i MATLAB så skriver man:

Citat:
>> t = linspace(0,10)
>> noiseVector = P*randn(size(t))

Då får man en brusvektor som är slumpässigt normalt fördelad med P som är en skalär som fungerar som skalar upp bruset.

Fråga:
Hur applicerar jag vektorn noiseVector i funktionen sys ?
__________________
Senast redigerad av Tom.Of.Finland 2017-06-17 kl. 21:04.
Citera
2017-06-17, 21:48
  #2
Medlem
inneskos avatar
Citat:
Ursprungligen postat av Tom.Of.Finland
Hej!

Enkel fråga!
Hur lägger man till brus i en ODE funktion när det kommer till MATLAB?

Antar att vi har detta system:


Matriser:
A = 2x2, B = 2x1, x = 2x1, K = 1x2, a = konstant
Problemet är inte att jag inte vet hur man gör en brusvektor. För att skapa en bursvektor i MATLAB så skriver man:



Då får man en brusvektor som är slumpässigt normalt fördelad med P som är en skalär som fungerar som skalar upp bruset.

Fråga:
Hur applicerar jag vektorn noiseVector i funktionen sys ?

Att lägga på bruset där du vill gör du genom att skriva u = a - K*x + P*randn(1). Däremot så misstänker jag att detta inte är en speciellt bra idé eftersom ode45 är adaptiv.
Citera
2017-06-17, 22:13
  #3
Medlem
Tom.Of.Finlands avatar
Citat:
Ursprungligen postat av innesko
Att lägga på bruset där du vill gör du genom att skriva u = a - K*x + P*randn(1). Däremot så misstänker jag att detta inte är en speciellt bra idé eftersom ode45 är adaptiv.

Nej. Det fungerade inte.
ODE45 är en analog lösare, dvs tidskontinuerlig. Så man måste ha en bursvektor där tiden t i ODE45-funktionen, avgör vilket element från bursvektor som ska väljas. Problemet är att en brusvektor har diskreta element och tiden är analog.

nigga också!!!
Citera
2017-06-17, 22:43
  #4
Medlem
inneskos avatar
Citat:
Ursprungligen postat av Tom.Of.Finland
Nej. Det fungerade inte.
ODE45 är en analog lösare, dvs tidskontinuerlig. Så man måste ha en bursvektor där tiden t i ODE45-funktionen, avgör vilket element från bursvektor som ska väljas. Problemet är att en brusvektor har diskreta element och tiden är analog.

nigga också!!!

Jag vet inte vad du menar att den är analog/tidskontinuerlig, den är självfallet diskret i tiden precis som alla ode lösare är, det finns ingen annan typ av numerisk lösare. Problemet är att den är adaptiv, eftersom du lägger på ett slumpmässigt fel så kommer den göra tidssteget extremt litet över hela lösningsintervallet vilket kommer göra att det tar väldigt lång tid. Sedan så anpassas inte standardavvikelsen efter tidssteget på ett korrekt sätt heller, vilket gör att det går åt skogen. Du måste helt enkelt använda dig av någon annan lösare än ode45.
Citera
2017-06-17, 22:51
  #5
Medlem
Tom.Of.Finlands avatar
Citat:
Ursprungligen postat av innesko
Jag vet inte vad du menar att den är analog/tidskontinuerlig, den är självfallet diskret i tiden precis som alla ode lösare är, det finns ingen annan typ av numerisk lösare. Problemet är att den är adaptiv, eftersom du lägger på ett slumpmässigt fel så kommer den göra tidssteget extremt litet över hela lösningsintervallet vilket kommer göra att det tar väldigt lång tid. Sedan så anpassas inte standardavvikelsen efter tidssteget på ett korrekt sätt heller, vilket gör att det går åt skogen. Du måste helt enkelt använda dig av någon annan lösare än ode45.

Okej. ODE45 må vara diskret, men matematiken är analog.

Jag har hittat en lösare: lsim
Citera
2017-08-04, 18:53
  #6
Medlem
Opiumtal18s avatar
Citat:
Ursprungligen postat av innesko
Att lägga på bruset där du vill gör du genom att skriva u = a - K*x + P*randn(1). Däremot så misstänker jag att detta inte är en speciellt bra idé eftersom ode45 är adaptiv.

Hejsan, jag snår tråden lite men misstänker att det finns en del kunskap i den här träden för att kunna besvara en imo enklare fråga.

Vilken ODE ska man använda till system av diff. ekv som är first order linary diff eq?
Jag använder just nu ode45 till det och det verkar funka. ode15s funkar också men den är lite långsammare.

Jag skriver ner systemet lika gärna

ds/dt = −k1se + k2c
de/dt = −k1se + k2c + k3c
dc/dt = k1se − k2c − k3c
dp/dt = k3c



Har googlat som faen men hittar inget.
Citera
2017-08-04, 20:01
  #7
Medlem
Tom.Of.Finlands avatar
Citat:
Ursprungligen postat av Opiumtal18
Hejsan, jag snår tråden lite men misstänker att det finns en del kunskap i den här träden för att kunna besvara en imo enklare fråga.

Vilken ODE ska man använda till system av diff. ekv som är first order linary diff eq?
Jag använder just nu ode45 till det och det verkar funka. ode15s funkar också men den är lite långsammare.

Jag skriver ner systemet lika gärna

ds/dt = −k1se + k2c
de/dt = −k1se + k2c + k3c
dc/dt = k1se − k2c − k3c
dp/dt = k3c



Har googlat som faen men hittar inget.

I regel börjar man alltid med ODE45. Fungerar inte det så testa ODE23S. Men skit i ODE-lösare! Bygg en själv! Du har mer frihet över den då. Lyssna här!

Jag skulle rekommendera dig att bygga om detta till en tillståndsmodell och simulera detta med lsim från GNU Octave med kontrolpaketet "Control".

Jag skulle också rekommendera dig att bygga detta system. Detta är skrivet i C-kod.

Citat:
n = 1000; iterationer
dt = 0.1; sekunder
u = 10; Insignal t.ex. 10 volt
for(int i = 0; i < n; i++)
{
dx = A*x + B*u;
y[i] = C*x;
T[i] = t;
x = x + dx*t; // Uppdatera nästa tillstånd
}

Plotta sedan T och y.
Citera
2017-08-05, 17:09
  #8
Medlem
inneskos avatar
Citat:
Ursprungligen postat av Opiumtal18
Hejsan, jag snår tråden lite men misstänker att det finns en del kunskap i den här träden för att kunna besvara en imo enklare fråga.

Vilken ODE ska man använda till system av diff. ekv som är first order linary diff eq?
Jag använder just nu ode45 till det och det verkar funka. ode15s funkar också men den är lite långsammare.

Jag skriver ner systemet lika gärna

ds/dt = −k1se + k2c
de/dt = −k1se + k2c + k3c
dc/dt = k1se − k2c − k3c
dp/dt = k3c



Har googlat som faen men hittar inget.

Skillnaden på ode45 och ode15s är att ode45 bygger på en Runge Kutta metod, medan ode15s används för styva problem. Detta betyder ungefär att ode15s löser ett ekvationssystem i varje tidssteg, detta gör i regel att man får en stabilare lösning men det blir långsammare. Däremot att använda en ode45 på ett styvt problem kommer inte fungera bra, om den klarar av att lösa systemet korrekt så kommer den ha kortat ned tidssteget så mycket så att ode15s ändå kommer att vara snabbare än ode45.

Eftersom ode45 verkar fungera för dig så är det den du bör använda dig av.
Citera

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in