• 1
  • 2
2010-12-27, 17:25
  #13
Medlem
tourniquets avatar
Citat:
Ursprungligen postat av evolute
Jag vill anvnda quad och quad tar bara in skalrer (double p matlabsprk) som integrationsgrnser. Drfr mste jag iterera ver alla integrationsgrnserna i vektorn b fr att anvnda quad p varje b(i).


Okej, d klarnade det till lite. Sjlva funktionen r p grnsen till verkurs d jag inte behandlat sannolikhetslra alls. Men sjlva programmet verkade inte vara s svrt att f hng p. Har inte ftt se s mnga bra exempel p hur man lser liknande problem s varje lsningsgng betyder en hel del nu, s man har ngot att relatera till. Har boken Matlab fr Engineers, men den har inte varit till speciellt stor hjlp nnu. Eftersom exemplen som framgr i boken r lite svra att anknyta till mina uppgifter. Men tack fr hjlpen nd.
Citera
2010-12-27, 17:30
  #14
Medlem
evolutes avatar
Citat:
Ursprungligen postat av tourniquet
Okej, d klarnade det till lite. Sjlva funktionen r p grnsen till verkurs d jag inte behandlat sannolikhetslra alls. Men sjlva programmet verkade inte vara s svrt att f hng p. Har inte ftt se s mnga bra exempel p hur man lser liknande problem s varje lsningsgng betyder en hel del nu, s man har ngot att relatera till. Har boken Matlab fr Engineers, men den har inte varit till speciellt stor hjlp nnu. Eftersom exemplen som framgr i boken r lite svra att anknyta till mina uppgifter. Men tack fr hjlpen nd.

Mitt bsta tips r nd MATLAB-hjlpen, endera den inbyggda eller p deras hemsida. Programmeringsmssigt r MATLAB s enkelt det kan bli s det som man oftast vill ha hjlp med r syntax och hur man gr vissa specialgrejer, skickar med parametrar till funktioner eller skapar filmer exempelvis.
Citera
2010-12-28, 14:41
  #15
Medlem
tourniquets avatar
Fljande funktionsfil ska ha fyra inargument. Funktionshandtag f, vektor I med slut och startvrde p intervallet, samt en variabel med ett begynnelsevrde 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=? steglngden.
t=? Vektor med alla t_n
U(1)=U(0);
for k=2:?
U(?)=U(?)+k*f(?);
end

Lt oss sga att vi ska lsa

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

Jag gjorde insttningarna:

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. Frstr inte riktigt hur jag ska behandla inargumentet I, r resten korrekt?

Och vad gr raden U=zeros(1,N+1) ???

Nr jag krde programmet s skrev den ut vektorn t bara, men fick inget svar alls.
Citera
2010-12-28, 15:18
  #16
Medlem
evolutes avatar
Hr r mitt frslag.
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 fr ett felmeddelande vid 2 eller frre argument. Vid tre argument antas att det bara r n som saknas och man stter n = 100. Vid fyra argument hnder ingenting.

Sen skapar du en tom 1 x n+1 vektor u som r full av nollor. Denna rad behvs egentligen inte om det inte ligger ngon annan gammal u som skrpar. Sedan r k helt enkelt intervall-lngden delat med antalet intervall. Notera att man fr n intervall har n+1 punkter. Man skapar t-vektorn som d ocks fr n+1 punkter frn intervallets start till dess slut. Begynnelsevrdet stts in i u-vektorns frsta position.

For-satsen rknar ut funktionsvrdet i nsta punkt utgende frn den fregende enligt derivatans definition
f(x+h) = f(x) + h*f'(x) eller u(i) = u(i-1) + k*f(t(i-1)).
Hr finns andra varianter fr att ka/ndra stabiliteten p algoritmen, man kan kra backwards exempelvis men det r snt 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 frstr 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 steglngden k. Fr mig ser det ut som att u(i) och u(i-1) fr in heltal som str fr vilket delintervall man r inne p. Borde man inte stoppa in det egentliga vrdet p t-axeln?
Citera
2010-12-28, 16:53
  #18
Medlem
evolutes avatar
Citat:
Ursprungligen postat av tourniquet
Okej det fungera finfint. Men jag frstr 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 steglngden k. Fr mig ser det ut som att u(i) och u(i-1) fr in heltal som str fr vilket delintervall man r inne p. Borde man inte stoppa in det egentliga vrdet p t-axeln?

