DMUG-Archiv 2010

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

Re: Punkte aus Interpolating Function entfernen

Hallo Udo,

vielen Dank für Deine Antwort.
Ich muss allerdings gestehen, dass ich sie nicht sofort verstanden habe
und mich nach Olivers Antwort auch nicht mehr darum bemüht habe, da sie
etwas kompliziert aussieht.

Daher möchte ich hier noch ein etwas einfacheres Beispiel zum Entfernen
von Punkten zeigen, welches ich basierend auf der Lösung von Oliver und
Daniel von der MathGroup Liste entwickelt habe:

==

(*RemovePoints.nb*)

Needs["DifferentialEquations`InterpolatingFunctionAnatomy`"];

n = 6; y = RandomReal[{-1, 1}, n];
f[r_] = Interpolation[y][r];

points = Select[First[InterpolatingFunctionCoordinates[f[r][[0]]]],
   Not[.4 n < # < .7 n] &];
(*points = Select[f[r][[0]][[3, 1]], Not[.4 n < # < .7 n] &];*)

f2[r_] = Interpolation[
    Transpose[{Transpose[{points}], f[points], f'[points]}]][r];

Show[
 Plot[f[r], {r, 1, n}, PlotRange -> {{1, n}, {-1.5, 1.5}}],
 Plot[f2[r], {r, 1, n}, PlotStyle -> Hue[0.9]],
 ListPlot[y, PlotStyle -> PointSize[0.03]],
 ListPlot[Transpose[{points, f[points]}],
  PlotStyle -> {PointSize[0.02], Hue[0.9]}]]

==

Die auskommentierte Zeile zeigt noch eine alternative kürzere Lösung
ohne das Paket `InterpolatingFunctionAnatomy`. Allerdings sorgt jedoch
dieses Pakets für die Kompatibilität zu anderen Mathematica-Version.
(http://reference.wolfram.com/mathematica/tutorial/NDSolvePackages.html)

Man kann dieses Beispiel jetzt auch über die Mathgroup Liste (20 Mai)
finden: http://forums.wolfram.com/mathgroup/archive/2010/May/ .

Noch einmal vielen Danke und viele Grüße

Frank


On 2010-05-17 20:25, Udo und Susanne Krause wrote:
> Wenn man den letzten Punkt in Piecewise[] einschliesst, wird die erste
> Ableitung dortselbst ordentlich:
> 
> 
> Clear[breitlingWegbedungen]
> breitlingWegbedungen[f_InterpolatingFunction, l_List] :=
>  Block[{x, x1, x2, x3, x4},
>    {x1, x2, x3, x4} = l;
>    Check[f[x1], Return[$Failed]];
>    Check[f[x2], Return[$Failed]];
>    Check[f[x3], Return[$Failed]];
>    Check[f[x4], Return[$Failed]];
>    FunctionInterpolation[
>     Piecewise[{{f[x], x1 <= x < x2},
>       {(f[x2] (x3 - x) + f[x3] (x - x2))/(x3 - x2) ,
>        x2 <= x < x3},  {f[x], x3 <= x <=  x4}}, 0], {x, x1, x4},
>     InterpolationPoints -> Floor[x4 - x1]^2, MaxRecursion -> 12
>     ]
>    ] /; VectorQ[l, NumericQ] && Less @@ l
> 
> 
> Gruss++
> Udo.
> 
> On Mon, 17 May 2010 10:39:11 +0200, Frank Breitling <fbreitling@XXXXXXX.de>
> wrote:
> 
>> Hallo,
>>
>> ich habe eine Interpolating Function die in einem kleinen Intervall
>> viele ungenaue Werte enthält. Daher würde ich gerne alle Werte in diesem
>> Intervall entfernen.
>> Ich habe es bereits mit Piecewise und Condition (/;) versucht, das
>> Intervall zu korrigieren. Eine so definierte Funktion verursacht aber
>> dann auf Grund ihrer komplexeren Gestalt Probleme in meinen weiteren
>> Rechnungen.
>> Daher möchte ich die ursprüngliche InterpolatingFuction behalten und nur
>> die problematischen Punkte entfernen.
>> Wie ginge das?
>>
>> Viele Grüße
>>
>> Frank
>>
>>
> 

Attachment: RemovePoints.nb
Description: Mathematica Notebook document

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

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