Vinnaren i pepparkakshustävlingen!
  • 1
  • 2
2010-12-23, 18:40
  #1
Medlem
tourniquets avatar
Ska anropa en funktionsfil i en for-loop, som ska summera ihop olika funktionsvärden för olika värden på x

funktionsfil:

function [y]=funktion(x)

y=x
end

script-fil med for-loop

for x=0:1:5
f=@(x)funktion(x)
end


Nu borde filen med loopen räkna ut olika funktionsvärden, i detta fallet summers de inte ihop. Men på prompten så visar det sig att ingen uträkning sker. Det står bara:

f=@(x)funktion(x)
Citera
2010-12-23, 19:28
  #2
Medlem
vad gör @-operatorn i matlab?
Citera
2010-12-23, 19:43
  #3
Medlem
tourniquets avatar
Citat:
Ursprungligen postat av Hewhowalk
vad gör @-operatorn i matlab?

Det är ett funktionshandtag typ. I det här fallet anropar jag en existerande funktion anonymt. Det sker med @-operatorn.

typ

f=@(x)namn(x)

Annars kan man bara skriva funktonen rätt av t.ex.

f=@(x) x^2

Fast jag ska inte göra så i detta fallet.
Citera
2010-12-23, 22:55
  #4
Medlem
evolutes avatar
Din rad f=@(x)funktion(x) definierar ju funktionen f(x) varje gång. Vill du inte räkna ut ett värde för ett visst värde på x som ändras inuti din for loop? Exempelvis

s=0;
for x = 1:10
s = s+namn(x);
end
Citera
2010-12-24, 15:28
  #5
Medlem
tourniquets avatar
Citat:
Ursprungligen postat av evolute
Din rad f=@(x)funktion(x) definierar ju funktionen f(x) varje gång. Vill du inte räkna ut ett värde för ett visst värde på x som ändras inuti din for loop? Exempelvis

s=0;
for x = 1:10
s = s+namn(x);
end

Jo, tack. Vill ha det så. Nu skrevs värdena ut, precis som jag ville.

Fast nu vill jag filtrera jämna och ojämna tal i olika loopar.

Dvs om x=1:1:10

2,4,6,8,10 ska stoppas in i loopen och räknas ut. Sedan ska jag göra samma sak för ojämna tal.

Jag ska nämligen beräkna en integral genom simpson approximering. Fast hela uppgiften är lite mer komplicerad då. Jag ska ha 4 inargument i funktionsfilen. De 4 inargumenten ska vara de samma som de tre första i quad. Det fjärde inargumentet ska vara hur många delintervall jag vill göra.

quad(@funk,a,b)

Denna funktionen ska i sin tur skickas till flera for-loopar som ska räkna ut simpson-approximationen.

Simpsonutveckling:

S=(h/3)(y(0)+4y(1)+2y(2)+4y(3)+...+4y(n-1)+y(n))

En liten oklarhet med uppgiften jag fått är att första inargumentet i quad är just den funktionen f man tänker integrera. Som i denna uppgiften ska vara det första inargumentet. De följande inargumenten blir a, b och h. Där a är startvärde, b slutvärde och h steglängd.

Eftersom det verkade alldeles för konstigt med en funktion som inargument i själva funktionsfilen, så satte jag bara x eftersom f beror av x.


Flera for-loopar borde göras eftersom man har olika konstanter i själva simpson-utvecklingen. Hur man nu väljer ut heltal som ska läggas in i respektive loop borde ske med else if. Då det verkar lättast så.
  • Det jag nu inte riktigt förstår är hur jag ska behandla alla dessa inargument.
  • Och sen vet jag inte riktigt hur jag ska använda else if.
__________________
Senast redigerad av tourniquet 2010-12-24 kl. 15:33.
Citera
2010-12-24, 23:12
  #6
Medlem
evolutes avatar
Det känns som du gör det väldigt krångligt för dig. En av styrkorna med matlab är att du ofta kan använda den inbyggda vektorbehandlingen istället för for-satser. Ditt Simpson-program skulle jag bara skriva så här
Kod:
function out = simpson(f,a,b,n)

h = (b-a)/n;
x = a:h:b-h;

out = sum(h/6*(f(x)+f(x+h)+4*f((2*x+h)/2)));
Jag skapar alltså en vektor x som innehåller alla startpunkter på intervallerna, som alla har längden h. Slutpunkterna på intervallerna blir x + h. Sedan räknar jag ut integralapproximationen för alla intervallerna med h/6*(f(x)+f(x+h)+4*f((2*x+h)/2)) som alltså är en vektor. Funktionen sum summerar sedan alla elementen i vektorn och detta ger totala integralen.

Ett litet test.

Kod:
>> quad(@(x) exp(-x.^3).*(x.^2-2*x+sin(x).*cos(x)),1,3)

ans =

   -0.0519

>> simpson(@(x) exp(-x.^3).*(x.^2-2*x+sin(x).*cos(x)),1,3,10)

ans =

   -0.0519
Citera
2010-12-27, 14:21
  #7
