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

Kontinuierlich wechselnde Variablen

 

SparX
Forum-Anfänger

Forum-Anfänger


Beiträge: 47
Anmeldedatum: 11.07.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.08.2018, 09:47     Titel: Kontinuierlich wechselnde Variablen
  Antworten mit Zitat      
Hallo Matlab-Forum,

ich habe eine Frage zur Programmierung von Vektoren, die aus einer Funktion erstellt werden.

Meine Ausgangsdaten sind:

Code:
v=xlsread("Example.xls"); % Velocity vector
i=[4,3,2,1]; % Transmission ratios
n=(v.*60*i)/(2*pi*r); %RPM
p=(P./n)*((1200/1000)/(V_H)); %Mean pressure in cylinder
%P is a previously calculated array and V_H is a given number


Für diese Rechnung soll die Drehzahl n zwischen 1500<n<3000 liegen. Dazu soll sich i kontinuierlich nach diesen Bedingungen ändern können. Die Ergebnisse sollen dann in einen Vektor geschrieben werden.

Wie kann diese Bedingung am besten programmiert werden? Bisher war mein Ansatz zunächst erstmal die Drehzahlen über 3000 zu ersetzen mit:

Code:
n = (v.*60*i(1))/(2*pi*r);
p1 = (P./n)*((1200/1000)/(V_H))
toreplace = n>3000;
n(toreplace) = v(toreplace).*60*i(2) / 2*pi*r;
p2 = (P./n)*((1200/1000)/(V_H))
toreplace2 = n>3000;
n(toreplace2) = v(toreplace2).*60*i(3) / 2*pi*r;
p3 = (P./n)*((1200/1000)/(V_H))
toreplace3 = n>3000;
n(toreplace3) = v(toreplace3).*60*i(4) / 2*pi*r;
p4 = (P./n)*((1200/1000)/(V_H))


Das klappt zwar, berücksichtigt aber nicht, dass sich die Drehzahlen unter 3000 auch mit einer anderen Übersetzung i ändern.

Viele Grüße,
SparX
Private Nachricht senden Benutzer-Profile anzeigen


J0nas
Forum-Century

Forum-Century


Beiträge: 208
Anmeldedatum: 10.09.15
Wohnort: ---
Version: ab 2016a
     Beitrag Verfasst am: 06.08.2018, 10:33     Titel:
  Antworten mit Zitat      
Hallo SparX,

zumindest für mich ist dein Beitrag etwas unverständlich:
Zitat:
Dazu soll sich i kontinuierlich nach diesen Bedingungen ändern können
Nach welchen Bedingungen? Und wie genau soll sich i ändern?

Zitat:
Für diese Rechnung soll die Drehzahl n zwischen 1500<n<3000 liegen. [...] Bisher war mein Ansatz zunächst erstmal die Drehzahlen über 3000 zu ersetzen mit: [...]

Wäre es nicht sinnvoller die einfach zu löschen? Die sollen ja schließlich nicht berücksichtigt werden?!

Dann solltest du auf jeden Fall bei folgender Zeile den Nenner in Klammern setzen, falls ich das richtig sehe:
Code:
n(toreplace) = v(toreplace).*60*i(2) / (2*pi*r);

Bei den weiteren entsprechenden Zeilen natürlich ebenfalls.

Grüße
Jonas
_________________

1.) Ask Google & Matlab Documentation
2.) Ask gomatlab.de & Technical Support of MathWorks
3.) Go mad, your problem is unsolvable
Private Nachricht senden Benutzer-Profile anzeigen
 
SparX
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 47
Anmeldedatum: 11.07.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.08.2018, 10:43     Titel:
  Antworten mit Zitat      
Hallo J0nas,

ja, mein Beitrag ist etwas verwirrend geschrieben, da ich es schwer erklären kann.

In der Formel

Code:
n=(v.*60*i)/(2*pi*r)


soll sich i anhand seines Vektors i=[4,3,2,1] ändern.

Ist beispielsweise n=3500 für i(1), soll in der oberen Gleichung ab dieser Zeile im Vektor mit i(2) weitergerechnet werden. Fällt dann mit i(2) das n wieder unter 1500, soll mit i(1) weitergerechnet werden.

Es wäre auch gut zu sehen, ab welcher Zeile sich i ändert.

Gruß,
SparX
Private Nachricht senden Benutzer-Profile anzeigen
 
J0nas
Forum-Century

Forum-Century


Beiträge: 208
Anmeldedatum: 10.09.15
Wohnort: ---
Version: ab 2016a
     Beitrag Verfasst am: 06.08.2018, 10:59     Titel:
  Antworten mit Zitat      
Hallo SparX,

ich glaube, dass das auf eine Schleife rauslaufen wird Wink

Grüße
Jonas
_________________

