jppilot
Artikelen: 0
Berichten: 46
Lid geworden op: do 17 sep 2009, 22:35

[matlab] kogelbaan programmeren

Voor mijn studie wordt het volgende gevraagd om in matlab te programmeren:

Een projectiel wordt afgeschoten met een begin snelheid v0 (in m/s) onder verschillende hoeken (in graden). Deze hoeken worden aangeleverd in de vorm van een vector. U kunt gebruik maken van de volgende formules voor het uitrekenen van de kogelbaan (zonder luchtweerstand). hierbij mag u de versnelling van de zwaartekracht g = 10 m/s2 stellen.
1
1 1244 keer bekeken
Gevraagd

Maak een M-script programma waarin u de baan van het projectiel uitrekent. Probeer dit te doen door gebruik te maken van matrices waarbij u een vector maakt voor de maximale hoek en een array voor afstand, hoogte en hoek (X, Y en HOEK waarbij elke rij overeenkomt met een bepaalde hoek). Handig hierbij zijn de commando’s linspace en meshgrid.

Presenteer de uitvoer van uw M-script programma op twee manieren:
  • in een 2D-figuur (y versus x) met bijbehorende legende;
  • in een staafdiagram waarbij de maximale afstand als een functie van de hoek wordt afgebeeld.
Geef in alle gevallen de afstanden in kilometers en de hoeken in graden weer. Vergeet niet om uitleg langs de assen te zetten en de figuur een titel te geven!

zoals:
2
2 1244 keer bekeken
___________________________

Dit gezegd hebbende, hoever ben ik?

Code: Selecteer alles

clc

V=1000;

G=10;

alpha_graden=[5:10:85];

aantal_stappen=101;

alpha_rad=alpha_graden*(pi/180);

Xmax=V^2*sin(2*(alpha_graden))/G;

%Bepaal onder welke hoek de kogel het verst komt en de afstand die afgelegd

%wordt. Noem deze: grootste_afstand

grootste_afstand=(V^2)*(sin(2*(45*(pi/180))))/G;

x=linspace(0, grootste_afstand, aantal_stappen);

for i=1;length(alpha_rad);

    for j=1;aantal_stappen;

        y(i,j)=G/(2*V^2*(cos(alpha_rad(i)))^2)*x(j)^2+tan(alpha_rad(i));

    end

end

for i=1;length(alpha_rad);

    for j=1;aantal_stappen;

        if y(i,j)<0;

            y(i,j)=0;

        end

    end

end

figure(1); % maak een figuur en geef dit nummer 1

plot(x,y); % teken de lijnen

% Geef uitleg over de figuur en langs de assen

title('Kogelbaan') % zet titel boven de figuur

xlabel('afstand [km]')  % zet tekst langs de x-as

ylabel('hoogte [km]') % zet tekst langs de y-as
______

Als ik dit plot krijg ik onderstaande grafiek:
3
3 1231 keer bekeken
wat doe ik fout? : ) er wordt wel van ons geacht dat we for-loops gebruiken, ik denk dat daarin iets niet goed gaat.
Gebruikersavatar
Xenion
Artikelen: 0
Berichten: 2.609
Lid geworden op: za 21 jun 2008, 10:41

Re: [matlab] kogelbaan programmeren

Je for loops werken inderdaad niet goed. De y vector die je op het einde over houdt heeft dimensies 1x1. (Dat kan je na het uitvoeren van je script zien in de workspace.)

De reden is dat de for loop zoals jij hem schrijft er als volgt uitziet:

Code: Selecteer alles

for i=1;length(alpha_rad);

  ...

end
Je hebt een ';' (puntkomma) staan na i=1 terwijl er een ':' (dubbelpunt) zou moeten staan.

Wat je nu hebt geschreven is equivalent aan:

Code: Selecteer alles

for i=1;

  length(alpha_rad);

  ...

end
en dat is uiteraard niet wat je wilde ;)

TIP: als je aan de linkerkant van je code net naast de lijnnummers klikt, dan verschijnt er een rood bolletje. Dat heet een 'breakpoint'. Als je het script uitvoert dan zal het stoppen aan alle rode bolletjes. Als het gestopt is, dan kan je door op F10 te drukken de code lijn per lijn uitvoeren. Dat is erg handig als je een fout zoekt in je code. Zo zou je bijvoorbeeld gemerkt hebben dat je loops telkens maar 1x uitgevoerd werden. Als je tijdens het debuggen op F5 drukt, dan loopt de code weer normaal verder (tot het volgende breakpoint).
jppilot
Artikelen: 0
Berichten: 46
Lid geworden op: do 17 sep 2009, 22:35

Re: [matlab] kogelbaan programmeren

Bedankt voor je reactie! heb je tip uitgevoerd door de ';' te vervangen voor ':' , maar op elke positie waar dit zou moeten, het resultaat in mijn figuur blijft hetzelfde...

