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

Num Int 2d diskreter Werte bei nichtäquidistantem Gitter

 

ahnungsloser_numeriker
Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 15.11.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.11.2014, 20:16     Titel: Num Int 2d diskreter Werte bei nichtäquidistantem Gitter
  Antworten mit Zitat      
Hey Leute,

ich habe aus einer Simulation Wertepaare gemäß (x,y,z) erhalten, wobei x und y die Position des "Punktes" festlegt und z der Wert an diesem Punkt ist. Nun möchte ich eine numerische Integration mit den diskreten Werten durchführen, quasi eine Integration über die Fläche. Mein Problem hierbei ist, dass ich kein äquidistantes Gitter habe und die Punkte so willkürlich in meiner x-y-Ebene verteilt sind. Ich habe z.b. schon diesen Code hier gefunden für ein äquidistantes Gitter:
Code:

close all
clear all

M = [0 0 0 0 0 0; % <- x
     0 2 1 2 3 0;
     0 1 2 7 3 0;
     0 1 4 3 2 0;
     0 0 0 0 0 0];            
              %^
              %|
              %y
 
 x = [0.1 0.2 0.3 0.4 0.5 0.6];
 y = [0.1 0.2 0.3 0.4 0.5];

 figure
 
 surf(x,y,M);
 
 xlabel x
 ylabel y
 title 'Plot der Matrix'
 
% anonyme funktion zum interpolieren von zwischenwerten , die von
% dblquad verwendet werden könnte

 interp_M = @(xi,yi) interp2(x,y,M,xi,yi,'linear');
 
 % visualisierung der interpolation
 
 [X,Y]=meshgrid([x(1):.05:x(end)],[y(1):.05:y(end)]);
 
 figure
 surf(X,Y,interp_M(X,Y));
 xlabel x
 xlabel y
 title 'Plot der Interpolation'
 
% integration der matrix über zwei variablen im bereich x1:x2, y1:y2
 
 volumen = dblquad(interp_M,x(1),x(end),y(1),y(end));

 disp(['Das Volumen beträgt ' num2str(volumen) '.'])


Genau so etwas möchte ich auch machen, nur dass ich mit meinen Wertepaaren nicht die Matrix M erzeugen kann. Gibt es da irgendwie eine "einfache" Möglichkeit, mit meinen Wertepaaren eine numerische Integration durchzuführen?

Vielen Dank schon mal und viele Grüße,

ahnungsloser_numeriker
Private Nachricht senden Benutzer-Profile anzeigen


vega1013
Forum-Century

Forum-Century


Beiträge: 162
Anmeldedatum: 26.02.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.11.2014, 12:17     Titel:
  Antworten mit Zitat      
Hallo,

um von einem Datentrippel zu der gewünschten Matrix-Form zu kommen schau dir mal die Doku zu griddata und insbesondere das Beispiel an.

VG Vega
Private Nachricht senden Benutzer-Profile anzeigen
 
ahnungsloser_numeriker
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 15.11.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.11.2014, 16:05     Titel:
  Antworten mit Zitat      
Vielen lieben Dank. Das hat quasi ein Problem gelöst.

Noch eine Frage zur numerischen Integration: Mit dem griddata-Befehl konnte ich mir quasi ein äquidistantes Gitter "erzeugen". Mein Bereich, über den ich integrieren möchte, ist nicht völlig rechteckig (siehe roten Bereich im Anhang), was mir Probleme mit dem Befehl dblquad macht, da ich hier nur über ein Rechteckt integrieren kann. Gibt es hier eine Möglichkeit, über den rot-markierten Bereich eine numerische Integration durchzuführen, ohne großen Implementierungsaufwand?

Gracias

Grüße

nicht_äquidistantes_gitter.png
 Beschreibung:

Download
 Dateiname:  nicht_äquidistantes_gitter.png
 Dateigröße:  3.8 KB
 Heruntergeladen:  291 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Seban
Forum-Meister

Forum-Meister


Beiträge: 600
Anmeldedatum: 19.01.12
Wohnort: ---
Version: ab R2014b
     Beitrag Verfasst am: 16.11.2014, 18:18     Titel:
  Antworten mit Zitat      
Hallo,

Vielleicht klappt es, die Werte für z in dem "zum Rechteck fehlenden Bereich" auf NaN zu setzen und dann über das Rechteck zu integrieren.

Hinweis: Aus der Matlab-Hilfe: "dblquad will be removed in a future release. Use integral2 instead."

Grüße
_________________

Richtig fragen
Debugging
Private Nachricht senden Benutzer-Profile anzeigen
 
vega1013
Forum-Century

Forum-Century


Beiträge: 162
Anmeldedatum: 26.02.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.11.2014, 18:31     Titel:
  Antworten mit Zitat      
Code:
Vielleicht klappt es, die Werte für z in dem "zum Rechteck fehlenden Bereich" auf NaN zu setzen und dann über das Rechteck zu integrieren.


Wenn dies nicht funktionieren sollte wäre mein nächster Versuch die Werte auf Null zu setzen.
Eine elegantere Lsg. fällt mir momentan hierzu nicht ein.

VG
Private Nachricht senden Benutzer-Profile anzeigen
 
ahnungsloser_numeriker
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 15.11.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.11.2014, 18:37     Titel:
  Antworten mit Zitat      
vielen Dank. Ich versuche mal mein Glück Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
ahnungsloser_numeriker
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 15.11.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.11.2014, 19:08     Titel:
  Antworten mit Zitat      
Hey Leute,

dank eurer Mithilfe habe ich mein Problem zufriedenstellend gelöst. Für diejenigen, die es interessiert, hier der Code:

Code:
clc;
clear all;
close all;

% x = transpose([1,2,3,4,1,2,3,1,2,1]);
% y = transpose([0,0,0,0,1,1,1,2,2,3]);
x = transpose([0,0,1,1,2,2,2,3,3,3,3,3,4,4,4,4,4]);
y = transpose([3,4,3,4,2,3,4,0,1,2,3,4,0,1,2,3,4]);

v = transpose([200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200]);

n = 0.1; %Abstand der neu erzeugten Netzpunkte
c = min(x);
d = max(x);
e = min(y);
f = max(y);

[xq,yq] = meshgrid(c:n:d, e:n:f);
vq = griddata(x,y,v,xq,yq);

a = length(xq(1,:));
b = length(yq(:,1));


ind = find(isnan(vq));
vq(ind)=0;

for m = 1:a
    for n = 1:b
        if sqrt(xq(1,m).^2 + yq(n,1).^2) < 3
            vq(m,n) = 0;
        end
    end
end

figure
mesh(xq,yq,vq);
hold on
plot3(x,y,v,'o');
xlabel x
ylabel y

interp_vq = @(xii,yii) interp2(xq(1,:),yq(:,1),vq,xii,yii,'linear');
volumen= dblquad(interp_vq,c,d,e,f);
disp(['Das Volumen beträgt ' num2str(volumen) '.'])
 


Die konstante "Höhe" von 200 war hier nur zur Testzwecken:)

Vielen Dank noch einmal.

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