DMUG-Archiv 2006

Frühere   Chronologischer Index   Spätere
Vorherige   Thematischer Index   Nächste

Re: [Fwd: Daten Interpolieren]

Hallo Peter,

die Fehlermeldung mag zunächst sinnlos erscheinen, denn es gibt wirklich keine duplizierten Tupel unter den gelieferten Koordinaten, sofern Union[] und Interpolation[] denselben SameTest verwenden:

In[50]:= Clear[coords];
coords = Transpose[Drop[Transpose[VerschiebungZ], -1]];

In[52]:= Dimensions[coords] == Dimensions[Union[coords]]
Out[52]= True

In[53]:= Dimensions[coords]
Out[53]= {10592,4}

Möglicherweise besteht das Problem nicht in duplizierten Koordinaten, sondern in zuwenig Daten: Wenn ich es richtig verstanden habe, dann erwartet die mehrdimensionale Interpolation[] ein _Array_ Stützstellen mit Daten, und nicht einfach eine Menge {{x11, x21, x31, x41, f1}, {x12, x22, x32, x42, f2}, ...} von Stützstellen mit Daten. Die Anzahl verschiedener Koordinatenwerte pro Dimension ist:
In[49]:= Table[Length[Union[Transpose[VerschiebungZ][[o]]]], {o, 1, 4}]
Out[49]= {657,2,4,4}

Ein Array von Daten muss also 657 * 2 * 4 * 4 = 21024 Datenpunkte abliefern; es wurden
In[46]:= Dimensions[VerschiebungZ]
Out[46]= {10592,5}

nur 10592 Koordinatentupel geliefert. Man kann natürlich auch die Koordinatenreihenfolge vertauschen und die Werte festhalten, sich also etwa für o = 1, 2, 3 den Ausdruck
With[{o = 1},
Interpolation[Transpose[Join[RotateLeft[Drop[Transpose[VerschiebungZ], -1], o], {Last[Transpose[VerschiebungZ]]}]]]
]

ansehen: Für o=1 kommt die Fehlermeldung
Interpolation::inpts: "The total number 10592 of data points is not a multiple of the number 487 of points in dimension 4.

Wie Mma. 5.1 nun auf 487 Punkte in Dimension 4 (das ist die ursprünglich erste Dimension) kommt, ist auch ein Rätsel, aber vielleicht hilft es Ihnen weiter, wenn Sie ein komplettes Array bei Interpolation[] abliefern. Mit anderen Worten,
der folgende Ausdruck sollte auf einem Array

In[64]:= Union[Length[#]& /@ Split[Sort[First[Transpose[VerschiebungZ]]]]]
Out[64]= {16, 32}

{32} (= 2 * 4 * 4; oder allgemeiner genau einen Wert) liefern und nicht das, was er liefert. Da 10592 sehr viel kleiner als 21024 ist, müssen die allermeisten Listen unter Split[] die Länge 16 haben, und -48.148 ist einer der Werte in Dimension 1, die 32 mal vorkommen ...

In[72]:= Length[Select[VerschiebungZ, First[#1] == -48.148 & ]]
Out[72]= 32

Guten Rutsch && Gruss
Udo.

klamser wrote:

Hallo,

ich will Daten interpolieren.

Diese transponiere ich zuerst,

dataT = Transpose[data]

spiegele ich an der x Achse (erste Spalte) und füge sie mit Tranpose Union zusammen:

VerschiebungZ1 = Transpose[{dataT[[1]], dataT[[2]], dataT[[5]], dataT[[6]], dataT[[4]]}]; VerschiebungZ2 = Transpose[{-dataT[[1]], dataT[[2]], dataT[[5]], dataT[[6]], dataT[[4]]}];
VerschiebungZ = Union[VerschiebungZ1, VerschiebungZ2];

Durch das Union werden AUCH alle doppelten Datensätze eliminiert (x = 0).

VerschiebungZInterpoliert = Interpolation[VerschiebungZ];

produziert aber leider nur eine Fehlermeldung, dass irgendwas doppelt vorhanden sein soll.

Interpolation::"inddp":"The point \!\(-48.148`\) in dimension \!\(1\) is duplicated. \!\(\*ButtonBox[\"Mehr\[Ellipsis]\", ButtonStyle->\"RefGuideLinkText\", ButtonFrame->None, ButtonData:>\"Interpolation::inddp\"]\)"

Welcher doppelt sein soll, kann ich ber nicht erkennen. Was mach ich falsch?

Vielen Dank und freundlicher Gruß von Peter Klamser


Antworten:
Frühere   Chronologischer Index   Spätere
Vorherige   Thematischer Index   Nächste

DMUG DMUG-Archiv, http://www.mathematica.ch/archiv.html