Vinnaren i pepparkakshustävlingen!
  • 1
  • 2
2010-12-27, 17:25
  #13
Medlem
tourniquets avatar
Citat:
Ursprungligen postat av evolute
Jag vill använda quad och quad tar bara in skalärer (double på matlabspråk) som integrationsgränser. Därför måste jag iterera över alla integrationsgränserna i vektorn b för att använda quad på varje b(i).


Okej, då klarnade det till lite. Själva funktionen är på gränsen till överkurs då jag inte behandlat sannolikhetslära alls. Men själva programmet verkade inte vara så svårt att få häng på. Har inte fått se så många bra exempel på hur man löser liknande problem så varje lösningsgång betyder en hel del nu, så man har något att relatera till. Har boken Matlab för Engineers, men den har inte varit till speciellt stor hjälp ännu. Eftersom exemplen som framgår i boken är lite svåra att anknyta till mina uppgifter. Men tack för hjälpen ändå.
Citera
2010-12-27, 17:30
  #14
Medlem
evolutes avatar
Citat:
Ursprungligen postat av tourniquet
Okej, då klarnade det till lite. Själva funktionen är på gränsen till överkurs då jag inte behandlat sannolikhetslära alls. Men själva programmet verkade inte vara så svårt att få häng på. Har inte fått se så många bra exempel på hur man löser liknande problem så varje lösningsgång betyder en hel del nu, så man har något att relatera till. Har boken Matlab för Engineers, men den har inte varit till speciellt stor hjälp ännu. Eftersom exemplen som framgår i boken är lite svåra att anknyta till mina uppgifter. Men tack för hjälpen ändå.

Mitt bästa tips är ändå MATLAB-hjälpen, endera den inbyggda eller på deras hemsida. Programmeringsmässigt är MATLAB så enkelt det kan bli så det som man oftast vill ha hjälp med är syntax och hur man gör vissa specialgrejer, skickar med parametrar till funktioner eller skapar filmer exempelvis.
Citera
2010-12-28, 14:41
  #15
Medlem
tourniquets avatar
Följande funktionsfil ska ha fyra inargument. Funktionshandtag f, vektor I med slut och startvärde på intervallet, samt en variabel med ett begynnelsevärde t0 och en variabel N med antal delintervall.


Kod:
function [t,U]=minprim(?,?,?,?)
NrIn=nargin; 
if NrIn==? 
elseif NrIn=?
N=100;
else
error(’Wrong number of input arguments!’)
end
U=zeros(1,N+1); 

k=? steglängden.
t=? Vektor med alla t_n
U(1)=U(0);
for k=2:?
U(?)=U(?)+k*f(?);
end

Låt oss säga att vi ska lösa

u′(x) = x^2, x [0, 2],
u(0) = 3,

Jag gjorde insättningarna:

Kod:
function [t,U]=minprim(f,I,t0,N)
NrIn=nargin; 
if NrIn==4
elseif NrIn=4
N=100;
else
error(’Wrong number of input arguments!’)
end
U=zeros(1,N+1); 

k=2/100
t=0:0.02:(2-0.02)
U(1)=U(0)=t0;
for k=2:length(k)
U(n)=U(n-1)+k*f(n-1);
end


Skrev in i prompten minprim(@(t) t.^2,0:2,3,100)

Är lite halvknasigt gjort. Förstår inte riktigt hur jag ska behandla inargumentet I, är resten korrekt?

Och vad gör raden U=zeros(1,N+1) ???

När jag körde programmet så skrev den ut vektorn t bara, men fick inget svar alls.
Citera
2010-12-28, 15:18
  #16
Medlem
evolutes avatar
Här är mitt förslag.
Kod:
function [t,u]=minprim(f,t_int,u0,n)
NrIn=nargin;
if NrIn==3
    n = 100;
elseif NrIn==4;
else
    error('Wrong number of input arguments!');
    return
end
u = zeros(1,n+1);

k = diff(t_int)/n;
t = t_int(1):k:t_int(2);
u(1) = u0;
for i = 2:n+1
    u(i) = u(i-1)+k*f(t(i-1));
end

Argumenthanteringen är inte perfekt utan den ser bara till att man får ett felmeddelande vid 2 eller färre argument. Vid tre argument antas att det bara är n som saknas och man sätter n = 100. Vid fyra argument händer ingenting.

Sen skapar du en tom 1 x n+1 vektor u som är full av nollor. Denna rad behövs egentligen inte om det inte ligger någon annan gammal u som skräpar. Sedan är k helt enkelt intervall-längden delat med antalet intervall. Notera att man för n intervall har n+1 punkter. Man skapar t-vektorn som då också får n+1 punkter från intervallets start till dess slut. Begynnelsevärdet sätts in i u-vektorns första position.

For-satsen räknar ut funktionsvärdet i nästa punkt utgående från den föregående enligt derivatans definition
f(x+h) = f(x) + h*f'(x) eller u(i) = u(i-1) + k*f(t(i-1)).
Här finns andra varianter för att öka/ändra stabiliteten på algoritmen, man kan köra backwards exempelvis men det är sånt ni kanske tar upp i numerisk analys sen.

Man kallar sedan funktionen med
[t,u]=minprim(@(t) t.^2,[0 2],3,100);
Citera
2010-12-28, 16:37
  #17
Medlem
tourniquets avatar
Okej det fungera finfint. Men jag förstår inte på mig

