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

Interpolation auf feinem Rechengitter

 

nebula
Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 19.02.13
Wohnort: ---
Version: R2008b
     Beitrag Verfasst am: 19.02.2013, 11:57     Titel: Interpolation auf feinem Rechengitter
  Antworten mit Zitat      
Guten Morgen zusammen,

ich bin nun schon seid Längerem an einer Matlab-Routine am Rumbasteln....

Es soll folgendes passieren:

Ich lese mir Simulationsergebnisse (Koordinaten und Geschwindigkeiten) aus Ansys CFX in mein Matlab Progrämmchen ein. -> das klappt auch wunderbar. Diese Simulationsdaten werden, da es in Zukunft tonnenweise Gitterpunkte geben wird, in Cell Arrays übergeben. Anschließend werden die relevanten Größen entdimensioniert.

Der nächste Schritt ist nun folgender und auch problematischer, hier wäre eine Hilfestellung extrem wünschenswert Wink

Das Rechengitter, welches aus Ansys CFX stammt, ist NICHT äquidistant, weswegen es schwierig wird in Matlab weitere Berechnungen durchzuführen. Meine Idee daher: in MATLAB soll nun ein feineres äquidistantes Gitternetz (im angehängten Bild ROT) über das bestehende "alte" CFX- Netz (schwarz) gelegt werden. Die nun unbekannten Größen in den Zwischengitterpunkten im feineren MATLAB- Gitter sollen dann mittels linearer Interpolation interpoliert werden. Natürlich soll der gesamte Bereich mit dem neuen MATLAB- Gitter versehen werden...

Meine ursprüngliche Idee ist: ich genereiere mir zwei "diskrete" Koordinatenrichtungen, sprich Zeilenvektoren (im Programm Zeilen 77 und 78 ) und mache einfach eine lineare Interpolation mit interp1 (Zeilen 81-86)... da gibt es aber das Problem, dass die interpolierten Daten nun NaNs aufweisen, die mir die ganze Physik zerstören.... Eine Splineinterpolation macht auch keinen Sinn, da ich KEINE Polynome haben möchte, sondern diskrete Punkte.

Meine bisherigen Versuche mit Meshgrid und griddata scheitern schon alleine an den ziemlich großen 10000x10000 Matrizen, die in Zukunft noch viel, viel größer werden...

Ist es daher zweckmäßig mir "was eigenes" programmieren zu müssen oder gibt es da jemanden, der eine ähnliche Problematik erfolgreich lösen konnte???

Ich bin für jede Hilfe sehr dankbar!

Programm.zip
 Beschreibung:
das Matlab-Programm

Download
 Dateiname:  Programm.zip
 Dateigröße:  308.18 KB
 Heruntergeladen:  460 mal
matlabgitter.png
 Beschreibung:
Bild CFX& Matlab- Gitter

Download
 Dateiname:  matlabgitter.png
 Dateigröße:  51.94 KB
 Heruntergeladen:  704 mal
Private Nachricht senden Benutzer-Profile anzeigen


Thomas84
Forum-Meister

Forum-Meister


Beiträge: 546
Anmeldedatum: 10.02.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.02.2013, 15:44     Titel:
  Antworten mit Zitat      
es gibt noch triscatteredinterp:

http://www.mathworks.de/de/help/mat.....ating-scattered-data.html

Aber das wird dein Problem mit den großen Matrizen nicht lösen. Dazu müsstest du auf 64 bit umsteigen, oder einfach gröber diskretisieren.
Private Nachricht senden Benutzer-Profile anzeigen
 
nebula
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 19.02.13
Wohnort: ---
Version: R2008b
     Beitrag Verfasst am: 19.02.2013, 16:57     Titel:
  Antworten mit Zitat      
Verdammt... bei R2008b kann ich "TriScatteredInterp" offenbar gar nicht nutzen...
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: 19.02.2013, 17:21     Titel:
  Antworten mit Zitat      
Hallo,

um auf das ursprüngliche Problem zurückzugehen: wenn interp1 NaN zurückgibt, dann bedeutet das i.d.R., dass man Werte außerhalb des Bereichs angefordert hat, für den es Werte gibt.

