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

Doppeltes Integral

 

lapricorn
Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 19.12.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.09.2016, 13:10     Titel: Doppeltes Integral
  Antworten mit Zitat      
Hallo,



Es geht darum, das folgende Integral zu lösen:

y(z) = int(int(f(xi), xi=0..z-sigma)*h(sigma), sigma=0..z)

wobei f und h bekannte Funktionen sind. Ich habe folgenden Code der auch funktioniert:

Code:
clc
close all
clear

dz = 0.01;
z = 0:dz:1;
f = z.^2.*exp(-z);
h = sin(z);
G = zeros(length(z));
for m = 1:length(z)
    for n = 1:length(z)
        G(m,n) = dz*trapz(f(1:m-n+1));
    end
end
y = zeros(size(z));
for n = 1:length(z)
    y(n) = dz*trapz(G(n,1:n).*h(1:n));
end

y_ana = 1/2*(exp(z).*cos(z) - exp(z).*sin(z) - z.^2 + 4*exp(z) - 4*z - 5).*exp(-z);
plot(z,y,z,y_ana)


Allerdings erscheint mir diese Lösung sehr unelegant. Gibt es vielleicht eine bessere (vermutlich mit integral2)?

Vielen Dank!
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


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

sehe ich auch so. Und eigentlich musst du dich nur an dem Beispiel mit der triangular region orientieren:
Code:
f = @(z) z.^2.*exp(-z);
h = @(z) sin(z);
dz = 0.01;
z = 0:dz:1;
y = zeros(size(z));
for I = 1:numel(z)
    y(I) = integral2(@(xi, sigma) f(xi) .* h(sigma), 0, z(I), 0, @(xi) z(I)-xi);
end


Grüße,
Harald

Zuletzt bearbeitet von Harald am 22.09.2016, 15:29, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
lapricorn
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 19.12.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.09.2016, 13:54     Titel:
  Antworten mit Zitat      
Super, vielen Dank!
Private Nachricht senden Benutzer-Profile anzeigen
 
lapricorn
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 19.12.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.09.2016, 15:05     Titel:
  Antworten mit Zitat      
Code:
for I = 1:numel(z)  
    G =  @(sigma) integral(f,0,z(I) - sigma);
    intfun = @(z) G(z)*h(z);
    y(I) = integral(intfun, 0, z(I),'ArrayValued',true);
end


Das ist vielleicht auf den ersten Blick/für den Anfänger etwas einfacher (wenn auch umständlicher).
Allerdings ist mir unklar, warum 'ArrayValued',true benötigt wird und welche Auswirkung es in diesem Fall hat.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 22.09.2016, 15:28     Titel:
  Antworten mit Zitat      
Hallo,

integral versucht, die zu integrierende Funktion aus Effizienzgründen mit Vektoren zu füttern und erwartet einen Vektor gleicher Größe zurück. Wenn die Funktion so nicht aufgerufen werden kann --> 'ArrayValued',true

Ich habe gerade gemerkt, dass ich es komplizierter als nötig gemacht hatte, und den vorherigen Beitrag entsprechend editiert.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 19.12.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.09.2016, 15:44     Titel:
  Antworten mit Zitat      
Das habe ich mir gedacht, war aber etwas verwundert, warum dann aber kein Vektor am Ende rauskommt (siehe Beispiel in der Dokumentation).

Danke, so ist es sehr einfach, einleuchtend und sauber.

Jetzt möchte ich das ganze für die Dimension 2x1 für y implementieren: D.h.:

y(z) = int([1 0; 0 1]*int(f(xi), xi=0..z-sigma)*h(sigma), sigma=0..z)

mit h(z) in R^(2x1) in Pseudocode. Arrayvalued scheint von integral2 nicht unterstützt zu werden.

Ist das auch möglich?
Private Nachricht senden Benutzer-Profile anzeigen
 
lapricorn
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 19.12.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.09.2016, 07:11     Titel:
  Antworten mit Zitat      
Und was ist, wenn f und h nur als diskrete Vektoren bzw. Matrizen vorliegen (mit interp1 Funktionen zu generieren scheint mir ungünstig)?

Nachtrag für den letzten Post: f ist hierbei natürlich eine skalare Funktion.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 23.09.2016, 07:44     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
warum dann aber kein Vektor am Ende rauskommt

weil die Funktionsauswertungen für die Integralberechnung aufsummiert werden.

Zitat:
Jetzt möchte ich das ganze für die Dimension 2x1 für y implementieren: D.h.:

y(z) = int([1 0; 0 1]*int(f(xi), xi=0..z-sigma)*h(sigma), sigma=0..z)

mit h(z) in R^(2x1) in Pseudocode. Arrayvalued scheint von integral2 nicht unterstützt zu werden.

Ist das auch möglich?

Ich sehe da nur die Möglichkeit, die Integrale für die einzelnen Komponenten separat zu berechnen.
Wenn die Matrix konstant ist (d.h. unabhängig von xi und sigma), dann kann man sie aber auch vor das Integral ziehen.

Zitat:
Und was ist, wenn f und h nur als diskrete Vektoren bzw. Matrizen vorliegen (mit interp1 Funktionen zu generieren scheint mir ungünstig)?

Dafür ist dann trapz gedacht, das du ja eingangs verwendet hattest.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 19.12.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.09.2016, 11:05     Titel:
  Antworten mit Zitat      
Viele Dank.
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.