for i = 2:n+1
u(i) = u(i-1)+k*f(t(i-1));

Uttrycket inne i paranteserna ska ju svara mot steglängden k. För mig ser det ut som att u(i) och u(i-1) får in heltal som står för vilket delintervall man är inne på. Borde man inte stoppa in det egentliga värdet på t-axeln?
Citera
2010-12-28, 16:53
  #18
Medlem
evolutes avatar
Citat:
Ursprungligen postat av tourniquet
Okej det fungera finfint. Men jag förstår inte på mig

for i = 2:n+1
u(i) = u(i-1)+k*f(t(i-1));

Uttrycket inne i paranteserna ska ju svara mot steglängden k. För mig ser det ut som att u(i) och u(i-1) får in heltal som står för vilket delintervall man är inne på. Borde man inte stoppa in det egentliga värdet på t-axeln?

Hela poängen är ju att man diskretiserar tiden så att man löser differentialekvationen genom att hoppa från t1 till t2 till t3 till... Om man nu gör steget mellan dessa ti tillräckligt liten borde den numeriska approximativa lösningen vara nära den verkliga.

Du verkar ha missförstått vad u är. Det är bara en vektor och u(i) betecknar bara den i:te komponenten av den vektorn. I det här fallet svarar u(i) mot tiden t(i). Alltså är i ett heltal som bestämmer vilken tid vi är vid, t(i), och vad funktionsvärdet är i den punkten, u(i). Däremot är f en funktion som tar in ett tidsvärde t och ger f(t).
Citera
2010-12-28, 18:40
  #19
Medlem
tourniquets avatar
Citat:
Ursprungligen postat av evolute
Hela poängen är ju att man diskretiserar tiden så att man löser differentialekvationen genom att hoppa från t1 till t2 till t3 till... Om man nu gör steget mellan dessa ti tillräckligt liten borde den numeriska approximativa lösningen vara nära den verkliga.

Du verkar ha missförstått vad u är. Det är bara en vektor och u(i) betecknar bara den i:te komponenten av den vektorn. I det här fallet svarar u(i) mot tiden t(i). Alltså är i ett heltal som bestämmer vilken tid vi är vid, t(i), och vad funktionsvärdet är i den punkten, u(i). Däremot är f en funktion som tar in ett tidsvärde t och ger f(t).

Okej jag tror jag är med nu. Om man nu ska lösa detta med ode45.m. Så ska man bara göra en liten ändring. Jag har försökt lite själv nu.

Vi har:

[TOUT,YOUT] = ODE45(ODEFUN,TSPAN,Y0)

odefun är ju våran funktion, i detta fall x^2
tspan är väl t_int?
Och yo vårt startvärde u0.

Men vad händer nu med n? Har inte lyckats göra om den...ska försöka lite till, känns som om det borde vara något lätt.

I hjälptexten så står det ju att man har en indelning, självklart då man använder sig av TSPAN. Så då måste man uttrycka själva indelningen med t.ex. n. Som vi gjorde innan. Men enligt hjälptexten så finns inte indelning med som något inargument.

__________________
Senast redigerad av tourniquet 2010-12-28 kl. 18:53.
Citera
2010-12-28, 19:26
  #20
Medlem
evolutes avatar
Ode45 som bara är en av MATLABs inbyggda DE-solvers använder mycket mer avancerade algoritmer (någon typ av Runge Kutta) där steglängden inte är konstant och beror på funktionen ODEFUNs utseende. Varierar den snabbt i ett intervall minskar steglängden och vice versa.

Istället för att kontrollera antalet steg så kan du genom strukturen options kontrollera ett antal andra parametrar. För dig lär de viktiga vara
InitialStep: första steget som algoritmen gissar
MaxStep: ett största steg som du tillåter att algoritmen tar (så att den inte av händelse missar små små variationer)
RelTol: maximala relativa felet i lösningen
AbsTol: maximala absoluta felet i lösningen
I en första approximation är det väl reltol som är mest relevant. Sätter du den lågt tvingar du algoritmen att välja mindre steg.

Kolla Help ODESET om du vill lära dig mer.
Citera
2011-06-01, 16:11
  #21
Medlem
tourniquets avatar
Återupplivar denna tråd. Dags för fler matlab-uppgifter!

Är inte alls bra på det. Och vill ha lite hjälp.


Ska färdigställa ett program som ska lösa ODE av första graden. Med hjälp av Eulers framåtmetod.

Fyra inargument

funktion (f)
Vektor med start och slutvärde
Begynnelsevärde (U0)
Antal delintervall (N)


Citat:
function [t,U]=minPrim(?,?,?,?)
%Vi b¨orjar testa antalet inargument och till°ater anv¨andaren
%att inte bry sig om hur m°anga delintervall det ska vara.
NrIn=nargin; %Returnerar antalet inargument som anv¨andaren angett.
if NrIn==? %G¨or ingenting
elseif NrIn=?
N=100;
else
error(’Wrong number of input arguments!’)
end
U=zeros(1,N+1); %Programmet blir snabbare om vi skapar en
%vektor som har r¨att storlek innan vi b¨orjar
%loopa.
k=? %stegl¨angden.
t=? %Vektor med alla t_n
U(1)=U0;
for k=2:?
U(?)=U(?)+k*f(?);
end


exempeluppgift

lös

u'= x^2

u0=3

x [0,2]
Citera
  • 1
  • 2

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback