[Matlab] for loop in hondersten

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Razkin
  • Registratie: Oktober 1999
  • Laatst online: 21:48
De vaste formule voor een gegeven waarde:
code:
1
R_kop=(r_kop^3+((3/2)*((c1*L_kop)/(p_kop_max*wr_kop*pi*i_kop))))^(1/3)
met r_kop = 0.09

Diezelfde formule als loop met r_kop als variabele:
code:
1
2
3
for i1=0.01:0.15   
    R_kop(i1)=((i1)^3+((3/2)*((c1*L_kop)/((p_kop_max)*wr_kop*pi*i_kop))))^(1/3);
end

error: Attempted to access i1(0.01); index must be a positive integer or logical.


Ik begrijp niet waarom Matlab deze loop niet kan draaien met honderdsten, maar wel met gehele getallen(1:15).


Als ik a(i1)=i1/100 toevoeg dan klopt de berekening alleen is in een eventuele plot de x-as 1:15 zoals gedefineerd in i1, terwijl dit juist 0.01-0.15 moet zijn.

code:
1
2
3
4
for i1=0.01:0.15
    a(i1)=i1/100   
    R_kop(i1)=((a(i1))^3+((3/2)*((c1*L_kop)/((p_kop_max)*wr_kop*pi*i_kop))))^(1/3);
end


Volgens de help zou je gewoon moeten kunnen werken met stapjes van 0.01.

Ik zit er al een tijdje aan te prutsen, maar kom er maar niet uit. :?

[ Voor 2% gewijzigd door RobIII op 15-01-2012 23:16 ]

iRacing Profiel


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Er zijn weinig talen waarin een index van een array-element niet-gehele waardes aanneemt, en Matlab is daar geen uitzondering op. Ik snap niet waarom je een for-loop zou gebruiken?

Kijk eens naar iets als http://www.mathworks.nl/help/techdoc/ref/plot.html ; dit is vrij basic ;)

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • armageddon_2k1
  • Registratie: September 2001
  • Laatst online: 27-07 10:18
Razkin schreef op zondag 15 januari 2012 @ 15:18:
for i1=0.01:0.15
R_kop(i1)=((i1)^3+((3/2)*((c1*L_kop)/((p_kop_max)*wr_kop*pi*i_kop))))^(1/3);
end
Je probeert hier de array R_kop te vullen zie ik, maar dit doe je op de indices i1. Je kan een array geen non-integer indices geven (zoals ook in de error staat). Probeer anders eens:

R_kop(end + 1) = ....

Alhoewel dit lichtelijk bad practice is omdat je dan de R_kop array laat groeien. Het liefst initialiseer je hem eerder al als je al weet hoeveel waardes je erin gaat stoppen met R_kop = zeros(n, 1), waar n de lengte is van je array.

Overigens kan je dit ook oplossen zonder for-loop. Matlab is hier juist sterk in:
code:
1
R_kop = ((i1).^3+((3/2)*((c1*L_kop)/((p_kop_max)*wr_kop*pi*i_kop))))^(1/3);


Kijk maar eens goed wat het verschil is.

[ Voor 14% gewijzigd door armageddon_2k1 op 15-01-2012 15:30 ]

Engineering is like Tetris. Succes disappears and errors accumulate.


Acties:
  • 0 Henk 'm!

  • Razkin
  • Registratie: Oktober 1999
  • Laatst online: 21:48
Het mag duidelijk zijn dat ik nog weinig ervaring heb met Matlab...

Na een hoop geklooi ben ik gekomen tot:

code:
1
2
3
4
5
6
7
8
9
10
figure(4);
r_kop=[0.05:0.01:0.16]
R_kop=(r_kop.^3+((3/2)*((c1*L_kop)/(p_kop_max*wr_kop*pi*i_kop)))).^(1/3)
plot (r_kop, R_kop, 'b-')
grid
title ('koppeling')
xlabel ('binnen diameter')
ylabel ('buiten diamter')
legend 
axis ([0.05 0.16 0.12 0.18])


Er is enkel wat verteld over het maken van for loops vandaar dat ik daar voor gekozen heb. Zoals ik het nu begrijp heb ik een array gekozen voor "r_kop" en met dat array berekent Matlab R_kop en zet dit uit in een grafiek.

Is dit een goede manier om te bereiken wat ik voor ogen had?

[ Voor 1% gewijzigd door RobIII op 15-01-2012 23:16 ]

iRacing Profiel


Acties:
  • 0 Henk 'm!

  • armageddon_2k1
  • Registratie: September 2001
  • Laatst online: 27-07 10:18
Ja werkt prima. Maar de R_Kop en r_kop benaming is natuurlijk vragen om problemen :-)

