Ausgabe der max./min. Werte < Matlab < Mathe-Software < Mathe < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 13:41 Mi 08.11.2006 | Autor: | CAS |
Ich habe diese Frage in keinem Forum auf anderen Internetseiten gestellt.
Muss für meinen 3d-Plot eine Legende erstellen, wo der maximalste/ minimalste Punkt als Wert angeben wird (in einem vorgegebenen Intervall). Und dann daraus die absolute/ prozent. Abweichung berechnen und ebenfalls in dieser Legende darstellen.
Habe leider keine große Ahnung über MatLab, würde mich deshalb freuen wenn mir jemand helfen könnte, wie ich dies programmieren könnte.
Schon mal danke dafür.....
|
|
|
|
Hallo,
um eine Legende zu erstellen, benötigst du den Befehl "legend". Dem übergibst du beliebig viele Strings und damit hat es sich.
Für die Umwandlung von Zahlen in Strings gibt es mehrere Möglichkeiten. Hier bietet sich "sprintf" an.
Zur Minimumssuche über zwei Variablen kannst du "fminsearch" benutzen. So etwas wie "fmaxsearch" gibt es nicht, aber dafür kann man wieder "fminsearch" benutzen, wenn man seine Funktion negiert.
Wenn du eine Abweichung berechnen willst, fragt sich natürlich: Was soll wovon abweichen?
Außerdem: Hast du bereits fertige Datenpunkte vorliegen oder gehst du von einer Funktion aus?
Falls du noch Probleme hast, könntest du ja mal ein Beispiel für deine Daten posten und wie du sie plottest.
Gruß
Martin
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 08:22 Do 09.11.2006 | Autor: | CAS |
Danke erstmal für die schnelle Antwort....
also die Werte liegen als Funktion da :
Z= ((2*(X.^4))+(4*(X.^3))-(8*(X.^2))-(7*X)+ 90)+((2*(Y.^4))+(4*(Y.^3))-(8*(Y.^2))-(7*Y)+ 90)
(ähnliche Funktion)
und die Abweichung bezieht sich dann quasi vom maximalsten Punkt (100%) zum minimalsten Punkt eines Intervalls.
Ausplotten tu ich das ganz normal mit "surf".....
|
|
|
|
|
Hallo,
ich denke, es ist doch am einfachsten, einfach innerhalb eines Netzgitters zu suchen, das du zwischen deine Intervallgrenzen spannst. Wenn es fein genug ist, dann sollte die Genauigkeit reichen.
Also denke ich mir mal ein paar Grenzen aus:
X0=-3; X1=2; Y0=-4; Y1=3;
Wir definieren unser Gitter:
[X,Y]=meshgrid(X0 : 0.1 : X1 , Y0 : 0.1 : Y1);
Nun suchen wir das Minimum:
[Zmin, ZminYindex] = min(Z);
[Zmin,ZminXindex] = min(Zmin);
ZminYindex = ZminYindex(ZminXindex);
Das Minimum ist nun in Zmin gespeichert. Wir bestimmen noch die Koordinaten dieses Punktes:
Xmin = X(ZminYindex , ZminXindex);
Ymin = Y(ZminYindex , ZminXindex);
Entsprechend suchen wir das Maximum. Ersetze jedes min einfach durch max...
Die Ausgabe als Legende kann so erfolgen:
legend1 = sprintf('Min: (%-5.2f,%-5.2f,%-5.2f)', [Xmin Ymin Zmin]);
legend2 = sprintf('Max: (%-5.2f,%-5.2f,%-5.2f)', [Xmax Ymax Zmax]);[/
surf(Z);
hold on;
legend(legend1,legend2);
Schau dir mal die Hilfe zu sprintf und legend an. Dort gibt es weitere Formatierungsmöglichkeiten.
In diesem Sinne kannst du nun zu deinen Zmin und Zmax die Kennzahlen ausrechnen, die du erwähnt hast und als legend3 und legend4 mit in die Legende aufnehmen.
Gruß
Martin
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 14:21 Fr 10.11.2006 | Autor: | CAS |
Ich danke dir erstmal - hast mir unheimlich geholfen
Hab jetzt noch eine Frage zu der Funktion.
Muss diese Z-Funktion x-mal überlagern (nebeneinander in einem gleichmäßigen Abstand zueinander) , dabei soll aber der äußere Grenzbereich "abgeschnitten" werden, bzw. begrenzt werden (quasi in einem Intervall von [-(X+A),(X+A);-(-Y+B),(Y+B)]) .... hoffe du verstehst wie ich es meine.....
Kann man den Bereich für jede einzelne Funktion individuell begrenzen? bzw. eine Funktion schreiben, so dass man nur mit einem Bereich der Funktion rechnet....
LG
|
|
|
|
|
Hallo,
mir ist nicht ganz klar, worauf du hinaus willst, aber du kannst ja die Funktion zuerst für ein Rechteck ausrechnen.
Dann erzeugst du dir eine Matrix mask von derselben Größe wie Z, die an den Rändern Nullen und in der Mitte Einsen hat. Die legst du dann über Z:
Zmask = Z.*mask;
Nun kannst du mit "repmat" deine Matrix vervielfältigen, z.B.:
[code]bigZmask = repmat(Zmask, 5, 5);[code]
Hilft dir das weiter?
Gruß
Martin
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 07:45 Di 05.12.2006 | Autor: | CAS |
Hallo
Hab jetzt doch noch mal eine Frage dazu....
also die Grafik wird ausgeplottet und die Min/Max- Werte in einer Legende gargestellt, jedoch werden bloß die Intervallgrenzen , wo man die Max/Min.- werte sucht [X0 X1 Y0 Y1] , gezeigt....
Gibt es eine Möglichkeit den ganzen Körper darzustellen und trotzdem nur einen Bereich auszuwählen, wo man die Max/Min.-werte sucht? (Habe die 1. Möglichkeit dieser Anwort für mein Programm ausgewählt...)
Danke schonmal.....
|
|
|
|
|
Hallo,
das habe ich nicht ganz verstanden: Was haben das Bestimmen der Extremwerte und das Plotten miteinander zu tun? Das kannst du doch völlig unabhängig voneinander machen. Zuerst Extremwerte in den eingeschränkten Intervallen suchen, dann komplett plotten mit den vorher gefundenen Werten in der Legende.
Falls ich das völlig missverstehe, wäre etwas Programmcode ziemlich hilfreich.
Gruß
Martin
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 09:57 Di 05.12.2006 | Autor: | CAS |
Tut mir ja leid dass ich dich immer so nerve.... :-/
hab dir das Programm mal mitgeschickt und dort auch meine Probleme noch mal detailiert aufgeschrieben..... hoffe du kannst damit was anfangen und mir helfen .....
LG Kathi
[Dateianhang Nr. 1 (fehlt/gelöscht)]
|
|
|
|
|
Hallo,
zuerst eine Bitte: Schicke bitte alle Beitrage mit Fragen und/oder Hilfegesuchen als Fragen, da ich (vielleicht auch andere) manchmal nur auf die Farbe achte. Fragen werden rot markiert und fallen (mir) mehr auf.
Zu deinen Fragen:
Ich habe mir erlaubt, deinen Programmcode zu bearbeiten. Die Berechnungen habe ich mir gar nicht erst angesehen (ich weiss ja gar nicht, was das sein soll...). Aber die wichtigsten Aenderungen:
Ich habe die Berechnungen in eine for-Schleife gepackt, in der beim ersten Durchlauf die minmax-Berechnungen durchgefuehrt werden und beim zweiten Durchlauf die Werte fuer den Plot berechnet werden.
Legend- und Achsenproblem sind (hoffentlich in deinem Sinne) auch geloest. Lies dir einfach meine Kommentare zum Code durch.
Ach ja: Da das Plotten des gesamten Bereichs jetzt klappt, kannst du es ja mal ohne Setzen der Achsen versuchen. Das geschieht ja automatisch.
Gruss
Martin
Dateianhänge: Anhang Nr. 1 (Typ: m) [nicht öffentlich]
|
|
|
|
|
Hallo,
ja so etwas gibt es.
Es gibt z.B. fminbnd. Hier erzeugt man eine Inline-Funktion, indem man die Funktion als String hinschreibt.
Aaaaber: Die Funktion T ist ja über Wmax und Wmin definiert, die wiederum über W defniert sind, die wiederum über Z1, Z2 und Z3 defniert ist, die wiederum je drei vektorwertige Parameter haben. Deshalb wäre es höchst komplex, das als Inline-Funktion aufzubauen, da diese ganzen Funktionen ja nicht symbolisch behandelt werden sondern numerisch.
Also würde ich persönlich zu einer for-Schleife tendieren.
Gruß
Martin
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 12:08 Mo 11.12.2006 | Autor: | CAS |
hallo nochmal....
hab das probiert mit einer for-schleife nach dem Schema, der vorangegangenen Beispielen, nur leider gibt das Programm mir entweder gar keinen wert aus oder unzählige Tabellen.....
Wahrscheinlich ist irgendwas an dem Programmfluss nicht richtig..... hab das Programm noch mal mitgeschickt.....
Könnte es mal jemand durchsehen/ kontrollieren, bzw. verbessern???
Ich bedanke mich für eure Hilfe
LG Kathi
[Dateianhang Nr. 1 (fehlt/gelöscht)]
|
|
|
|
|
Hallo,
ich habe mir die Berechnung nicht angesehen, da hat sich ja nix verändert. Aber aufgefallen ist mir, dass du in beiden Durchläufen (lauf==1 und lauf==2) dasselbe berechnest. Das solltest du vielleicht noch optimieren...
Zur Ausgabe:
Das sprintf dient nicht direkt der Ausgabe sondern der Umwandlung von Ausdrücken in einen String. Deswegen führt ein Semikolon dahinter zur Unterdrückung der Ausgabe. Wenn das Semikolon fehlt, dann geht es schon, sieht aber hässlich aus, weil dort immer ein "ans" davorsteht.
Mein Vorschlag:
if Wopt<= Toleranz,
antwort=sprintf('Toleranz: %-5.2f%% \n Abstand: %-5.2f \n', [Wopt, A]);
disp(antwort);
end;
Ach ja: Bei input solltest du am Ende der Eingabeaufforderung mindestens ein Leerzeichen einfügen. Sieht besser aus.
Gruß
Martin
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 14:15 Mi 10.01.2007 | Autor: | CAS |
Hallo....
der Mittelwert wird doch bestimmt durch die Funktion :
M = mean(W);
Wenn ich das so in meinem Programm aufnehme, plottet er mir in meiner Legende viele Mittelwerte aus. Wie kann ich den Mittelwert über einer Fläche bestimmen?....
(hab das auch mit der Schreibweise wie bei Max/Min schon versucht, doch da kommt leider gleich Error!)
Hilfe bitte benötigt
Datei-Anhang
Dateianhänge: Anhang Nr. 1 (Typ: m) [nicht öffentlich]
|
|
|
|
|
Hallo,
eigentlich sollte ein mean(mean(W)) reichen. Dadurch wird entlang beider Dimensionen gerechnet.
Alternativ kannst du auch mean(reshape(W,numel(W),1)) benutzen.
Übrigens musst du um die Zahlenformate bei sprintf keine Klammern machen, oder war das Absicht?
|
|
|
|