1.) Ask Google & Matlab Documentation
2.) Ask gomatlab.de & Technical Support of MathWorks
3.) Go mad, your problem is unsolvable
Private Nachricht senden Benutzer-Profile anzeigen
 
SparX
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 47
Anmeldedatum: 11.07.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.08.2018, 12:14     Titel:
  Antworten mit Zitat      
Ja, das dachte ich mir. Allerdings bin ich in Schleifen nicht sehr bewandert. Joch habe ein paar while - Schleifen probiert, aber die haben nicht funktioniert.

Gruß,
SparX
Private Nachricht senden Benutzer-Profile anzeigen
 
J0nas
Forum-Century

Forum-Century


Beiträge: 208
Anmeldedatum: 10.09.15
Wohnort: ---
Version: ab 2016a
     Beitrag Verfasst am: 06.08.2018, 12:33     Titel:
  Antworten mit Zitat      
Hi,

könnte so in der Art aussehen:

Code:
i = 1; % Startgang
n = zeros(2,length(GESCHWINDIGKEITSVEKTOR))
p = zeros(1,length(GESCHWINDIGKEITSVEKTOR))
for zaehler = 1 : length(GESCHWINDIGKEITSVEKTOR) % Hier deinen Geschwindigkeitsvektor eintragen, weiß nicht wie der aussieht.
    n(1,zaehler)=(v(zaehler)*60*i)/(2*pi*r); % RPM
    p(1,zaehler)=(P/n(1,zaehler))*((1200/1000)/(V_H)); % Mean pressure in cylinder
    n(2,zaehler) = i; % Gang in Matrix eintragen
    if n(1,zaehler) >= 3000
        i = i + 1;
    elseif n(1,zaehler) <= 1500
        i = i - 1;
    end
end


Hoffe das passt so. Hab' ich eben schnell runtergeschrieben & nicht getestet. Und muss je nachdem wie der Geschwindigkeitsvektor aussieht dann auch angepasst werden (oben und innerhalb der Formel natürlich auch).

Grüße
Jonas
_________________

1.) Ask Google & Matlab Documentation
2.) Ask gomatlab.de & Technical Support of MathWorks
3.) Go mad, your problem is unsolvable

Zuletzt bearbeitet von J0nas am 06.08.2018, 12:57, insgesamt 4-mal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
SparX
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 47
Anmeldedatum: 11.07.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.08.2018, 12:41     Titel:
  Antworten mit Zitat      
Vielen Dank, das werde ich gleich einmal probieren.
Liefert die if-Schleife für i dann den Wert i(2) oder 2? Da der Startgang ja eigentlich i=i(1) und nicht i=1 ist.

Gruß,
SparX
Private Nachricht senden Benutzer-Profile anzeigen
 
J0nas
Forum-Century

Forum-Century


Beiträge: 208
Anmeldedatum: 10.09.15
Wohnort: ---
Version: ab 2016a
     Beitrag Verfasst am: 06.08.2018, 12:56     Titel:
  Antworten mit Zitat      
Momentan i = 1. Falls anders gewünscht ist das ja eine kurze Anpassung Wink

Grüße
Jonas
_________________

1.) Ask Google & Matlab Documentation
2.) Ask gomatlab.de & Technical Support of MathWorks
3.) Go mad, your problem is unsolvable
Private Nachricht senden Benutzer-Profile anzeigen
 
SparX
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 47
Anmeldedatum: 11.07.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.08.2018, 13:50     Titel:
  Antworten mit Zitat      
Okay, ich habe den Code einmal wie folgt angepasst:

Code:
i = i(1); % Startgang
n = zeros(2,length(v))
p = zeros(1,length(v))
for zaehler = 1 : length(v) % Hier deinen Geschwindigkeitsvektor eintragen, weiß nicht wie der aussieht.
    n(1,zaehler)=(v(zaehler)*60*i)/(2*pi*r); % RPM
    p(1,zaehler)=(P/n(1,zaehler))*((1200/1000)/(V_H)); % Mean pressure in cylinder
    n(2,zaehler) = i; % Gang in Matrix eintragen
    if n(1,zaehler) >= 3000
        i = i(i + 1);
    elseif n(1,zaehler) <= 1500
        i = i(i - 1);
    end
end


Irgendetwas stimmt dabei noch nicht ganz, da ich folgenden Fehlermeldung bekomme:

Code:
Unable to perform assignment because the size of the left side is 1-by-1 and the size of
the right side is 1186-by-1.

Error in Kraftstoffverbrauch_mit_Getriebestufen_Test (line 134)
    p(1,zaehler)=(P/n(1,zaehler))*((1200/1000)/(V)); % Mean pressure in
    cylinder


Gruß,
SparX

Zuletzt bearbeitet von SparX am 06.08.2018, 14:13, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
J0nas
Forum-Century