Matlab heeft veel voordelen, maar ook veel nadelen. Je kan razendsnel leren iets te maken, maar daardoor kan je ook snel in de knoop raken en de voorbeelden op internet zijn vaak van hele lage kwaliteit. Ik zou gewoon proberen veel de help te raadplegen.

Engineering is like Tetris. Succes disappears and errors accumulate.


Acties:
  • 0 Henk 'm!

  • Firesphere
  • Registratie: September 2010
  • Laatst online: 11-09 05:38

Firesphere

Yoshis before Hoshis

Check, MatLab help is echt heel goed. In mijn ervaring tenminste, is de help {functie} een erg goed gedocumenteerde hulp.

Het geeft geen letterlijke voorbeelden vaak, maar wel heel helder de syntax en wat het doet.
Ook de site van Mathworks is erg goed qua documentatie over matlab, hoewel het wel even zoeken is.

I'm not a complete idiot. Some parts are missing.
.Gertjan.: Ik ben een zelfstandige alcoholist, dus ik bepaal zelf wel wanneer ik aan het bier ga!


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Even zonder me verder in 't probleem verdiept te hebben; als je tiendes, honderdsten van indices wil gebruiken, waarom dan niet gewoon zo?
code:
1
2
myarray[i * 10]; //tiendes
myarray[i * 100]; //honderdsten

Waarbij i dus 0.1, 0.2 of 0.01, 0.02 etc. zou zijn.
Idem bij een for-loop die enkel gehele getallen zou gebruiken:
code:
1
2
for (i=0;i<1000;i++)
  dosomething(i/10);


Verder @TS: Als je code post, gebruik dan code tags a.u.b.

[ Voor 13% gewijzigd door RobIII op 15-01-2012 23:15 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

Verwijderd

Een dingetje over loopjes in matlab, ik vond het altijd heel handig om dingen als dit te doen

code:
1
2
3
for i=1:0.01:10
 //van 1 tot 10 in stappen van 0.01
end


Dan kan je zelf je stappen bepalen :p

Acties:
  • 0 Henk 'm!

  • Razkin
  • Registratie: Oktober 1999
  • Laatst online: 21:48
Er is me enkel wat verteld over het invoeren van een formule ^2 = kwadraat etc. en dat je met "for -> end" zelf aan kan geven welke waardes je wilt gebruiken voor i1 in bv:
code:
1
y(i1)=i1^2+10;

Dat het niet werkt als 0<i1<1 moet zijn dat begrijp ik dus nog steeds niet.

De rest is dan zelfstudie als het ware. Ik heb verder echt 0,0 programmeer ervaring dus zelfs zoiets simpels als een array had ik geen weet van. Waarom ik niet op de voorgedragen oplossingen ben gekomen is omdat ik niet weet dat ze bestaan :X

Matlab help is inderdaad best goed als je ongeveer weet wat je doet, maar als je de meeste syntaxis voor het eerst ziet en het gebruik ervan is niet zoals je dacht dat het zou zijn dan ben je(ik dan) uren verder zonder enig resultaat :'(

[ Voor 18% gewijzigd door Razkin op 16-01-2012 16:04 ]

iRacing Profiel


Acties:
  • 0 Henk 'm!

  • armageddon_2k1
  • Registratie: September 2001
  • Laatst online: 27-07 10:18
Ik snap dat het best verwarrend kan zijn als je geen programmeerervaring hebt inderdaad.

De arrays werken met indices. En deze indices zijn hele getallen. Dit is iets wat in veel programmeertalen standaard voorkomt. Je kan dan namelijk zeggen: pak het 3e element en dan typ je:
Matlab:
1
derde_value_van_vector = mijn_array(3)


Matlab heeft geen 0-based index, wat veel programmeertalen wel hebben. Daar is het 1e element van een array op index 0. Dat is iets wat je van tevoren moet weten. Bovenstaande voorbeeld in Java is dan:
Java:
1
double derde_value_van_array = mijn_array[2]



Matlab komt ook uit de wiskunde-wereld en gebruikt matrices als uitgangspunt, daarom ook de naam: Matrix Lab (als ik me het goed herinner). Alle variabelen in Matlab zijn dan ook vectoren (dus eigenlijk ook een matrix, maar dan van 1 rij of kolom) of matrices. En in een wiskunde matrix bestaan alleen posities op integer posities, want je kan niet vragen wat de waarde is op positie 0.2 bijvoorbeeld.

Wil je dus iets plotten, dan plot je een vector tegen de andere :-)

[ Voor 7% gewijzigd door armageddon_2k1 op 18-01-2012 14:33 ]

Engineering is like Tetris. Succes disappears and errors accumulate.

Pagina: 1