Medlem
tourniquets avatar
Citat:
Ursprungligen postat av evolute
Det känns som du gör det väldigt krångligt för dig. En av styrkorna med matlab är att du ofta kan använda den inbyggda vektorbehandlingen istället för for-satser. Ditt Simpson-program skulle jag bara skriva så här
Kod:
function out = simpson(f,a,b,n)

h = (b-a)/n;
x = a:h:b-h;

out = sum(h/6*(f(x)+f(x+h)+4*f((2*x+h)/2)));
Jag skapar alltså en vektor x som innehåller alla startpunkter på intervallerna, som alla har längden h. Slutpunkterna på intervallerna blir x + h. Sedan räknar jag ut integralapproximationen för alla intervallerna med h/6*(f(x)+f(x+h)+4*f((2*x+h)/2)) som alltså är en vektor. Funktionen sum summerar sedan alla elementen i vektorn och detta ger totala integralen.

Ett litet test.

Kod:
>> quad(@(x) exp(-x.^3).*(x.^2-2*x+sin(x).*cos(x)),1,3)

ans =

   -0.0519

>> simpson(@(x) exp(-x.^3).*(x.^2-2*x+sin(x).*cos(x)),1,3,10)

ans =

   -0.0519

Det var ganska bra sätt att lösa det på. Konstigt att man var tvungen att behandla det i en for-loop. Men det är kanske för att man ska lära sig helt enkelt att använda sig av for-loopen också.
Citera
2010-12-27, 15:41
  #8
Medlem
Zaxxons avatar
Citat:
Ursprungligen postat av tourniquet
Det var ganska bra sätt att lösa det på. Konstigt att man var tvungen att behandla det i en for-loop. Men det är kanske för att man ska lära sig helt enkelt att använda sig av for-loopen också.
Antar det är av pedagogiska skäl for-loop användes. I evolutes exempel så används elementvisa operationer då f(x) definieras, ex x.^3 istället för x^3, vilket jag antar man ville skona er från.
Citera
2010-12-27, 16:42
  #9
Medlem
tourniquets avatar
Är en nybörjare när det kommer till Matlab och just nu känns allting riktigt svårt. Skulle behöva få hjälp med att substituera formeln:

1/sqrt(2πσ^2)∫e^(-((x-µ)^2)/(2σ^2)) för att visa att den blir =1

Som är tydligen en riktigt viktigt formel inom sannolikhetsläran. Hursomhelst ska man rita upp grafen till den här funktionen för olika värden på σ och µ. Hur gör man det när en integreringssymbol är med?

Intervallet är [b,-∞]
__________________
Senast redigerad av tourniquet 2010-12-27 kl. 16:58.
Citera
2010-12-27, 16:59
  #10
Medlem
evolutes avatar
Först kan du definiera en funktion som ger värdet på funktionen med integralen för en uppsättning b.

function out=torniquet_stat(b,params)

mu = params(1);
sigma = params(2);
y = [];
for i=1:length(b)
y(i)= 1/sqrt(2*pi*sigma^2)*quad(@(x) exp(-((x-mu).^2)/(2*sigma^2)),mu-10*sigma,b(i));
end
out = y;
Jag ersatte -∞ med ett värde som ligger 10 standardavvikelser till vänster om medelvärdet vilket borde vara helt ok. Sen kan du ju plotta den från kanske μ-5σ till μ+5σ. Exempel:
>> mu=10;
>> sigma=1;
>> x=mu-5*sigma:sigma/10:mu+5*sigma;
>> y=torniquet_stat(x,[mu sigma]);
>> plot(x,y)
Citera
2010-12-27, 17:13
  #11
Medlem
tourniquets avatar
Citat:
Ursprungligen postat av evolute
Först kan du definiera en funktion som ger värdet på funktionen med integralen för en uppsättning b.

function out=torniquet_stat(b,params)

mu = params(1);
sigma = params(2);
y = [];
for i=1:length(b)
y(i)= 1/sqrt(2*pi*sigma^2)*quad(@(x) exp(-((x-mu).^2)/(2*sigma^2)),mu-10*sigma,b(i));
end
out = y;
Jag ersatte -∞ med ett värde som ligger 10 standardavvikelser till vänster om medelvärdet vilket borde vara helt ok. Sen kan du ju plotta den från kanske μ-5σ till μ+5σ. Exempel:
>> mu=10;
>> sigma=1;
>> x=mu-5*sigma:sigma/10:mu+5*sigma;
>> y=torniquet_stat(x,[mu sigma]);
>> plot(x,y)


Funkade klockrent, ska kolla lite mer på det så jag hänger med på noterna. Men kan du förklara varför man gör for-loopen? Är det pga normalfördelningen?
Citera
2010-12-27, 17:18
  #12
Medlem
evolutes avatar
Citat:
Ursprungligen postat av tourniquet
Funkade klockrent, ska kolla lite mer på det så jag hänger med på noterna. Men kan du förklara varför man gör for-loopen? Är det pga normalfördelningen?

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).
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