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

Plot ist leer

 

eh27
Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 31.03.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.03.2016, 10:38     Titel: Plot ist leer
  Antworten mit Zitat      
Hallo zusammen,

ich verwende folgenden Code doch der Plot ist leer. Die Dimensionen an den Achsen stimmen und die Ergebnisse werden auch berechnet.

Wäre super wenn mir jemand sagen könnte, wo der Fehler liegt.

Code:

for (alphai=0:1:3600)
  if alphai>360
  alphai=alphai
      kw_ungerundet=alphai/360
  kw=alphai-(floor(kw_ungerundet)*360)
else
    kw=alphai
end
  plot (alphai,kw)
  hold on
end
format long

xlabel('alpha_i')
ylabel('° Kurbelwelle')
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 31.03.2016, 11:04     Titel:
  Antworten mit Zitat      
Hallo,

kw wird ständig überschrieben, ist also am Ende nur ein einziger Wert. Der Plot ist vermutlich nicht ganz leer, sondern ein Punkt ist markiert (schwer zu sehen).

So ginge es:
Code:
alphai=0:1:3600;
kw = zeros(size(alphai));
for k = 1:numel(alphai)
    if alphai(k)>360
        kw_ungerundet=alphai(k)/360;
        kw(k)=alphai(k)-(floor(kw_ungerundet)*360);
    else
        kw(k)=alphai(k);
    end
end
plot (alphai,kw)


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 31.03.2016, 13:24     Titel: Re: Plot ist leer
  Antworten mit Zitat      
Hallo eh27,

Ein paar Kommentare zum Code:
Code:
% alphai=alphai - Das ist sinnfrei.
% format long - Setze das nicht innerhalb eines Files, sondern nur global
 

Der Code selbst lässt sich abkürzen:
Code:
alphai = 0:3600;
kw = rem(alphai - 2, 360) + 1;
plot(alphai, kw);

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
eh27
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 31.03.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.04.2016, 11:12     Titel:
  Antworten mit Zitat      
Vielen Dank, das hat so funktioniert.

Ich stehe aber jetzt vor dem nächsten Problem.

Ich wollte die Schrittweite von 1 auf 0.01 erhöhen und möchte die Volumenänderung pro Schritt und die Arbeitsänderung ausdrücken ( Zeile 33 und 34 )

Es macht aber einen Fehler in Zeile 33:

"Attempted to access V_Z1(0); index must be a positive integer or logical.

Error in Arbeitspiele (line 33)
dV_Z1(k)=V_Z1(k)-V_Z1(k-1);"

Ich hoffe ich kann das hier so machen? Oder sollte es in einen neuen Beitrag?

Vielen Dank für eure Hilfe im Voraus!!!

Code:

ainput=input(['\n\n Anzahl Arbeitsspiele']);
kolbenwegmax=2*pi*0.057;
A_kolben=0.03*0.03;
V_max=kolbenwegmax*A_kolben;
p_Umg=101325; %Umgebungsdruck in pascal
T_Umg=293.75; %Umgebungstemperatur in Kelvin
kappa=1.4;
c_p=1005; %
c_v=718; %
R=287; %
p_Z2=101325;
VE_Z1_offen=330; %Ventil Zylinder 1->2 auf
VE_Z1_zu=350; %Ventil Zylinder 1 zu
A_VE1=0.00005; % Ventinquerschnitt in m^2
dt=1/(6*2400*100); % dt=1/6n * 100 für 1/100°KW
if isempty(ainput)
    ainput=10;
end
alphai=0:0.01:(ainput*360);
kw = zeros(size(alphai));
for k = 1:numel(alphai)
    if alphai(k)>360
        kw_ungerundet=alphai(k)/360;
        kw(k)=alphai(k)-(floor(kw_ungerundet)*360);
    else
        kw(k)=alphai(k);
    end
end

for k = 1:numel(alphai)
    s_k(k)=kolbenwegmax*(kw(k)/360);
    V_Z1(k)=A_kolben*(s_k(k)-kolbenwegmax)*(-1);
    dV_Z1(k)=V_Z1(k)-V_Z1(k-1);
    dW_1(k)=dV_Z1(k)*p_Z1(k);  
    if kw(k)<VE_Z1_offen
        p_Z1(k)=p_Umg/((V_Z1(k)/V_max)^kappa);
        T_Z1(k)=T_Umg/((p_Umg/p_Z1(k))^((kappa-1)/kappa));
        pi_druck(k)=p_Z2/p_Z1(k);
        if pi_druck(k)<0.52
           pi_druck(k)=0.52;
        end  
        c_s(k)=2*c_p*T_Z1(k)*pi_druck(k); %Schallgeschwindigkeit
        rho_1(k)=p_Z1(k)/(T_Z1(k)*R); % Dichte 1
        rho(k)=rho_1(k)*pi_druck(k); %Dichte Strömung 1->2
        m_punkt=c_s(k)*rho(k)*A_VE1;
    elseif kw(k)>=VE_Z1_offen && kw(k)<VE_Z1_zu
        p_Z1(k)=500;
        pi_druck(k)=p_Z2/p_Z1(k);  
       
    else
        p_Z1(k)=0;
    end
end

