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

Rechengenauigkeit???

 

Evron
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 51
Anmeldedatum: 22.11.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.02.2010, 16:13     Titel:
  Antworten mit Zitat      
Hallo,

schön gerade diese Diskussion zu finden, da ich gerade gleiches Problem habe und somit erinnert ihr mich an den Grund, der mir irgendwie schön völlig entfallen war. Aber für den Fall, dass jemand mal das gleich Problem hat, will ich es kurz ausführen.
Ein Rechner arbeitet mit Binärzahlen, d.h. alle Zahl werden durch eine Summe von Zweierpotzenzen dargestellt. So ist z.B. 35 = 1*2^5 + 1*2^2 + 1*2^0, was 100011 entspricht. Bei Zahlen kleiner 0 werden sie durch Summation von Zweierpotzen mit negativem Exponenten dargestellt, dass wird entsprechend schwierig, wenn man das z.B. mit der 0,3 versucht, dann wird daraus 0,010011...

Einzige Lösung, wie Harald schon meinte scheint einfach nur zu versuchen mit Werten größer 0 zu arbeiten also entsprechend zu multiplizieren.
Private Nachricht senden Benutzer-Profile anzeigen


Drover
Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 31.08.20
Wohnort: Pfalz
Version: R2020a
     Beitrag Verfasst am: 31.08.2020, 15:50     Titel: Problem Verstanden, Lösung nicht in Sicht ^^
  Antworten mit Zitat      
Guten Tag,

nachdem ich seit 2 Wochen an einer Simulation sitze und mich die ganze Zeit um das Hauptproblem gedrückt habe bzw. keine Idee hatte an was es liegen könnte hat mir dieser Thread schonmal geholfen zu wissen wieso. Nur das Problem bleibt:

Ich bin dabei eine Thermische Trennung zu simulieren die (zu Forschungszwecken) in einem geschlossenen System (Rektifikationskolonne) stattindet. Um nicht zu sehr mit details zu langweilen: Es geht nichts rein und nichts raus, die Stoffströme laufen nur im Kreis. Wenn ich jetzt die Ströme in der Kolonne berechne muss! das was oben rausgeht genau dem entsprechen was unten wieder reingeht sonst kann sich nie ein Gleichgewicht einstellen.
Code:

VK=0.01890000000; %Dampfstrom nach oben
LK=0.01574; %Rücklauf nach unten
D=0.00316; % Kreislauf vom Kopf zum Boden
Test=LK+D
Test2=VK-LK-D
 

Dieses kurze Beispiel zeigt mir für "Test" den Wert "0.018900000000000", für Test 2 aber "-4.336808689942018e-19" an. Ich bekomme bei minimaler Änderung einiger Eingangsparameter die verrücktesten Ergebnisse, weil das Modell nicht funktionieren kann, wenn die Menge der Flüssigkeit in der Kolonne größer oder kleiner wird.

Viel Text um zu sagen ich verstehe das Problem mit dem binären Rechnen der Programmiersprache, aber hat jemand ne Idee wie ich in meinem Fall damit umgehen könnte ?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

daran, dass hier eine Differenz ungleich 0 herauskommt, lässt sich nur zuverlässig etwas ändern, wenn man mit symbolischen Zahlen arbeitet.
Die Frage dürfte aber eher sein: inwiefern genau bereitet diese Ungenauigkeit ein Problem bzw. was sind die Berechnungen, die mit diesen Variablen durchgeführt werden?

Wenn ich an Gramm als Einheit denke, dann dürfte die Ungenauigkeit in der Größenordnung eines Atoms sein.

Eine Alternative kann ein Wechsel der Einheit sein. Wenn ich z.B. an µg statt g denke, dann ist die Rechnung exakt, da kleine ganze Zahlen im Binärsystem eine exakte Darstellung haben:
Code:
VK= 18900; %Dampfstrom nach oben
LK= 15740; %Rücklauf nach unten
D=  3160; % Kreislauf vom Kopf zum Boden
Test=LK+D
Test2=VK-LK-D


Sich darauf zu verlassen, dass nicht doch irgendwo Dezimalzahlen ins Spiel kommen, halte ich aber für ziemlich riskant.

Grüße,
Harald

