Vinnaren i pepparkakshustävlingen!
2013-03-04, 11:05
  #1
Medlem
pannkaksgrodas avatar
Hej!

Jag har skrivit följande funktion:
Kod:
function I = volym(r)
r0=3;
v(r)=2*(1-(r/r0).^(1/6));
I=v(r)*2*pi*r;

och får följande fel när jag kör funktionen:

>> quad(@volym,0,3)
Subscript indices must either be real positive integers or logicals.

Error in volym (line 3)
v(r)=2*(1-(r/x).^(1/6));

Error in quad (line 72)
y = f(x, varargin{:});

Men jag förstår inte alls vad som är fel, vad betyder det?
Citera
2013-03-04, 11:23
  #2
Medlem
När du skriver v(r)=... så gör du inte en inline funktionsdeklaration utan du skapar en array, skulle gissa att felet kommer därifrån (r kanske inte är ett heltal). Skriv bara v=... eller något sådant så borde det fungera.
Citera
2013-03-04, 11:41
  #3
Medlem
pannkaksgrodas avatar
Citat:
Ursprungligen postat av trekantshatt
När du skriver v(r)=... så gör du inte en inline funktionsdeklaration utan du skapar en array, skulle gissa att felet kommer därifrån (r kanske inte är ett heltal). Skriv bara v=... eller något sådant så borde det fungera.

Okej! Det löste det problemet, men nu får jag ett annat fel istället:

Kod:
>> quad(@volym,0,3)
Error using  * 
Inner matrix dimensions must agree.

Error in volym (line 4)
I=v*2*pi*r;

Error in quad (line 72)
y = f(x, varargin{:});
 

Vad betyder det?
Citera
2013-03-04, 11:51
  #4
Medlem
Quad kanske inte skickar in flyttal som jag trodde... r kanske är en array... isåfall är jag lite osäker. testa skriv .* istället för *?

Debuggningen i Matlab är ofta väldigt hjälpsam, så debugga om du inte testat det redan.

Möjligt att du kan göra en work-around genom att skriva v(1:size(r))=... eller liknande?
__________________
Senast redigerad av trekantshatt 2013-03-04 kl. 11:56.
Citera
2013-03-04, 12:01
  #5
Medlem
pannkaksgrodas avatar
Citat:
Ursprungligen postat av trekantshatt
Quad kanske inte skickar in flyttal som jag trodde... r kanske är en array... isåfall är jag lite osäker. testa skriv .* istället för *?

Debuggningen i Matlab är ofta väldigt hjälpsam, så debugga om du inte testat det redan.

Möjligt att du kan göra en work-around genom att skriva v(1:size(r))=... eller liknande?

Jag kom på att man kanske kunde skriva punkt framför *, då verkar det fungera! Dock får jag konstiga svar om jag ökar 3 till något högre värde, då får jag svar i stil med 44.44343 + 15.333i varför blir det ett i med?
Citera
2013-03-04, 12:07
  #6
Medlem
Verkar som att du försöker integrera ett intervall som inkluderar negativa tal. Din sjätterot ger isåfall komplexa svar. Du får tänka över domänen på funktionen du vill integrera. Den ser lite ut som en potentialfunktion så jag gissar att r>=0.

Ojdå nu läste jag slarvigt, du integrerar ju inte negativa tal. Har ingen aning faktiskt Kanske du måste skriva talen med decimaler som i C? Att den avrundar till heltal annars?
__________________
Senast redigerad av trekantshatt 2013-03-04 kl. 12:10.
Citera
2013-03-04, 13:55
  #7
Medlem
dxdps avatar
Citat:
Ursprungligen postat av pannkaksgroda
Jag kom på att man kanske kunde skriva punkt framför *, då verkar det fungera! Dock får jag konstiga svar om jag ökar 3 till något högre värde, då får jag svar i stil med 44.44343 + 15.333i varför blir det ett i med?

Menar du r0 ökas eller integrationsgränsen? Jag skrev om funktionen bara lite granna och då fungerar det utan att ge imaginära tal:

function I = volym(r)
r0 = 100 ;
v = 2*(1-(r/r0).^(1/6)) ;
I = v.*2.*pi.*r ;
Citera
2013-03-04, 14:41
  #8
Medlem
pannkaksgrodas avatar
Citat:
Ursprungligen postat av trekantshatt
Verkar som att du försöker integrera ett intervall som inkluderar negativa tal. Din sjätterot ger isåfall komplexa svar. Du får tänka över domänen på funktionen du vill integrera. Den ser lite ut som en potentialfunktion så jag gissar att r>=0.

Ojdå nu läste jag slarvigt, du integrerar ju inte negativa tal. Har ingen aning faktiskt Kanske du måste skriva talen med decimaler som i C? Att den avrundar till heltal annars?

Citat:
Ursprungligen postat av dxdp
Menar du r0 ökas eller integrationsgränsen? Jag skrev om funktionen bara lite granna och då fungerar det utan att ge imaginära tal:

function I = volym(r)
r0 = 100 ;
v = 2*(1-(r/r0).^(1/6)) ;
I = v.*2.*pi.*r ;

Det var integrationsgränsen jag ökade, men man måste visst öka r0 också, annars hamnar man väl utanför intervallet ellet något i den stilen. Om jag ökar r0 med samma värde som integrationsgränsen så fungerar det i alla fall!
Citera

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