Forum-Century


Beiträge: 208
Anmeldedatum: 10.09.15
Wohnort: ---
Version: ab 2016a
     Beitrag Verfasst am: 06.08.2018, 14:06     Titel:
  Antworten mit Zitat      
Kann's sein, dass P auch ein Vektor ist? Dann musst da auch noch auf die einzelnen Einträge zugreifen.

Grüße
Jonas
_________________

1.) Ask Google & Matlab Documentation
2.) Ask gomatlab.de & Technical Support of MathWorks
3.) Go mad, your problem is unsolvable
Private Nachricht senden Benutzer-Profile anzeigen
 
SparX
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 47
Anmeldedatum: 11.07.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.08.2018, 14:11     Titel:
  Antworten mit Zitat      
Ja, P is auch ein Vektor. Ich habe mal die Schleife nur für die Drehzahl laufen lassen:

Code:
i = i(1) % Startgang
length(v)
for zaehler=1:length(v)
    n(zaehler)=(v(zaehler)*60*i)/(2*pi*r);
    if n(zaehler) >= 3000
         i = i +1;
     elseif n(zaehler) <= 1500
         i = i - 1;
     end

end


Und bekomme dafür die Fehlermeldung

Code:
Index exceeds array bounds.

Error in Kraftstoffverbrauch_mit_Getriebestufen_Test (line 122)
    n(1,zaehler)=(v(zaehler)*60*i)/(2*pi*r);


v hat dabei die Länge 1186. Auch ist die Definition von i in der Schleife noch nicht richtig.

Gruß,
SparX

Zuletzt bearbeitet von SparX am 06.08.2018, 14:22, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
J0nas
Forum-Century

Forum-Century


Beiträge: 208
Anmeldedatum: 10.09.15
Wohnort: ---
Version: ab 2016a
     Beitrag Verfasst am: 06.08.2018, 14:22     Titel:
  Antworten mit Zitat      
v ist ein 1186x1 oder 1x1186 Array mit nummerischen Werten?

Wenn ich mir so einen Vektor für v erstellen lasse und dann den Code durchlaufen lasse, kommt kein Fehler.

Grüße
Jonas
_________________

1.) Ask Google & Matlab Documentation
2.) Ask gomatlab.de & Technical Support of MathWorks
3.) Go mad, your problem is unsolvable
Private Nachricht senden Benutzer-Profile anzeigen
 
SparX
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 47
Anmeldedatum: 11.07.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.08.2018, 14:27     Titel:
  Antworten mit Zitat      
v ist ein 1186x1 Vektor.

Stimmt die Definition

Code:
 if n(zaehler) >= 3000
         i = i +1;
     elseif n(zaehler) <= 1500
         i = i - 1;
     end
 


dennoch für einen i(k)-Vektor oder muss sie dann auch umgeschrieben werden wie bspw.

Code:

k=1
for zaehler=1:length(v)
    n(zaehler)=(v(zaehler)*60*i(k))/(2*pi*r);
    if n(zaehler) >= 3000
         k = k + 1;
     elseif n(zaehler) <= 1500
        k = k - 1;
     end

end

 



Gruß,
SparX
Private Nachricht senden Benutzer-Profile anzeigen
 
J0nas
Forum-Century

Forum-Century


Beiträge: 208
Anmeldedatum: 10.09.15
Wohnort: ---
Version: ab 2016a
     Beitrag Verfasst am: 07.08.2018, 07:54     Titel:
  Antworten mit Zitat      
Hi SparX,

muss natürlich auch umgeschrieben werden.

Grüße
Jonas
_________________

1.) Ask Google & Matlab Documentation
2.) Ask gomatlab.de & Technical Support of MathWorks
3.) Go mad, your problem is unsolvable
Private Nachricht senden Benutzer-Profile anzeigen
 
SparX
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 47
Anmeldedatum: 11.07.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.08.2018, 08:24     Titel:
  Antworten mit Zitat      
Hi J0nas,

ich bekomme noch den selben Fehler wie gestern. Auch wenn ich die Schleife umschreibe wie in meinem Post oben drüber mit i(k).

Mir ist gerade aufgefallen, dass die ersten zwei Einträge meine v-Vektors "NaN"-Einträge sind. Aber wenn ich die Schleife von Position 3 aus starten lasse

Code:
zaehler=3:length(v_NEFZ_mean)


bekomme ich auch diesen Fehler. Allerdings funktioniert die Schleife für ein eigenes Beispiel mit v als 25x1 Vektor. Liegt das das tatsächlich nur an den NaN-Einträgen?

Das ist allerdings eines meiner letzten Probleme, die ich noch lösen muss. Der Rest der Programmierung sollte danach kein Problem mehr sein Smile

Gruß,
SparX
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

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