P.S.: nein, alle Zahlen mit 1e6 multiplizieren wird das Problem allgemein nicht lösen, da dort die Ungenauigkeit erhalten bleiben kann.
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Drover
Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 31.08.20
Wohnort: Pfalz
Version: R2020a
     Beitrag Verfasst am: 31.08.2020, 20:43     Titel:
  Antworten mit Zitat      
Hallo nochmal,

danke vielmals für die Antwort und den Tipp mit den symbolischen Zahlen , das werde ich mir näher anschauen, auch war ein Ansatz die Zahlen eventuell bei jeder Iteration zu runden und dafür zu sorgen das die Rechnung so aufgeht.
Habe natürlich irgendwie doch noch gehofft das ich nur nen dummen Denkfehler habe und man matlab einfach sagen kann was man möchte ^^
Ich wollte nicht zu sehr ins Detail gehen, ist ja ein matlab Forum und keines der Verfahrenstechnik Wink aber der Vollständigkeit halber:
Ich bekomme wenn ich versuche Gleichgewichte zu berechnen bei einer Veränderung der Eingangsparameter zum Teil negative Lösungen(nicht möglich) / unrealistische Ergebnisse oder Warnungen das die "Matrix close to singular or badly scaled" ist. Da durch die ungleichen Ströme in einem theoretisch ideal geschlossenen System dann einfach "Stoff A" irgendwann fehlt/größer/kleiner wird denke ich mir kann fsolve hier einfach keine vernünftigen Lösungen für einen stationären Zustand finden.

In meinem Fall berechnet sich LK und D normalerweise aus dem Dampfstrom und dem Rücklaufverhätlnis in der Kolonne.
Code:

r=5;                %Rücklaufverhältnis
VK=0.01890000000;          %Dampfstrom in der Kolonne (Vereinfacht festgelegt aus vorheriger berechnung); [mol/s]
LK=r*(VK/(r+1))    %Flüssigkeitsstrom in Kolonne = Rücklauf [mol/s]
D=VK-LK            %Destillat-Volumenstrom in [mol/s]
 


und diese Angaben werden gebraucht um über fsolve Gleichgewichtszustände auf jedem Boden der Kolonne zu berechnen.

Code:
%exemplarisch:
y=alpha*x./(1+(alpha-1)*x); %Gleichgewicht
Res=zeros(NS,1);
Res(1)=VK*y(2)-(D+LK)*x(1); %Kopf
%....
 


Ein Wechsel der Einheiten kommt im Prinzip zwar in Frage, aber da ich, sobald ich tiefer in die dynamische Simulation gehe / die Vorgänge genauer beschreiben will, sowieso genauere Werte mit Nachkommastellen bekomme ist die Frage in wie weit mir geholfen wäre.


Gruß
Alex
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 31.08.2020, 21:23     Titel:
  Antworten mit Zitat      
Hallo,

ist für mich schwierig nachvollziehbar, insbesondere ist mir nicht klar, wie die Zeitdynamik ins Spiel kommt. Eine Möglichkeit kann sein, bei beispielsweise drei Stoffen die Menge des dritten nicht über welche Gleichungen auch immer, sondern über
Code:
Stoff3 = Gesamtmenge - Stoff1 - Stoff2

zu berechnen. Dann bleibt der Fehler in sehr engen Grenzen.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Drover
Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 31.08.20
Wohnort: Pfalz
Version: R2020a
     Beitrag Verfasst am: 01.09.2020, 11:23     Titel:
  Antworten mit Zitat      
Guten morgen,

nachdem ich noch gefühlt 100 Möglichkeiten ausprobiert habe und die Werte auf verschiedene Art und Weisen berechnet oder als symbolisch definiert oder oder oder habe, habe ich die Zeile die mein Gleichgewicht im Kopf der Kolonne beschreibt der Übersichtlichkeit halber mal umgeschrieben und siehe da:
Für Matlab scheint
Code:

-(D+LK)*x(1)
 

nicht das gleiche zu sein wie :
Code:
-LK*x(1)-D*x(1)

Aus welchem Grund auch immer..., jedenfalls liefert mir fsolve jetzt keine Fantasiewerte mehr die rein physikalisch keinen Sinn machen.

Danke Harald für´s damit befassen, bin mir sicher auch wenn ich den Fehler jetzt erstmal weg habe werden mir das Hintergrundwissen und die Tipps nochmal helfen Very Happy

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

Gehe zu Seite Zurück  1, 2

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.