In dem Fall kannst du als Zusatzoption 'extrap' angeben, um trotzdem Werte zu bekommen. Es muss dir aber klar sein, dass Interpolation außerhalb des Datenbereichs (d.h. im Grunde Extrapolation) ein absolutes Glückspiel ist.

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

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 19.02.13
Wohnort: ---
Version: R2008b
     Beitrag Verfasst am: 19.02.2013, 17:47     Titel:
  Antworten mit Zitat      
Das mit der Extrapolation ist mir schon klar, weswegen ich auch logischerweise keine durchführen werde... Smile

Interessanterweise ist es so, wenn ich meine "Originaldaten" aus CFX mal plotte, gibt das die Gitterpunkte wieder, wie sie sein sollen, sprich: die Geometrie sieht genauso aus, wie in CFX- Post.

Wende ich nun die Interpolation interp1 auf mein feineres Gitter an und plotte diese beiden neuen Größen, so ist die Geometrie anscheinend zerschossen. Ich erhalte nicht die entsprechende Geometrie, sondern einfach eine kryptische Kurve bestehend aus zig Punkten. Erklären kann ich mir das gerade nicht, da die Syntax formal richtig ist.

In dem Codeschnipsel ist Yf0 ein 23006x1 Cell Array und zy 1x23006, genau wie Zf0 und zz...
Code:

