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 bei Darstellung einer Funktion mit mesh

 

GetBack
Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 19.11.08
Wohnort: Cottbus
Version: ---
     Beitrag Verfasst am: 19.11.2008, 11:46     Titel: Problem bei Darstellung einer Funktion mit mesh
  Antworten mit Zitat      
Hallo,

ich bin neu hier im Forum und hab erst vor einer Weile angefangen mich mit Matlab zu beschäftigen.
Nun zu meinem Problem: ich soll eine Funktion in Abhängigkeit von zwei Variablen darstellen.

Hier mein Code zur Ausgabe der Funktion:
Code:
clear all; clc;
V=1000; k=0.75;
[d,c]=meshgrid(0:0.1:20,0:0.1:10);
O=2.*d.*(V./(d-c)./c+c+2*k);
mesh(d,c,O);


Um mein Problem besser darzustellen, hier noch ein paar Erklärungen:
Die Funktionen O stellt den Materialverbrauch eines Tetra-Briks (allgemeine Bezeichnung für eine ziegelförmige Tetra-Pak Verpackung) für ein Fassungsvermögen V (in diesem Beispiel 1 Liter) dar.
Die Variable k ist die Breite des Klebefalzes. Der Materialverbrauch ist abhängig von der Schlauchbreite d (denn ein Tetra-Brik wird aus einem Schlauch gefaltet) und der Tiefe c.

Aufgabenstellung ist demnach, einen minimalen Materialaufwand O zu berechnen und zur besseren Verdeutlichung die Funktion grafisch darzustellen. Als Nebenbedingung kann man noch ableiten, dass 0<c<d/2 gelten muss.

Das Minimum läßt sich ja recht einfach über den folgenden Befehl berechnen:
Code:
[x,O_opt] = fminsearch(@(x) tetrabrik(x,1000,k),[16,8])


wobei die Funktion tetrabrik bei mir so aussieht:
Code:
function O = tetrabrik(x,V,k)
% Oberfläche eines Tetra-Brik mit x=(Schlauchbreite d, Tiefe c), Volumen V und Klebefalz k
a=x(1)-x(2);
b=V/(a*x(2));
O=2.*x(1)*(b+x(2)+2.*k);

Damit bekomme ich heraus, dass das Minimum bei d=17.6161 und c=6.2756 angenommen wird und der optimale Verpackungsaufwand bei 769.0052 cm² liegt. Laut meinem Professor sollen diese Werte auch stimmen.

Wenn ich mir allerdings den mesh ansehe, dann kann ich gar nichts davon ablesen.

Wenn ich die Funktion umstelle, dann erhalte ich wenigstens eine ordentliche Ausgabe.
Code:
clear all; clc;
V=1000; k=0.75;
[d,c]=meshgrid(0:0.1:20,0:0.1:10);
O=2.*d.*(d-c).*c.*(V+(d-c).*c.*(c+2*k));
mesh(d,c,O);

Aber mein Problem ist, dass ich dann nicht nachvollziehen kann das an der beschriebenen Stelle das Minimum angenommen wird.
Außerdem hatte ich noch folgende Überlegungen:

1. Wenn d gegen Null geht, dann müßte O immer größer werden, da ja immer noch ein Fassungsvermögen von beispielsweise 1 Liter verpackt werden soll

und

2. gilt die gleiche Überlegung für die Tiefe c.

Also meiner Meinung nach, gibt keine der beiden Ausgaben diesen Sachverhalt korrekt wieder und wenn ich mir bei der zweiten Ausgabe (die mit der umgestellten Funktion) das Optimum anschaue, dann schaut es auch nicht korrekt aus.

Meine Frage nun: mache ich irgendwas falsch oder muss ich die Ausgabe doch irgendwie anders angehen?

Ich hoffe ihr könnt mir da helfen.

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


Maddy
Ehrenmitglied

Ehrenmitglied



Beiträge: 494
Anmeldedatum: 02.10.08
Wohnort: Greifswald
Version: ---
     Beitrag Verfasst am: 19.11.2008, 13:17     Titel:
  Antworten mit Zitat      
Die verwendete Funktion zum plotten des mesh scheint mir falsch. Der Fehler liegt wohl beim Ausklammern von 1/((d-c)*c)?
_________________

>> why
The computer did it.
Private Nachricht senden Benutzer-Profile anzeigen
 
GetBack
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 19.11.08
Wohnort: Cottbus
Version: ---
     Beitrag Verfasst am: 19.11.2008, 13:52     Titel: Mein Fehler
  Antworten mit Zitat      
stimmt, da hast du recht...
also bleibt nur die 1. Ausgabe, mit der ich aber nichts anfangen kann.
Private Nachricht senden Benutzer-Profile anzeigen
 
Bijick
Ehrenmitglied

Ehrenmitglied



Beiträge: 914
Anmeldedatum: 18.06.07
Wohnort: Nürnberg
Version: R2006b, R2008b
     Beitrag Verfasst am: 19.11.2008, 14:16     Titel:
  Antworten mit Zitat      
Hallo GetBack,

dieser Code führt bei mir zu einer einigermaßen guten Veranschaulichung.

