Springen naar inhoud

Matlab: for-lus 'out of bounds'


  • Log in om te kunnen reageren

#1

Uomo Universale

    Uomo Universale


  • >250 berichten
  • 411 berichten
  • Ervaren gebruiker

Geplaatst op 19 april 2012 - 19:05

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

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

Dit forum kan gratis blijven vanwege banners als deze. Door te registeren zal de onderstaande banner overigens verdwijnen.

#2

Xenion

    Xenion


  • >1k berichten
  • 2606 berichten
  • Moderator

Geplaatst op 19 april 2012 - 19: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.

#3

Uomo Universale

    Uomo Universale


  • >250 berichten
  • 411 berichten
  • Ervaren gebruiker

Geplaatst op 19 april 2012 - 20:22

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: LaTeX waarbij rho loopt van [0.025, R[ en t van [0, +Geplaatste afbeelding[.

De gegeven Dirichlet-randvoorwaarde is de volgende: LaTeX

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

#4

Xenion

    Xenion


  • >1k berichten
  • 2606 berichten
  • Moderator

Geplaatst op 19 april 2012 - 20: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:
LaTeX

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

#5

Uomo Universale

    Uomo Universale


  • >250 berichten
  • 411 berichten
  • Ervaren gebruiker

Geplaatst op 19 april 2012 - 21:06

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:
LaTeX



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!





0 gebruiker(s) lezen dit onderwerp

0 leden, 0 bezoekers, 0 anonieme gebruikers

Ook adverteren op onze website? Lees hier meer!

Gesponsorde vacatures

Vacatures