%figure('Name', 'Druckverlauf Zylinder 1')
%scatter(kw,p_Z1,1,'r')
%figure('Name', 'Volumen Zylinder 1')
%scatter(kw,V_Z1,1,'g')
%figure('Name', 'Temperaturverlauf Zylinder 1')
%scatter(kw,T_Z1,1,'y')
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 05.04.2016, 12:14     Titel:
  Antworten mit Zitat      
Hallo,

die Fehlermeldung besagt ja, was das Problem ist: zum ersten Wert gibt es keinen Vorgänger, zu dem du den vorherigen Wert berechnen kannst.

Du kannst da auch direkt diff oder gradient verwenden.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
eh27
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 31.03.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.04.2016, 12:45     Titel:
  Antworten mit Zitat      
Hallo

Danke.

Wenn ich
Code:
dV_Z1(k)=diff(V_Z1(k))/dt;
verwende, dann kommt "In an assignment A(I) = B, the number of elements in B and I must be the same.

Error in Arbeitspiele (line 33)
dV_Z1(k)=diff(V_Z1(k))/dt;"

wenn ich das (k) weglasse, dann rechnet er ewig ohne Ergebnis.

Ich möchte das dV_Z1 die Differenz aus V_Z1(k) und VZ1(k+1) ist.
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 05.04.2016, 15:59     Titel:
  Antworten mit Zitat      
Hallo eh27,

Bitte lies die Dokumentation von diff durch, wenn Du ein Problem damit hast. Es berechnet duie Differenz zwischen aufeinanderfolgenden Werten eines Vektors. Wenn Du aber mit "V_Z1(k)" nur ein Element angibst, wozwischen könnte dann die Differenz berechnet werten?

Eine Lösung wäre die Schleife einfach erst bei 2 beginnen zu lassen. Die andere wäre wie schon vorgeschlagen diff oder besser gradient vor der Schleife zu verwenden:
Code:
dV_Z1 = gradient(V_Z1, /dt);

Dies ist der zweiseitige Differenzen-Quotient und damit numerisch stabiler als diff .

Das ist nicht nur schneller als die Schleife, sondern auch hübscher und damit wenige anfällig für Bugs. Vergleiche:
Code:
dV_Z1 = gradient(V_Z1, /dt);

und
Code:
dV_Z1(1) = 0;
for k = 2:length(V_z1)
  dV_Z1(k) = (V_Z1(k-1) - V_Z1(k)) /dt;
end

Mit dieser Methode, der "Vektorisierung", könnte man Deinen gesamten Code deutlich vereinfachen. Darum empfehle ich Dir, das zu üben.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
eh27
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 31.03.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.04.2016, 19:58     Titel:
  Antworten mit Zitat      
Dankeschön. Das funktioniert jetzt. Ich hatte es mit
Code:
dV_Z1 = gradient(V_Z1, /dt);
versucht, allerdings erhalte ich den benötigten Wert für
Code:
dV_Z1 = gradient(V_Z1);


ich erhalte jetzt jedoch folgenden Fehler:
In an assignment A(I) = B, the number of elements in B and I must be the same.

Error in Arbeitspiele (line 51)
dW_Z1(k)=dV_Z1*p_Z1(k); %Volumenänderungsarbeit Z1

Ich habe noch ein weiteres Problem.

Ab dem Loop Bereich elseif wird ein Ventil geöffnet und es strömt ein Gas über. Dazu berechne ich eine Temperatur und Druckänderung. dT und dp

Als Start Temperatur / Druck soll der letzte Wert im if Bereich sein und dann wird nach jedem Schritt im Loop der aktuelle Druck / Temp. mit dem dp und dT addiert und es ergibt sich ein neuer Wert für Druck / Temperatur.

Ich hatte versucht p_Z1(k)=p_Z1(k-1)+dp_Z1, allerdings erfolgt keine Berechnung. Als Ergebnis zeigt es NaN an, Fehlermeldung bringt es aber keine.

Ich habe im Anhang mal ein Excel zum nachvollziehen meines Problems.

Vielen Dank!

Ausgleich.xls
 Beschreibung:

Download
 Dateiname:  Ausgleich.xls
 Dateigröße:  161 KB
 Heruntergeladen:  345 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 05.04.2016, 22:15     Titel:
  Antworten mit Zitat      
Hallo eh27,

Zitat:
In an assignment A(I) = B, the number of elements in B and I must be the same.
dW_Z1(k)=dV_Z1*p_Z1(k); %Volumenänderungsarbeit Z1

dV_Z1 ist nun ein Vektor. Wenn Du alle seine Elemente mit p_Z1(k) multiplizierst, bekommst Du wieder einen Vektor. Danach versuchst Du ihn aber dem Skalar dQ_Z1(k) zu zu weisen. Das muss natürlich scheitern.

Wenn Dein Code einen Fehler hat, lohnt es sich einen breakpoint in die entsrpechende Zeile zu setzen und das Programm nochmal zu starten. Wenn Matlab dann stoppt, kannst Du die Dimensionen der Variablen untersuchen und so das Problem identifizieren.
Debuggen ist effizienter als jedes Problem im Forum zu posten.

Damit kannst Du auch heraus bekommen, warum NaNs als Werte auftauchen, obwohl Du das nicht erwartest.

Gruß, Jan
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 - 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.