Hela pongen r ju att man diskretiserar tiden s att man lser differentialekvationen genom att hoppa frn t1 till t2 till t3 till... Om man nu gr steget mellan dessa ti tillrckligt liten borde den numeriska approximativa lsningen vara nra den verkliga.

Du verkar ha missfrsttt vad u r. Det r bara en vektor och u(i) betecknar bara den i:te komponenten av den vektorn. I det hr fallet svarar u(i) mot tiden t(i). Allts r i ett heltal som bestmmer vilken tid vi r vid, t(i), och vad funktionsvrdet r i den punkten, u(i). Dremot r f en funktion som tar in ett tidsvrde t och ger f(t).
Citera
2010-12-28, 18:40
  #19
Medlem
tourniquets avatar
Citat:
Ursprungligen postat av evolute
Hela pongen r ju att man diskretiserar tiden s att man lser differentialekvationen genom att hoppa frn t1 till t2 till t3 till... Om man nu gr steget mellan dessa ti tillrckligt liten borde den numeriska approximativa lsningen vara nra den verkliga.

Du verkar ha missfrsttt vad u r. Det r bara en vektor och u(i) betecknar bara den i:te komponenten av den vektorn. I det hr fallet svarar u(i) mot tiden t(i). Allts r i ett heltal som bestmmer vilken tid vi r vid, t(i), och vad funktionsvrdet r i den punkten, u(i). Dremot r f en funktion som tar in ett tidsvrde t och ger f(t).

Okej jag tror jag r med nu. Om man nu ska lsa detta med ode45.m. S ska man bara gra en liten ndring. Jag har frskt lite sjlv nu.

Vi har:

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

odefun r ju vran funktion, i detta fall x^2
tspan r vl t_int?
Och yo vrt startvrde u0.

Men vad hnder nu med n? Har inte lyckats gra om den...ska frska lite till, knns som om det borde vara ngot ltt.

I hjlptexten s str det ju att man har en indelning, sjlvklart d man anvnder sig av TSPAN. S d mste man uttrycka sjlva indelningen med t.ex. n. Som vi gjorde innan. Men enligt hjlptexten s finns inte indelning med som ngot 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 anvnder mycket mer avancerade algoritmer (ngon typ av Runge Kutta) dr steglngden inte r konstant och beror p funktionen ODEFUNs utseende. Varierar den snabbt i ett intervall minskar steglngden och vice versa.

Istllet fr att kontrollera antalet steg s kan du genom strukturen options kontrollera ett antal andra parametrar. Fr dig lr de viktiga vara
InitialStep: frsta steget som algoritmen gissar
MaxStep: ett strsta steg som du tillter att algoritmen tar (s att den inte av hndelse missar sm sm variationer)
RelTol: maximala relativa felet i lsningen
AbsTol: maximala absoluta felet i lsningen
I en frsta approximation r det vl reltol som r mest relevant. Stter du den lgt tvingar du algoritmen att vlja mindre steg.

Kolla Help ODESET om du vill lra dig mer.
Citera
2011-06-01, 16:11
  #21
Medlem
tourniquets avatar
terupplivar denna trd. Dags fr fler matlab-uppgifter!

r inte alls bra p det. Och vill ha lite hjlp.


Ska frdigstlla ett program som ska lsa ODE av frsta graden. Med hjlp av Eulers framtmetod.

Fyra inargument

funktion (f)
Vektor med start och slutvrde
Begynnelsevrde (U0)
Antal delintervall (N)


Citat:
function [t,U]=minPrim(?,?,?,?)
%Vi borjar testa antalet inargument och tillater anvandaren
%att inte bry sig om hur manga delintervall det ska vara.
NrIn=nargin; %Returnerar antalet inargument som anvandaren angett.
if NrIn==? %Gor 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 ratt storlek innan vi borjar
%loopa.
k=? %steglangden.
t=? %Vektor med alla t_n
U(1)=U0;
for k=2:?
U(?)=U(?)+k*f(?);
end


exempeluppgift

ls

u'= x^2

u0=3

x [0,2]
Citera
  • 1
  • 2

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