WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Problem mit Matrizenlänge

 

paul101
Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 03.01.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.01.2010, 17:57     Titel: Problem mit Matrizenlänge
  Antworten mit Zitat      
hallo

in dem Skript unten gibt lsode y(:,1) und y(.,2) beide mit der Länge 1000 aus.
Wenn ich jetzt aber bei %Reichweite
R=(((l1.*y(:,2)).^2) .*sin(2.*y(:,1))./ g);
setzte, hat R nur noch die Länge 1 obwol trotzdem 1000 Zeilen drinnstehen Mad

weiß jemand woran das liegt?

Gruß,
Paul

Code:
%Skript zur Berechnung eines Schaukel-Trebuchets
%
%es wird das emd-package benötigt, welches die funktion extr.m enthält
%http://perso.ens-lyon.fr/patrick.flandrin/emd.html

clear

printf("\n")

%Konstanten:
global g=9.81;
global l1=input("l1 in m: ");
global l2=input("l2 in m: ");
global m1=input("m1 in kg: ");
global m2=input("m2 in kg: ");

%differentialgleichung: phidotdot=c*sin(phi)
function dy= f(y,t)

   global g
   global l1
   global l2
   global m1
   global m2
   
   dy = zeros(2,1);
   
   c=g*(l1*m1-l2*m2)/(m1*l1^2+m2*l2^2);
   dy(1)=y(2);
   dy(2)=c*sin(y(1));
endfunction

%Genauigkeit:
global gen=1000;

%Anfangswinkel phi:
phiadeg=input("phianfang in Grad: ");
global phianfang=phiadeg/180*pi;

%Anfangsbedingungen:
anf =[phianfang,0];

%Zeit:
tges=input("zu betrachtende Zeit in Sekunden: ");
global t=linspace(0.0,tges,gen);

%Loesen der Differentialgleichung:
global y=lsode("f",anf,t);

%Reichweite:
R=(((l1.*y(:,2)).^2) .*sin(2.*y(:,1))./ g);

%Reichweiten-wirkungsgrad:
Reff=(m1 .* R) ./ (2 .* m2 .* ((l1 .* cos(pi - phianfang)) .+ (l2 .* sin(phianfang - (0.5 .* pi)))));

%Bestimmung des Maximumms von R:
[indmin, indmax, indzer] = extr(R);

%Text Ausgaben:
printf("\nMaximale Reichweite: %gm\n", (R(:,1)(indmax(1))) )
printf("bei einem Abschusswinkel von %g Grad\n", ((y(:,1)(indmax(1)))/pi *180))
printf("mit einer Abschussgeschwindigkeit von %gm/s\n", l1*(y(:,2)(indmax(1))))
printf("mit einem Reichweiten-Wirkungsgrad von %g%%\n\n\n", (Reff(:,1)(indmax(1)))*100)

%Abschussposition:
xa1=-l1*sin(y(:,1)(indmax(1)));
ya1=l1*cos(y(:,1)(indmax(1)));

%Position der Massen:
x1=-l1*sin(y(:,1));
y1=l1*cos(y(:,1));

%Löschen des Teils der bewegungskurve nach dem Abschusszeipunkt:
for i=(indmax(1)):+1:gen
   x1(indmax(1),:)=[];
   y1(indmax(1),:)=[];
end

%Plot:

figure
subplot(2,2,1);
plot(t,y(:,1),"r-");
title("Ausloesewinkel phia gegen Ausloesezeitpunkt")
xlabel("t in s");
ylabel("phi in rad");
grid on

subplot(2,2,2);
global l1
plot(t,l1*y(:,2),"r-");
title("Ausloesegeschwindigkeit va gegen Ausloesezeitpunkt")
xlabel("t in s");
ylabel("va in m/s");
grid on

subplot(2,2,3);
plot(t,R,"r-");
title("Range gegen Ausloesezeitpunkt")
xlabel("t in s");
ylabel("R in m");
grid on

subplot(2,2,4);
plot(x1,y1,".r;;", xa1,ya1,"ob;;", 0,0,"og;;")
title("Position des Projektils")
xlabel("x in m");
ylabel("y in m");
grid on


 
Private Nachricht senden Benutzer-Profile anzeigen


paul101
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 03.01.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.01.2010, 05:21     Titel:
  Antworten mit Zitat      
Es scheint irgendwie an der extr.m zu liegen, denn wenn ich diese zeile lösche, funktioniert es.
Irgendwie erwartet extr.m einen Vektor mit 3 Spalten, warum auch immer.
wenn ich zum Beispiel anstatt
Code:
[indmin, indmax, indzer] = extr(R);
 

Code:
[indmin] = extr(R);

schreibe, funktioniert es auch, bloß wird dann eben nur das Minimum bestimmt.

Es wäre echt nett wenn mir noch jemand helfen würde.

Gruß,
Paul

das ist die extr.m, die kommt mit dem emd-package.
Code:
%EXTR  finds extrema and zero-crossings
%
% [indmin, indmax, indzer] = EXTR(x,t)
%
% inputs : - x : analyzed signal
%          - t (optional) : sampling times, default 1:length(x)
%
% outputs : - indmin = indices of minima
%           - indmax = indices of maxima
%           - indzer = indices of zero-crossings
%
% See also
%  boundary_conditions_emd
%
% G. Rilling, last modification: July 2002
% gabriel.rilling@ens-lyon.fr
function [indmin, indmax, indzer] = extr(x,t);

if(nargin==1)
  t=1:length(x);
end

m = length(x);

if nargout > 2
   x1=x(1:m-1);
   x2=x(2:m);
   indzer = find(x1.*x2<0);
   
   if any(x == 0)
     iz = find( x==0 );
     indz = [];
     if any(diff(iz)==1)
       zer = x == 0;
       dz = diff([0 zer 0]);
       debz = find(dz == 1);
       finz = find(dz == -1)-1;
       indz = round((debz+finz)/2);
     else
       indz = iz;
     end
     indzer = sort([indzer indz]);
   end
end
 
d = diff(x);

n = length(d);
d1 = d(1:n-1);
d2 = d(2:n);
indmin = find(d1.*d2<0 & d1<0)+1;
indmax = find(d1.*d2<0 & d1>0)+1;

if any(d==0)
 
  imax = [];
  imin = [];
 
  bad = (d==0);
  dd = diff([0 bad 0]);
  debs = find(dd == 1);
  fins = find(dd == -1);
  if debs(1) == 1
    if length(debs) > 1
      debs = debs(2:end);
      fins = fins(2:end);
    else
      debs = [];
      fins = [];
    end
  end
  if length(debs) > 0
    if fins(end) == m
      if length(debs) > 1
        debs = debs(1:(end-1));
        fins = fins(1:(end-1));

      else
        debs = [];
        fins = [];
      end      
    end
  end
  lc = length(debs);
  if lc > 0
    for k = 1:lc
      if d(debs(k)-1) > 0
        if d(fins(k)) < 0
          imax = [imax round((fins(k)+debs(k))/2)];
        end
      else
        if d(fins(k)) > 0
          imin = [imin round((fins(k)+debs(k))/2)];
        end
      end
    end
  end
 
  if length(imax) > 0
    indmax = sort([indmax imax]);
  end

  if length(imin) > 0
    indmin = sort([indmin imin]);
  end
 
end  
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.