Springen naar inhoud

[matlab] kogelbaan programmeren


  • Log in om te kunnen reageren

#1

jppilot

    jppilot


  • >25 berichten
  • 46 berichten
  • Gebruiker

Geplaatst op 25 augustus 2013 - 13:39

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


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

___________________________

Dit gezegd hebbende, hoever ben ik?

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

wat doe ik fout? : ) er wordt wel van ons geacht dat we for-loops gebruiken, ik denk dat daarin iets niet goed gaat.

Veranderd door Xenion, 25 augustus 2013 - 14:56
afbeeldingen in bericht toegevoegd en code tussen code tags geplaatst


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 25 augustus 2013 - 15:00

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:

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

#3

jppilot

    jppilot


  • >25 berichten
  • 46 berichten
  • Gebruiker

Geplaatst op 25 augustus 2013 - 16:45

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/

Veranderd door jppilot, 25 augustus 2013 - 17:07


#4

jppilot

    jppilot


  • >25 berichten
  • 46 berichten
  • Gebruiker

Geplaatst op 25 augustus 2013 - 17:41

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:

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


  

Veranderd door jppilot, 25 augustus 2013 - 17:42


#5

jppilot

    jppilot


  • >25 berichten
  • 46 berichten
  • Gebruiker

Geplaatst op 25 augustus 2013 - 18:18

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?

#6

Xenion

    Xenion


  • >1k berichten
  • 2606 berichten
  • Moderator

Geplaatst op 25 augustus 2013 - 22:35

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.

#7

jppilot

    jppilot


  • >25 berichten
  • 46 berichten
  • Gebruiker

Geplaatst op 26 augustus 2013 - 11:47

Ja je had gelijk, dit was de bedoeling:

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





0 gebruiker(s) lezen dit onderwerp

0 leden, 0 bezoekers, 0 anonieme gebruikers

Ook adverteren op onze website? Lees hier meer!

Gesponsorde vacatures

Vacatures