Code:
[d,c]=meshgrid(0:0.1:20,0:0.1:10);
O=2.*d.*(V./(d-c)./c+c+2*k);

subplot(1,2,1)
[C,h] = contour(c,d,O,[770,800,900,1200]);
clabel(C,h,'LabelSpacing',240)
axis equal
xlim([0 10]),ylim([0,20])

subplot(1,2,2)
[d,c]=meshgrid(10.2:0.2:20,0.2:0.2:10);
O=2.*d.*(V./(d-c)./c+c+2*k);
mesh(c,d,O)
caxis([750 1200])


Das größte Problem entsteht auf der Geraden d=c, weil da für die Berechnung von O durch Null geteilt wird. Als Wert ergibt sich Inf, was die Grafik dominiert.

Herzliche Grüße
Bijick
_________________

>> why
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
GetBack
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 19.11.08
Wohnort: Cottbus
Version: ---
     Beitrag Verfasst am: 19.11.2008, 15:17     Titel: Super
  Antworten mit Zitat      
vielen lieben Dank Laughing, das sieht schon mal sehr gut aus.

Also stimmte die Ausgabe, aber durch die Inf-Werte hab ich nichts davon gesehen. Idea

Das ist eine super Idee dem aus dem Weg zu gehen, indem man diese in der Ausgabe umgeht und damit also nur einen rechteckigen Ausschnitt aus der Anfangsausgabe nimmt.

Kriegt man es irgendwie hin, dass man nur den positiven Teil der O-Werte plottet?

Ist aber nur so eine Idee.

Viele Grüße GetBack
Private Nachricht senden Benutzer-Profile anzeigen
 
Bijick
Ehrenmitglied

Ehrenmitglied



Beiträge: 914
Anmeldedatum: 18.06.07
Wohnort: Nürnberg
Version: R2006b, R2008b
     Beitrag Verfasst am: 19.11.2008, 15:59     Titel:
  Antworten mit Zitat      
Hallo,

was meinst Du denn mit positiv? Es sind doch alle O-Werte > 0.

Herzliche Grüße
Bijick
_________________

>> why
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
GetBack
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 19.11.08
Wohnort: Cottbus
Version: ---
     Beitrag Verfasst am: 19.11.2008, 16:17     Titel:
  Antworten mit Zitat      
Ich meine, wenn man sich das ganze O anschaut:
Code:
[d,c]=meshgrid(0:0.1:30,0:0.1:15);
O=2.*d.*(V./(d-c)./c+c+2*k);

Ist es da irgendwie möglich, die negativen und die Inf bzw. NaN Werte auszublenden?

GetBack
Private Nachricht senden Benutzer-Profile anzeigen
 
Bijick
Ehrenmitglied

Ehrenmitglied



Beiträge: 914
Anmeldedatum: 18.06.07
Wohnort: Nürnberg
Version: R2006b, R2008b
     Beitrag Verfasst am: 19.11.2008, 16:47     Titel:
  Antworten mit Zitat      
Hallo GetBack,

NaN und negative Werte kommen nicht vor, die Infs könnte man mit

Code:


löschen, aber das bringt nix, weil die angrenzenden Werte auch unverhältnismäßig groß sind (kannst Du Dir ja mal anschauen).

Für mesh hilft wohl wirklich nur ausschneiden, aber der contour-plot zeigt ja ganz O an (wenn auch nur mit ausgewählten Konturlinien).

Herzliche Grüße
Bijick
_________________

>> why
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
GetBack
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 19.11.08
Wohnort: Cottbus
Version: ---
     Beitrag Verfasst am: 19.11.2008, 16:54     Titel:
  Antworten mit Zitat      
Ich hab es jetzt selber hinbekommen indem ich zwei FOR-Schleifen (einmal über die Zeilen und dann noch über die Spalten) genommen habe und über das gesamte O gegangen bin.
Dabei hab ich jedesmal überprüfen lassen, ob der Wert an dieser Stelle Inf ist oder die Spaltennummer kleiner gleich der Zeilennummer ist. Wenn das zutrifft wird dieser Wert auf NaN gesetzt.
Code:
for i=1:151 for j=1:301 if(O(i,j)==Inf || j<=i) O(i,j)=NaN; end; end; end;

Somit werden alle "uninteressanten" Werte einfach entfernt und ich erhalte eine Grafik die ein bißchen aussieht wie der Bug eines Bootes, da 1. die Funktion für c gegen 0 gegen unendlich geht und 2. die Funktion für c gegen d auch gegen unendlich geht.

Ein herzliches Danke geht an Bijick für die tolle und schnelle Hilfe.
Private Nachricht senden Benutzer-Profile anzeigen
 
dib0r
Forum-Guru

Forum-Guru


Beiträge: 413
Anmeldedatum: 09.05.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.11.2008, 19:34     Titel:
  Antworten mit Zitat      
Hallo,

das sollte doch auch ohne Schleifen gehen (wird dadurch etwas schneller).

Code:
O_neu = tril(nan(size(O)))+O;
O_neu(isinf(O_neu)) = NaN;


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