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

Matlab Block value not assigned

 

Daewun
Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 08.06.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.08.2013, 11:40     Titel: Matlab Block value not assigned
  Antworten mit Zitat      
Hallo,

Ich habe ein kleines Problem bezüglich eines Matlab Blockes. Generell sollte er nur aus 2 Konstanten und der Simulationszeit eine Übertragungsfunktion machen.

Wenn ich die geschriebene Funktion ganz normal in Matlab laufen lasse, kommen die Werte herraus, die herraus kommen sollen, in Simulink bekomm ich allerdings die Fehlermeldung:
Output argument 'Cj' is not assigned on some execution paths.

Was die Fehlermeldung mir sagen möchte ist mir klar, aber warum funktioniert es in Matlab aber nicht in Simulink ?

Der Code der funktion ist:
Code:
function Cj  = Cj(min,max,t)
i=0;
while t-i*0.0125>=0
    i=i+1;
end
if t-(i-1)*0.0125<=0.005  
Cj=max*(min/max)^((1-exp(-(t-(i-1)*0.0125)/0.0025))/(1-exp(0.005/0.0025)));
end
if t-(i-1)*0.0125>0.005
    Cj=min*(max/min)^((1-exp(((t-(i-1)*0.0125)-0.005)/0.0075))/1-exp((0.0125-0.005)/0.0025));
end
end


die Einbindung in Simulink habe ich angehangen
Gruß Daewun

Kreislauf.PNG
 Beschreibung:

Download
 Dateiname:  Kreislauf.PNG
 Dateigröße:  9.18 KB
 Heruntergeladen:  611 mal
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


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

probiers mal damit:

Code:
function Cj  = Cj(min,max,t)
i=0;
while t-i*0.0125>=0
    i=i+1;
end
if t-(i-1)*0.0125<=0.005  
Cj=max*(min/max)^((1-exp(-(t-(i-1)*0.0125)/0.0025))/(1-exp(0.005/0.0025)));
else
    Cj=min*(max/min)^((1-exp(((t-(i-1)*0.0125)-0.005)/0.0075))/1-exp((0.0125-0.005)/0.0025));
end
end


Variablennamen wie min und max würde ich übrigens vermeiden, da man dann nicht mehr auf die Funktionen min und max zugreifen kann.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 08.06.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.08.2013, 12:21     Titel:
  Antworten mit Zitat      
Hallo Harald,

vielen Dank, das scheint soweit zu funktionieren. Jetzt scheint der Ausgangswert gelegentlich 0 zu werden, was ich versucht habe zu verhindern durch eine Bedingung, dass wenn der Ausgang kleiner als 10^-10 wird der Ausgang auf 10^-5 gesetzt.

Allerdings wird er trotzdem noch 0. Zumindest bekomm ich die Fehlermeldung dass der Eingang des Integrators inf oder NaN ist. zu bestimmten Zeitpunkten. Da ich durch dieses Cj teile denke ich dass es da 0 wird.

Aber das sollte doch eigentlich mit der Bedingung nicht mehr passieren oder ?

Ich hab die Einbindung und das faszinierende Ergebnis im Scope mal angehangen. (Meiner Meinung nach passiert das vorher nämlich schonmal)

gruß
Daewun

scope.PNG
 Beschreibung:

Download
 Dateiname:  scope.PNG
 Dateigröße:  22.29 KB
 Heruntergeladen:  605 mal
divide.PNG
 Beschreibung:

Download
 Dateiname:  divide.PNG
 Dateigröße:  6.05 KB
 Heruntergeladen:  624 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

Zitat:
Jetzt scheint der Ausgangswert gelegentlich 0 zu werden, was ich versucht habe zu verhindern durch eine Bedingung, dass wenn der Ausgang kleiner als 10^-10 wird der Ausgang auf 10^-5 gesetzt.

Bitte den entsprechenden Code posten.