Yfip=interp1(Yf0,zy');
Zfip=interp1(Zf0,zz');


Langsam glaube ich, dass ich hier auf dem Holzweg bin... Sad
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: 19.02.2013, 23:53     Titel:
  Antworten mit Zitat      
Hallo,

ich verwende interp1 bevorzugt so, dass ich auch noch x-Werte mit übergebe, an denen ausgewertet werden soll, aber das mag eine persönliche Präferenz sein.

Was mich mehr wundert: Yf0 sollte an sich ein Double Array sein.

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

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 19.02.13
Wohnort: ---
Version: R2008b
     Beitrag Verfasst am: 20.02.2013, 11:27     Titel:
  Antworten mit Zitat      
Ich stehe jetzt gerade auf dem Schlauch, was du mit einem Double Array meinst: Meinst du ein 2 dimensionales Array, sprich: Ich habe in dem Cell Array Yf0 X- und Y- Werte abgelegt oder wie?

Vielleicht sollte ich etwas genauer beschreiben, was ich mit dem linearen Interpolieren meine: Ich habe also eine Liste mit Koordinaten, z.B. Yf0 aus CFX vorliegen. Diese Koordinatenliste ist mir zu grob aufgelöst. Also möchte ich gerne zwischen jedem Punkt aus Yf0 noch ein paar mehr Punkte haben, die ich linear interpolieren will. In dem "Bildchen" sind die "0" die alten Stützpunkte aus Yf0 und die "x" die Zwischengitterpunkte, die ich aus den alten Daten interpolieren will.

Code:

0---x---x---x---x---x---0
 


Ich bin gerade verwirrt: Wenn ich nun also nur mein Raster für Yf0 verfeinern will, wozu brauche ich dann in dem Double Array z.B. die X- Koordinaten aus Xf0?

Die allgemeine Syntax ist doch:

Code:

yi = interp1(x,Y,xi,method);
 

wobei yi mein Interpolationsvektor an den Punkten xi ist. Der Stützstellenvektor x ist doch optional, d.h. wenn Y eine Matrix ist, dann wird die Interpolation spaltenweise ausgeführt.
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: 20.02.2013, 14:01     Titel:
  Antworten mit Zitat      
Hallo,

ich habe da gerade etwas mit der Syntax durcheinandergebracht. Dennoch bringt uns das vielleicht weiter.

Deine Syntax nimmt nun an, dass die Y-Werte zu x-Werten 1:N (N = Anzahl der Zeilen von Y) gehören. Ist das zutreffend? Wenn nicht, musst du die x-Werte als erstes Argument übergeben. Der Klarheit halber würde ich das immer tun.

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

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 19.02.13
Wohnort: ---
Version: R2008b
     Beitrag Verfasst am: 20.02.2013, 14:15     Titel:
  Antworten mit Zitat      
Ich habe heute morgen vor der Mittagspause hier ein wenig rumgebastelt. Folgendes ist nach längerem Basteln zustande gekommen:
Meine (Roh-)Daten aus Ansys CFX, die in den Cell Arrays Yf0 und Zf0 abgelegt sind, sind ja keine Funktionen, sondern eine Menge an Punktkoordinaten. Dabei ist weiter zu beachten, dass diese Punktkoordinaten NICHT eindeutig sind, sondern ich habe z.B. 2 gleiche Yf0- Werte für einen Zf0- Wert. Die Mathematik schreibt einem vor, dass man zu jedem Yf0- Wert genau einen Zf0- Wert braucht. Also muss ich mir überlegen, dass die Y- und Z-Werte also Funktionen eines 3. Parameters "t" sind. Also muss ich dann MATLAB sagen, dass es die Interpolationen von (t,y) und (t,z) machen soll.

Code:

Y = interp1(t,y,T);
Z = interp1(t,z,T);
 


Damit das klappt, entnehme ich meine nn Datenpunkte in der Reihenfolge der CFX-Importdatei. Ich setze dabei voraus, dass das Zusammenfügen meiner neuen Datenpunkte (Y,Z) auch weiterhin meine CFX- Geometrie widerspiegeln. Als nächstes führe ich einen Parametervektor t=1:nn ein und meine verfeinerte Schrittweite T=1:stepsize:nn.

Code:

zyM = linspace(0,H,length(Yf0));
nn=length(zyM);
stepsize=1/10; % 10 Zwischengitterpunkte für jeden CFX- Punkt
t=(1:nn); %Spaltenvektor
T=(1:stepsize:nn);
 Yfip=interp1(t,Yf0,T,'nearest');
 Zfip=interp1(t,Zf0,T,'nearest');
 


Prinzipiell macht dieser Algorithmus schon etwas ähnliches, was ich wirklich haben möchte... das eizige Problem ist, dass die itertierten Vektoren "Yfip" und "Zfip" immer noch nicht-äquidistant sind, ich aber für die weiteren Berechnungen äquidistante Gitterpunkte benötige. Gibt es da noch eine Möglichkeit diesen Code zu optimieren?

Viele Grüße
Sebastian
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: 20.02.2013, 17:01     Titel:
  Antworten mit Zitat      
Hallo,

die interpolierten y-Werte sind ja normal nicht äquidistant, lediglich die x-Werte, zu denen sie gehören (wenn man das so will).

Wenn ich das richtig verstehe:
Momentan bekommst du Yfip für äquidistante T.
Wenn du für äquidistante Yfip die entsprechenden T haben willst, musst du im Grunde nur x- und y-Werte vertauschen

Code:
T=interp1(Yf0,t,Yfip,'nearest');

wobei mich die Verwendung von 'nearest' etwas verwundert.

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

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 19.02.13
Wohnort: ---
Version: R2008b
     Beitrag Verfasst am: 20.02.2013, 17:42     Titel:
  Antworten mit Zitat      
Hi,

also ich habe bei interp1 mit den Interpolationsmethoden ein bisschen herumgespielt und bin zu dem Ergebnis gekommen, dass bei der Standardeinstellung -> linear meine zu simulierende Strömung merkwürdige Löcher aufweist. Auch alle anderen Methoden führen zu ähnlich absurden und daher physikalisch falschen Ergebnissen. Die einzige Methode, die mein Strömungsfeld korrekt abbildet ist offenbar 'nearest', auch wenn's dich verwundert Wink

Ich für meinen Teil bin nun aber auch zufrieden mit der Interpolation, da ich mein Gitternetz nun einigermaßen Vergröbern/ Verfeinern kann.

Zum Thema von vorhin: Irgendwie war ich so auf die Koordinaten der Geometrie fixiert, dass ich schlichtweg vergessen hatte, mir die resultierende Strömung anzugucken... und um die geht es in meiner vorliegenden Arbeit in der Hauptsache! Die Geometrie spielt nur eine untergeordnete Rolle. Also wenn ich mir die Strömungsplots angucke und natürlich auch vorher brav die Geschwindigkeiten nach o.g. Schema interpoliere, so habe ich dann ein äquidistantes Gitter vorliegen.

Ich denke mal, das Thema ist somit auch geklärt!

Vielen Dank für die Hilfestellungen/ Anregungen
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.