Matlab: for-lus 'out of bounds'

Moderators: dirkwb, Xilvo

Forumregels
(Middelbare) school-achtige vragen naar het forum "Huiswerk en Practica" a.u.b.
Zie eerst de Huiswerkbijsluiter
Reageer
Berichten: 411

Matlab: for-lus 'out of bounds'

Ik was bezig met een differentiaalvergelijking numeriek op te lossen aan de hand van eindige differentiemethoden in Matlab. Maar ik krijg een foutmelding waarvan ik wel weet wat die betekent, maar niet hoe ik deze kan oplossen..

Mijn (sterk gereduceerd) script is de volgende (ik probeer een Dirichlet-randvoorwaarde te implementeren):

Code: Selecteer alles

temp1 = 100;

temp0 = 20;

alpha = 0.01;

deltat = 0.0125;

deltarho = 0.025;

t = (0:deltat:15);

rho = (0:deltarho:1);

m = (500-0)/deltat +1; %aantal knopen bij t

n = (2-0.025)/deltarho +1; %aantal knopen bij rho

U = zeros(m, n+1);  

for k = 1:1:m

U(k, n+1) = temp1 - (temp1 - temp0)*exp(-alpha*t(k));

end
Wanneer ik deze wil runnen, krijg ik volgende foutmelding:

Attempted to access t(1202); index out of bounds because numel(t)=1201.

Error in testscript (line 24)

U(k-1, n+1) = temp1 - (temp1 - temp0)*exp(-alpha*t(k-1));

Ik heb al verschillende oplossingen gezocht zoals:
  • mijn for-lus laten lopen tot m+1
  • binnen binnen mijn for lus overal k vervangen door k-1
Maar telkens blijf ik dezelfde fout krijgen.

Iemand die ziet wat ik hier fout doe?

Als jullie nood hebben aan mijn volledige Matlab-script, dan post ik deze gerust (maar de fout ligt echt wel aan bovenstaand deel).

Gebruikersavatar
Berichten: 2.609

Re: Matlab: for-lus 'out of bounds'

De fout is vrij duidelijk. Je probeert element t(1202) te gebruiken maar t bevat maar 1201 elementen. Je moet blijkbaar iets voorzichtiger zijn met je loop-grenzen/indexering.

Om zulke fouten te vermijden bereken je best niet zelf het aantal elementen dat jij verwacht (jouw m gok ik). Je kan ook gewoon length(t) gebruiken om te zorgen dat je over de hele vector loopt.

Berichten: 411

Re: Matlab: for-lus 'out of bounds'

Xenion schreef: do 19 apr 2012, 20:08
De fout is vrij duidelijk. Je probeert element t(1202) te gebruiken maar t bevat maar 1201 elementen. Je moet blijkbaar iets voorzichtiger zijn met je loop-grenzen/indexering.

Om zulke fouten te vermijden bereken je best niet zelf het aantal elementen dat jij verwacht (jouw m gok ik). Je kan ook gewoon length(t) gebruiken om te zorgen dat je over de hele vector loopt.
De foutmelding op zich is inderdaad vrij duidelijk. Ik begrijp deze en dat gaf ik ook al aan. Het probleem is dat ik niet zie hoe dat het komt dat Matlab deze fout geeft. Als je mijn script bekijkt dan zie ik zelf geen enkele reden waarom mijn index 'out of bounds' zou gaan.

Ik zou het heel graag op deze manier doen en niet via een andere methode zoals via 'length(t)'.

Misschien kan ik voor de duidelijkheid nog het volgende meegeven: De functie die beschreven wordt in mijn oefening is de functie u, afhankelijk van 2 veranderlijken rho en t, dus:
\(u(\rho, t)\)
waarbij rho loopt van [0.025, R[ en t van [0, +Afbeelding[.

De gegeven Dirichlet-randvoorwaarde is de volgende:
\(u(R,t) = T_1 - (T_1 - T_0)e^{-\alpha t}\)
Het is dus die randvoorwaarde die ik in mijn script wou implementeren.

Iemand die me kan vertellen hoe ik de fout kan oplossen (waarbij ik wel blijf gebruik maken van een for-lus)?

Gebruikersavatar
Berichten: 2.609

Re: Matlab: for-lus 'out of bounds'

m = 40001

Voor k loop je van 1 tot 40001 en dan heb je in elke stap t(k) nodig, maar die vector bevat zoveel elementen niet.

t = (0:deltat:15);

m = (500-0)/deltat +1; %aantal knopen bij t

Die m verwacht een tijdsas met een einde op 500s, maar je t is maar gedefinieerd voor 15s?

Het is gemakkelijker van gewoon een tijds as te maken:
\(t = t_{begin}:\Delta t:t_{eind};\)
En dan loop je over de tijds as via:

for k = 1:length(t)

t(k) bevat dan het tijdstip op punt k van jouw tijds as

Berichten: 411

Re: Matlab: for-lus 'out of bounds'

Xenion schreef: do 19 apr 2012, 21:42
m = 40001

Voor k loop je van 1 tot 40001 en dan heb je in elke stap t(k) nodig, maar die vector bevat zoveel elementen niet.

t = (0:deltat:15);

m = (500-0)/deltat +1; %aantal knopen bij t

Die m verwacht een tijdsas met een einde op 500s, maar je t is maar gedefinieerd voor 15s?

Het is gemakkelijker van gewoon een tijds as te maken:
\(t = t_{begin}:\Delta t:t_{eind};\)
En dan loop je over de tijds as via:

for k = 1:length(t)

t(k) bevat dan het tijdstip op punt k van jouw tijds as
Dat is volledig wat ik nodig had! Ik had dit script gekopiëerd van eerder gelijkaardige oefening, en had de meeste dingen aangepast of veranderd, met uitzondering van de grenzen van mijn t- en rho-vector. Dit heb ik nu dus gedaan en het werkt!

Bedankt Xenion!

Reageer