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 Integration (numerisch) über 1D- oder 2D-Funktion

 

Terrorhamster
Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 09.08.15
Wohnort: Nähe Dresden
Version: 2015 a
     Beitrag Verfasst am: 09.08.2015, 20:01     Titel: 3D Integration (numerisch) über 1D- oder 2D-Funktion
  Antworten mit Zitat      
Hallo liebe Community,

bisher konnte ich durch Mitlesen und googlen meine MatLab-Probleme lösen, doch jetzt komme ich nicht weiter. Vielleicht findet Ihr eine Lösung meines Problems.

Ich möchte einen Code programmieren, der ein Volumenintegral über eine beliebige symbolische Funktion f(x,y,z) berechnet:

I = \int_{z}^{} \int_{y}^{} \int_{x}^{}  f(x,y,z) \: dx dy dz

Also z. B. idealerweise so etwas:

Code:

syms x y z

f = x^2 + y^3 - z ;
I = int(int(int( f, x,xMin,xMax), y,yMin,yMax), z, zMin,zMax);

 


So wäre es eigentlich ja gelöst.
Das Problem: die Funktion f generiert sich aus vorangegangenem Code und ist damit a priori unbekannt. Unter Umständen kann es eine Funktion sein, für die kein geschlossenes Integral gefunden werden kann. Deshalb möchte ich numerisch integrieren über den Befehl Integral3 . Meine Funktion wandele ich mit matlabFunction(...) in einen Function_Handle um.

Das Problem ist folgendes:
Ich kann nicht sicherstellen, dass die Funktion f immer explizit x,y und z als Variable enthält. Sie kann z.B. auch nur von x und y abhängen. Sprich:

 f(x,y) = x^2 -2y^2

muss auch integriert werden können.

Wenn ich jedoch dies mit matlabFunction(...) umwandele, "erkennt" Matlab nur die Variablen x und y:

Code:

syms x y z
f = x^2 - y^2;
ht = matlabFunction(f)

ht =

    @(x,y) x.^2-y.^2
 


Damit funktioniert der Befehl Integral3(...) aber nicht mehr.

Also ist meine Frage:

Wie kann ich eine ein- oder zweidimensionale Funktion numerisch über x, y und z integrieren?

Vielen Dank für Euren Support!

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


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 09.08.2015, 22:41     Titel:
  Antworten mit Zitat      
Hallo,

mal die Doku zu matlabFunction gelesen? Da steht genau das, was du brauchst.

Code:
ht = matlabFunction(f, 'Vars', {'x', 'y', 'z'})


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

Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 09.08.15
Wohnort: Nähe Dresden
Version: 2015 a
     Beitrag Verfasst am: 10.08.2015, 12:31     Titel:
  Antworten mit Zitat      
Hallo noch einmal!

Danke Harald für die superschnelle Antwort!
Sie hat mich definitiv einen Schritt weiter gebracht!

Allerdings habe ich ein 'neues' Problem festgestellt. Ich bin noch in der Einarbeitungsphase in Matlab, sorry dafür ... Wink
Wie ich gemerkt habe, kann es passieren, dass die Funktion, über die ich integrieren möchte, eine Konstante ist. Scheinbar hat Matlab damit jedoch ein Problem:

Code:

syms x y z

f = sym( 2.3 )  % Als Beispiel für eine "konstante" Funktion

ht = matlabFunction(f, 'Vars', {'x', 'y','z'})

ht =

    @(x,y,z)2.3            % Scheinbar hat er ja verstanden, dass es eine "konstante Funktion ist.

% Nun die Integration:
I = integral3( ht , 0,1 , 2,5 , 2,7)  % Integration in den Grenzen 0...1 , 2...5 und 2...7


Führe ich den Code aus, erscheint eine Fehlermeldung:

Code:

Error using integral2Calc>integral2t/tensor (line 241)
Integrand output size does not match the input size.
[... plus weitere Fehlermeldungen ...]


Ich würde ja durch eine if-Abfrage erfragen, ob die Funktion f eine Konstante ist und dann das Integral selbst berechnen, über

\int_{z_1}^{z_2}\ \! \int_{y_1}^{y_2}\ \!  \int_{x_1}^{x_2} \ \! k \, dx  \, dy  \, dz = k\cdot \left(x_2-x_1\right) \cdot \left(y_2-y_1\right) \cdot \left(z_2-z_1\right)

aber irgendwie kann das ja nicht der Weisheit letzter Schluss sein ... Oder?

Viele Grüße und noch einmal vielen Dank!

T-Hamster


PS: Oder, falls man das nicht anders machen kann als durch eine if-Abfrage:

Wie formuliere ich die Abfrage?
Mir fiele nur ein, dass ja die Ableitung einer Konstanten = 0 ist. Entsprechend:

Code:
if diff(f,x) == 0
I = k*(x2-x1)*(y2-y1)*(z2-z1)
end


Gibt es hier eine Möglichkeit, das eleganter zu machen?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

Vorsicht: diff(f,x) == 0 wäre auch erfüllt, wenn die Funktion nur von y und z abhängt.

Man könnte das so abfangen:
Code:
ht = @(x,y,z) ht(x,y,z) + 0*x;


Dadurch wird ht automatisch zum benötigten Vektor. Solche Sachen sollte man immer dokumentieren, damit später auch noch klar ist, was man sich dabei gedacht hat.

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.