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

3D-Funktion ohne Schleifen diskretisieren

 

Draculus

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.09.2014, 11:21     Titel: 3D-Funktion ohne Schleifen diskretisieren
  Antworten mit Zitat      
Hallo zusammen,

ich versuche gerade eine Funktion f(x,y) zu diskretisieren und dabei auf Schleifen zu verzichten. Leider gelingt mir das nicht so ganz.
Im prinzip ist die Funktion f=(x^2+y^2)^(1/2) und wenn nur eine von beiden Variablen ein Vektor wäre, wäre es auch kein Problem, dann könnte ich einfach '.^' verwenden.
Gibt es eine Funktion, die mir eine Matrix aus der Summe der einzelnen Vektorelemente bildet oder komme ich doch um eine Schleife nicht herum?

Beispielsweise wenn ich die Vektoren a und b habe, hätte ich davon dann gern:
Code:

Matrix=[a(1)+b(1),a(1)+(b2),...;a(2)+b(1),a(2)+b(2),...;...,...,...]


Gibt es da eine Funktion für?
Vielen Dank schon jetzt für die Hilfe!


Epfi
Forum-Meister

Forum-Meister



Beiträge: 1.134
Anmeldedatum: 08.01.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.09.2014, 11:57     Titel:
  Antworten mit Zitat      
Guck Dir mal http://www.mathworks.de/de/help/matlab/ref/meshgrid.html an, das sollte helfen.
Private Nachricht senden Benutzer-Profile anzeigen
 
Nras
Forum-Meister

Forum-Meister


Beiträge: 608
Anmeldedatum: 21.02.12
Wohnort: ---
Version: 7.12.0.635 (R2011a)
     Beitrag Verfasst am: 03.09.2014, 11:58     Titel:
  Antworten mit Zitat      
Hallo,

bei der Funktion geht das. Man kann meshgrid benutzen, siehe hier:
Code:
x = linspace(-2,2,10);
y = linspace(-3,3,20);

[X,Y] = meshgrid(x,y);
F = (X.^2 + Y.^2).^(1/2);
figure
surf(X,Y,F)


Viele Grüße,
Nras.
Private Nachricht senden Benutzer-Profile anzeigen
 
Draculus

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.09.2014, 14:48     Titel:
  Antworten mit Zitat      
Hey,

vielen Dank für die schnelle Antwort.
Funktioniert auch soweit, dass ich die Komplette Matrix erhalte, aber da meine Funktion leider noch noch etwas komplexer ist, bekomme ich den Fehler: "Matrix is close to singular or badly scaled. Results may be inaccurate. RCOND = 4.431728e-18. "
Tatsächlich ist die Matrix recht groß und die Werte sollen nahe bei Null liege. Ich nehem an, dass durch die meshgrid-Funktion doch ein wenig genauigkeit verloren geht, da die Matrix aus den Schleifen ganz anders aussieht...
Daher werde ich wohl weiterhin in den suaren Apfel beißen müssen...
 
Harald
Forum-Meister

Forum-Meister


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

Bei vektorisierter Auswertung ist es wichtig, Matrixoperationen (*, /, ^) und Arrayoperationen (.*, ./, .^) zu unterscheiden. Meist braucht man das untere.

Falls das nicht hilft, bitte den verwendeten Code posten.

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

Forum-Meister


Beiträge: 608
Anmeldedatum: 21.02.12
Wohnort: ---
Version: 7.12.0.635 (R2011a)
     Beitrag Verfasst am: 03.09.2014, 15:18     Titel:
  Antworten mit Zitat      
Hallo,

ja für komplexere Funktionen wird Vektorisierung immer schwieriger, man muss also mehr Zeit und Hirnschmalz reinstecken. Darum ist das schlecht verallgemeinerbar und Mini-Beispiele sind im dem Fall leider nicht wirklich hilfreich. Da ist es wichtig, die komplette Funktion zu kennen.

Falls die Matrix nicht oft berechnet wird, kann sich das für das Gesamprojekt auch oftmals zeitlich lohnen, auf Vektorisierung zu verzichten...

Viele Grüße,
Nras.
Private Nachricht senden Benutzer-Profile anzeigen
 
Draculus

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.09.2014, 15:33     Titel:
  Antworten mit Zitat      
Hallo,

ja, ich verwende die Array-Operatoren, da ich ja die Werte von entsprechend jedem Element haben will.

Meine Funktion sieht jetzt wie folgt aus:
Code:

m=5e-4;
d=1e-6;
[x,y]=meshgrid(-127:1:128,-127:1:128);
Hxy1 = m/(1-exp(-m*d)) * (exp(-2*pi*(x.^2+y.^2).^(1/2)*d)-exp(-m*d))/(m-2*pi*(x.^2+y.^2).^(1/2));
 

und damit ergibt sich für Hxy leider was ganz anderes, als wenn ich es wie folgt mache:
Code:

for x=-127:1:128
    for y=-127:1:128
        Hxy2(i+128,j+128)= m/(1-exp(-m*d))*(exp(-2*pi*(x^2+y^2)^(1/2)*d)-exp(-m*d))/(m-2*pi*(x^2+y^2)^(1/2));
    end
end
 

Ich hoffe ich hab jetzt beim Übertragen keinen Fehler gemacht...
 
Epfi
Forum-Meister

Forum-Meister



Beiträge: 1.134
Anmeldedatum: 08.01.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.09.2014, 16:05     Titel:
  Antworten mit Zitat      
Code:
m/(1-exp(-m*d)) * (exp(-2*pi*(x.^2+y.^2).^(1/2)*d)-exp(-m*d))/(m-2*pi*(x.^2+y.^2).^(1/2))


An der Stelle 1-exp(-m*d) subtrahierst Du zwei fast gleiche Zahlen. Das kann bei der Verwendung von Gleitkommazahlen leicht mal ins Auge gehen: http://de.wikipedia.org/wiki/Auslöschung_(numerische_Mathematik)
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

die Subtraktion sehr ähnlicher Zahlen kann in der Tat ein Problem sein, aber das sollte bei beiden Ansätzen gleichermaßen auftreten.

Ich vermute das Problem eher in einem fehlenden Punkt:
Code:
Hxy1 = m/(1-exp(-m*d)) * (exp(-2*pi*(x.^2+y.^2).^(1/2)*d)-exp(-m*d))     ./     (m-2*pi*(x.^2+y.^2).^(1/2));

(entscheidender Teil ist zwischen den Leerzeichen)

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.09.2014, 16:23     Titel:
  Antworten mit Zitat      
Hey,

ja super, mit dem fehlenden Punkt stimmt es!
Vielen vielen Dank!
 
Epfi
Forum-Meister

Forum-Meister



Beiträge: 1.134
Anmeldedatum: 08.01.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.09.2014, 16:26     Titel:
  Antworten mit Zitat      
@Harald: ja, da Du hast wohl recht... Beide Lösungswege haben das gleiche Potenzial nicht das richtige Ergebnis zu liefern ;) Der Ausdruck vor dem von Dir bemerkten fehlenden Punkt wird für x = y = 1 auch wieder fast 1 - 1 = 0.

@Draculus: Ergebnis also kritisch betrachten. Es muss nicht falsch sein, aber wenn es nicht den Erwartungen entspricht, hast Du zumindest eine gute Ausrede :)
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

falls die Ungenauigkeit problematisch ist, können Taylorreihen helfen, z.B.:
Code:
m=5e-4;
d=1e-6;
r1 = m/(1-exp(-m*d))
r2 = m/(m*d-(m*d)^2/2)
r1-r2


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