Zitat:
Ich hab die Einbindung und das faszinierende Ergebnis im Scope mal angehangen.

Auf dem Scope kann zumindest ich nicht zwischen 0 und 10^-5 unterscheiden. Vielleicht die y-Achse entsprechend anpassen?

Ich würde auch mal den Ausgang des MATLAB-Function Blocks in einen Out Port führen, damit man sich die Werte ansehen kann.

Ein (Minimal-) Beispiel, das man sich anschauen kann, könnte helfen.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 08.06.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.08.2013, 13:11     Titel:
  Antworten mit Zitat      
Also der Code sieht jetzt folgendermaßen aus:
Code:
function Cj  = Cj(min,max,t)
i=0;
while t-i*0.0125>=0
    i=i+1;
end
if t-(i-1)*0.0125<=0.005  
Cj=max*(min/max)^((1-exp(-(t-(i-1)*0.0125)/0.0025))/(1-exp(0.005/0.0025)));
else
    Cj=min*(max/min)^((1-exp(((t-(i-1)*0.0125)-0.005)/0.0075))/1-exp((0.0125-0.005)/0.0025));
end
if Cj<10^(-10)
    Cj=10^(-10);
end
end


theoretisch sollte das ganze Periodisch laufen, deswegen meine Verwunderung.

Die Ergebnisse des outputs hänge ich mal an, sieht aber auf jeden Fall sehr periodisch aus.


Wenn es hilft kann ich auch das gesamte Modell posten, habe es nur aus Übersichtlichkeitsgründen klein gehalten. Ist kein Geheimnis was ich da mache. Es geht um die Simulation eines Herz-Lungenkreislaufes.

simout.PNG
 Beschreibung:

Download
 Dateiname:  simout.PNG
 Dateigröße:  9.39 KB
 Heruntergeladen:  590 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

jedenfalls sieht es nicht so aus, als ob der Output tatsächlich auf 0 geht?

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 08.06.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.08.2013, 11:36     Titel:
  Antworten mit Zitat      
ja, da geht er noch nicht auf 0 aber der eine Schritt danach, das ist mein Gefühl ...

Die Fehlermeldung ist:
Derivative input 1 of 'sijcal/linker Ventrikel /Integrator' at time 0.019 is Inf or NaN. Stopping simulation. There may be a singularity in the solution. If not, try reducing the step size (either by reducing the fixed step size or by tightening the error tolerances)
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

um da weiterhelfen zu können, müsste ich tatsächlich mal das Modell sehen.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 08.06.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.08.2013, 12:21     Titel:
  Antworten mit Zitat      
Ich hoffe, dass es einigermaßen übersichtlich ist ...

subsystem.PNG
 Beschreibung:
Subsystem in dem der Integratoreingang inf oder NaN wird

Download
 Dateiname:  subsystem.PNG
 Dateigröße:  45.4 KB
 Heruntergeladen:  558 mal
Gesamtmodell.PNG
 Beschreibung:
Gesamtmodell

Download
 Dateiname:  Gesamtmodell.PNG
 Dateigröße:  53.48 KB
 Heruntergeladen:  554 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 28.08.2013, 13:50     Titel:
  Antworten mit Zitat      
Hallo,

mit "sehen" meinte ich das Modell an sich und die Möglichkeit, damit herumzuspielen ;)

Wenn du uns ein einfacheres Modell geben kannst, bei dem das Problem auftritt, wäre das natürlich umso besser.

Zumindest müsste man aber wissen, welches Subsystem denn oben abgebildet ist.

Bei Ableitungen kann es übrigens zu numerischen Instabilitäten kommen. Ich würde daher bevorzugt mit Integratoren modellieren.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 08.06.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.08.2013, 14:23     Titel:
  Antworten mit Zitat      
Achso, na das is ja kein Problem, ich hänge das Modell einfach an, ich weiss nur nich ob es reicht die SimulinkDatei anzuhängen.

