Mathematica-Hüllkurve für den unteren Rand einer Zeichnung, eine generische Funktion

  • Ich habe die folgenden Einstellungen:

    xaxis = Tabelle [x, {x, 0, 10, 0.01 }];

    yaxis = Tabelle [Sin [x] + Abs [RandomReal [{- 1, 1}]], {x, 0, 10, 0.01}];

    ListLinePlot [Transpose [{ xaxis, yaxis}]]

    Mathematica-Hüllkurve für den unteren Rand einer Zeichnung, eine generische Funktion

    Meine Frage ist, wie kann ich eine Linie erstellen, die ganz einfach die Funktion umgibt, die von unten kommt. Der von unten nach oben kommende Umschlag sollte so geformt sein, dass er eng anliegt (oder übermontiert ist). Möglicherweise wird dies durch eine Art Glättungsparameter gesteuert, bei dem 1: sehr gezackt, 10: sehr smooth.

    Die folgende Abbildung zeigt ein Diagramm, das von der zugrunde liegenden Funktion selbst erstellt wurde, was offensichtlich zu einer sehr weichen Anpassung führt.

    [p> Mathematica-Hüllkurve für den unteren Rand einer Zeichnung, eine generische Funktion

    15 April 2015
    Mr.Wizard
4 answers
  • Sie können auch ein bewegliches Minimum (und ein Maximum) erstellen und BSplineCurve verwenden, um eine geglättete Kurve darzustellen.

    Dies könnte effizienter gestaltet werden. Sie finden das Min und Max über ein Fenster.

     windowMin[data_, w_][pt_] := {pt, 
      Min[Cases[data, {x_, y_} /; pt - w <= x <= pt + w][[All, 2]]]}
    
    windowMax[data_, w_][pt_] := {pt, 
      Max[Cases[data, {x_, y_} /; pt - w <= x <= pt + w][[All, 2]]]}
     

    Diese Funktion zeichnet die Originaldaten mit BSplineCurve auf. Briefumschlag. Der Parameter w legt die Fensterbreite fest.

     f[w_] := With[{data = Transpose[{xaxis, yaxis}]}, 
      Show[ListLinePlot[data, 
        PlotStyle -> Directive[{Blue, Opacity[.2]}]], 
       With[{pts = Table[windowMin[data, w][t], {t, 0, 10, w - w/10}]}, 
        Graphics[{Red, BSplineCurve[pts]}]], 
       With[{pts = Table[windowMax[data, w][t], {t, 0, 10, w - w/10}]}, 
        Graphics[{Red, BSplineCurve[pts]}]]]]
     

    Einige Beispiele ...

     f[.2]
     

    Mathematica-Hüllkurve für den unteren Rand einer Zeichnung, eine generische Funktion

     f[.1]
     

    Mathematica-Hüllkurve für den unteren Rand einer Zeichnung, eine generische Funktion

     f[.025]
     

    Mathematica-Hüllkurve für den unteren Rand einer Zeichnung, eine generische Funktion

    Bearbeiten: Als Antwort auf den Kommentar folgt eine allgemeinere Form von f, die eine Liste von X-Daten und eine Liste von Y-Daten zulässt, sofern sie gleich lang sind. Min und Max von Table s werden als Bereich der x-Daten ausgewählt.

     f[xdata_, ydata_, w_] /; Length[xdata] == Length[ydata] := 
     Block[{data = Transpose[{xdata, ydata}], xmin = Min[xdata], 
       xmax = Max[xdata]}, 
      Show[ListLinePlot[data, 
        PlotStyle -> Directive[{Blue, Opacity[.2]}]], 
       With[{pts = 
          Table[windowMin[data, w][t], {t, xmin, xmax, 
            w - w/(xmax - xmin)}]}, Graphics[{Red, BSplineCurve[pts]}]], 
       With[{pts = 
          Table[windowMax[data, w][t], {t, xmin, xmax, 
            w - w/(xmax - xmin)}]}, Graphics[{Red, BSplineCurve[pts]}]]]]
     
    27 February 2012
    Justin
  • Hier ist eine Methode, die Sie möglicherweise verwenden können.

    Der erste Teil stellt die untere Standardabweichung von 1,4 über einem gleitenden Durchschnitt dar und der zweite Teil macht ein polynomische Passform.

     xaxis = Table[x, {x, 0, 10, 0.01}];
    yaxis = Table[Sin[x] + Abs[RandomReal[{-1, 1}]], {x, 0, 10, 0.01}];
    plot = ListLinePlot[Transpose[{xaxis, yaxis}]];
    n = 100;
    part = Partition[Transpose[{xaxis, yaxis}], n, 1];
    dNeg[x_List] := {Mean[x[[All, 1]]],
       Mean[#] - 1.4*StandardDeviation[#] &@x[[All, 2]]};
    d = dNeg /@ part;
    env = ListLinePlot[d];
    Show[{plot, env}]
     

    Mathematica-Hüllkurve für den unteren Rand einer Zeichnung, eine generische Funktion

     d2 = Fit[d, {1, x, x^2, x^3, x^4, x^5, x^6}, x];
    Show[{plot, Plot[d2, {x, d[[1, 1]], d[[-1, 1]]}]}]
     

    Mathematica-Hüllkurve für den unteren Rand einer Zeichnung, eine generische Funktion

    26 February 2012
    Chris Degnen
  • Eine Möglichkeit besteht darin, die Daten mit einem Fenster durchzugehen und den Minimal- oder Maximalwert auszuwählen. Ich zeige nur Code für den Fall, dass die Punkte entlang der $ x $ -Achse gleichmäßig verteilt sind:

     Manipulate[
     ListLinePlot[
      {data,
       {Mean[#[[All, 1]]], Min[#[[All, 2]]]} & /@ 
        Partition[data, window, 
         1], {Mean[#[[All, 1]]], Max[#[[All, 2]]]} & /@ 
        Partition[data, window, 1], Mean /@ Partition[data, window, 1]},
      PlotStyle -> {Thin, Thick, Thick, Thick}],
     {window, 1, 100, 1}]
     

    > Mathematica-Hüllkurve für den unteren Rand einer Zeichnung, eine generische Funktion

    Eine andere Möglichkeit besteht darin, die tatsächlichen Minimum- / Maximum-Punkte auszuwählen, anstatt den Durchschnitt für die $ x $ -Koordinate zu ermitteln:

     MaxBy[list_, fun_] := list[[First@Ordering[fun /@ list, -1]]]
    MinBy[list_, fun_] := list[[First@Ordering[fun /@ list, 1]]]
    
    Manipulate[
     ListLinePlot[
      {data,
       MaxBy[#, Last] & /@ Partition[data, window, 1], 
       MinBy[#, Last] & /@ Partition[data, window, 1], 
       Mean /@ Partition[data, window, 1]},
      PlotStyle -> {Thin, Thick, Thick, Thick}],
     {window, 1, 100, 1}]
     

    Mathematica-Hüllkurve für den unteren Rand einer Zeichnung, eine generische Funktion

    26 February 2012
    Szabolcs
  • Wenn Sie genügend Zeit haben, nehmen sie alle lustigen Aufgaben und machen aus ihnen integrierte Funktionen. Zu diesem Zweck können wir EstimatedBackground verwenden, um den Umschlag leicht zu finden auf beiden Seiten dieser geräuschvollen Daten:

     Manipulate[
     ListLinePlot[{yaxis,
       EstimatedBackground[yaxis, y],
       -EstimatedBackground[-yaxis, y]},
      DataRange -> MinMax@xaxis],
     {y, 1, 20, .1, Appearance -> "Open"}]
     

    Mathematica-Hüllkurve für den unteren Rand einer Zeichnung, eine generische Funktion

    12 August 2016
    HitScan