edit: Dat werken met die breakpoints is trouwens wel erg makkelijk!!

edit2: o jawel, met de ':' krijg ik onderstaande figuur, zat nogal te rommelen. Alleen zijn de bijbehorende waardes verkeerd dus moet er een fout zijn in mijn formules. Alleen kan ik ze niet vinden, mijn vermoeden is dat er wat verkeerd gaat met de conversie van graden naar radialen.

http://imageshack.us...ges/41/kj5.png/
jppilot
Artikelen: 0
Berichten: 46
Lid geworden op: do 17 sep 2009, 22:35

Re: [matlab] kogelbaan programmeren

We komen in de buurt :) zojuist de formules verbeterd, was enkele termen vergeten en nu klopt de figuur : )

http://imageshack.us...s/694/z4fc.png/

enige wat nog rest: de assen uitdrukken in kilometers, waar ze nu nog in het aantal meters worden vermeld. Dit moet ik in de formules aanpassen door, dacht ik, x en y te delen door 1000. Echter blijkt dit niet de oplossing. huidige code:

Code: Selecteer alles


clear all;

V=1000;

G=10;

alpha_graden=[5:10:85];

aantal_stappen=101;

% zet hoeken om naar radialen

alpha_rad=alpha_graden*(pi/180);

%bepaal de maximale afstand die afgelegd wordt per hoek

Xmax=V^2*sin(2*(alpha_graden))/G;

%Bepaal onder welke hoek de kogel het verst komt en de afstand die afgelegd

%wordt. Noem deze: grootste_afstand

grootste_afstand=(V^2)*(sin(2*(45*(pi/180))))/G;

%het delen van de x-as:

x=round(linspace(0, grootste_afstand, aantal_stappen));

for i=1:length(alpha_rad);

for j=1:aantal_stappen;

y(i,j)=round(-G/(2*V^2*(cos(alpha_rad(i)))^2)*x(j)^2+tan(alpha_rad(i))*x(j));

end

end

for i=1:length(alpha_rad);

for j=1:aantal_stappen;

if y(i,j)<0;

y(i,j)=0;

end

end

end

figure(1);	% maak een figuur en geef dit nummer 1

plot(x,y);	   % teken de lijnen

% Geef uitleg over de figuur en langs de assen

title('Kogelbaan')

  

xlabel('afstand [km]') % zet tekst langs de x-as

ylabel('hoogte [km]')   % zet tekst langs de y-as

legend(num2str(alpha_graden'),-1); %legenda toevoegen

grid on %teken een raster in het figuur

  

jppilot
Artikelen: 0
Berichten: 46
Lid geworden op: do 17 sep 2009, 22:35

Re: [matlab] kogelbaan programmeren

enn we lopen weer vast.. door middel van plot(x,y) te veranderen in plot (x/1000,y/1000); heb ik mijn vorige probleem opgelost. Nu moet er nog een staafdiagram gemaakt worden met op de x-as de hoeken in graden [5:10:85] en op de y-as de maximale bereikbare afstand. ik dacht te doen met:

figure(2);

bar(alpha_graden,x); --> oftewel alpha_graden zijn de hoeken in graden die ik op de x-as wil hebben, de x is de maximale bereikbare afstand op de y-as. Ik krijg dan echter de foutmelding

??? Error using ==> bar at 54

X must be same length as Y.

Error in ==> kogelbaan at 59

bar(alpha_graden,x);

hoe kan ik dit oplossen?
Gebruikersavatar
Xenion
Artikelen: 0
Berichten: 2.609
Lid geworden op: za 21 jun 2008, 10:41

Re: [matlab] kogelbaan programmeren

Goed dat jullie zelf al zover geraakt zijn :)

Gebruik je voor die laatste opgave niet gewoon de foute vector? Ik heb het niet in detail bekeken, maar is de vector die je wil plotten niet Xmax ipv x?

PS: het is beter dat je afbeeldingen upload op dit forum en rechtstreeks in je post plakt. Onderaan in de volledige bericht-editor heb je een upload mogelijkheid en als je figuren hebt toegevoegd, dan zou je een knopje 'invoegen in bericht' of iets dergelijks moeten zien.
jppilot
Artikelen: 0
Berichten: 46
Lid geworden op: do 17 sep 2009, 22:35

Re: [matlab] kogelbaan programmeren

Ja je had gelijk, dit was de bedoeling:

Code: Selecteer alles


figure(2);

bar(alpha_graden,(V^2)*(sin(2*(alpha_graden*(pi/180))))/G/1000);

title('Kogelbaan figuur 2')

xlabel('hoek (graden)');

ylabel('maximale afstand (km)');

grid on

Wel fijn dat het zo is gelukt :) al doende leert men en vooral het zelfstandig (we doen deze opdrachten individueel) is soms echt een uitdaging.. Dit forum werkt echt prettig om een duw te geven in de goede richting :)

Terug naar “Informatica en programmeren”