Ich habe leider kein einfacheres Modell, bei dem das auftritt, is das erste mal das mir das passiert. Ich mache das ganze auch nur aus Übungszwecken und wie sich zeigt ja zu recht, scheinbar hab ich Simulink noch nicht in dem Maß verstanden wie ich es sollte Wink

Die Subsysteme sind alle die selben, sie unterscheiden sich nur in den Eingangssignalen, die daraus abgeleitete Gleichung ist in jedem Subsystem die selbe.

Ja mit Integratoren arbeiten ist geschickter, auch wegen der Kausalität und Wirkungsrichtung des Modells Wink
Private Nachricht senden Benutzer-Profile anzeigen
 
Daewun
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 08.06.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.08.2013, 14:23     Titel:
  Antworten mit Zitat      
huch, Anhang vergessen

sijcal.slx
 Beschreibung:

Download
 Dateiname:  sijcal.slx
 Dateigröße:  23.92 KB
 Heruntergeladen:  292 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 28.08.2013, 19:45     Titel:
  Antworten mit Zitat      
Hallo,

das Problem ist nicht der Nenner, sondern der Zähler. Wenn du da mal einen Scope- oder Display-Block dranhängst, siehst du, dass die Werte gegen unendlich laufen.

Die naheliegendste Ursache dafür ist ein Modellierungsfehler.
Ich würde auch nicht ausschließen, dass sich Ungenauigkeiten durch die Ableitungsblöcke aufschaukeln.

Warum verwendest du eigentlich einen Solver mit fester Schrittweite? Würde ich nicht machen, wenn ich auf der Fehlersuche bin.

Vielleicht hilft dir das schon mal weiter.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 08.06.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.08.2013, 11:52     Titel:
  Antworten mit Zitat      
Hallo,

Ja das hilft mir schon ungemein weiter, vielen Dank. Daran habe ich ehrlich gesagt nicht gedacht, weil es für gewöhnlich doch eher der Nenner ist der gegen 0 geht Wink

Ich nehme auch ganz stark an, dass es sich um einen Modellierungsfehler irgendwo handelt, 2 Fehler habe ich schon gefunden, allerdings helfen die noch nicht an dem Problem...

Den Solver habe ich eigentlich schon wegen später gewählt, ich dachte eigentlich nicht dass es bei der Fehlersuche einen Unterschied macht.

Grüße
Daewun
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

Zitat:
Daran habe ich ehrlich gesagt nicht gedacht, weil es für gewöhnlich doch eher der Nenner ist der gegen 0 geht

Das mag sein, aber du hattest ja ausgeschlossen, dass der Nenner 0 werden kann. Ich hatte übrigens zu Diagnosezwecken ein
Code:
in den MATLAB Function-Block geschrieben um bei jeder Ausführung zu sehen, welche Werte er ausspuckt.

Fixed-Step Solver würde ich nur für Code-Generierung verwenden.
Um zu sehen, welche Einstellungen dabei sinnvoll sind, würde ich die Simulation mit Variable Step Solver laufen lassen und dann an den Einstellungen des Fixed-Step Solvers drehen, bis etwas herauskommt, das den Ergebnissen des Variable-Step Solvers ausreichend gleicht.

Mir ist noch aufgefallen, dass du die Ableitung von Konstanten bildest, die dann logischerweise 0 ist. Ist das gewollt?

Modelliere das ganze doch mal mit Integratoren, vielleicht wird dir dadurch klar, wo das Problem liegt. Oder vielleicht löst sich dadurch auch das Problem - wie gesagt: Ableitungen sind numerisch problematisch.

Wenn du mehrere gleiche Subsysteme in einem Modell hast, würden sich übrigens Modellreferenzen anbieten. Wenn du Änderungen machen möchtest, musst du die Subsysteme ja jeweils anpassen, während du bei Modellreferenzen nur ein Modell warten musst.

Grüße,
Harald
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 - 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.