Implizite Interpolationsfunktion in Mathematica und ihre explizite Form in kleinen Abschnitten

  • Ich habe eine Reihe von Punkten $ \ {x_i, y_i \} $, die eine geschlossene Kurve darstellen. Ich möchte eine Funktion $ F (x, y) $ so finden, dass $ F (x, y) = 0 $ die benötigte Kurve und $ F (x, y) \ ne 0 $ außerhalb der Kurve ergibt.

    Nehmen wir beispielsweise an, ich bekomme eine Menge von Punkten, die einen Kreis bilden:

     n = 16;
    points = Drop[Table[{Cos[2 i Pi], Sin[2 i Pi]}, {i, 0, 1, 1/n}], -1] // N;
     

    Ich verwende die Mathematica-Funktion Interpolation[..]:

     args = Join[Table[{points[[i]], 0}, {i, Length[points]}], {{{0, 0}, -1}}];
    F = Interpolation[args];
     

    Hier habe ich einen neuen Punkt $ hinzugefügt (0,0) $ mit dem Wert $ -1 $ darin, um meinen Satz von Punkten zu geben, um $ F (x, y) $ eine Tiefe zu geben.

    Erste Frage. Ist diese Lösung richtig? Kann ich sicher sein, dass mein $ F (x, y) \ ne 0 $ auf nicht kurvenförmigen Punkten liegt, wenn ich meinem Satz einen inneren Punkt mit einem Wert ungleich Null hinzufüge? Welche Lösung ist vorzuziehen?

    Außerdem habe ich eine zweite (und Haupt-) Frage. Aufgrund der Besonderheit meines Problems brauche ich einen expliziten Ausdruck für meine Kurve in einem bestimmten Abschnitt. Mit anderen Worten, ich möchte einen Ausdruck für meine Kurve in Form $ y = f (x) $ oder $ x = f (y) $ (egal) zwischen nahen Punkten haben. Ich brauche diesen $ f $ und sein Derivat $ f '$. $ F $ sollte dabei auch ein InterpolatingFunction-Objekt sein (aber eindimensional).

    Die Verwendung von Solve auf F aus dem vorherigen Beispiel liefert kein Ergebnis.

    Wie erhält man $ F $ und $ f $ (zwischen angegebenen nahen Punkten)?

    Update :

    In meinem Beispiel ist $ F (x, y) = x ^ 2 + y ^ 2-1 $ und ich kann zwei explizite Funktionen hervorheben: $ f_1 (x) = \ sqrt {1-x ^ 2} $ wobei $ x & gt; 0 $ und $ f_2 (x) = - \ sqrt {1-x ^ 2} $ wobei $ x \ leq 0 $. Die Gleichungen $ y = f_1 (x), y = f_2 (x) $ und die Gleichung $ F (x, y) = 0 $ repräsentieren dieselbe Kurve (einen Kreis). Folgendes brauche ich: implizite Funktion $ F (x, y) $ und eine Reihe expliziter Funktionen $ f_i $.

    Ich kann auch andere explizite Funktionen auswählen:

    $ f_1 (y) = \ sqrt {1-y ^ 2} $ wobei $ y \ leq x $ und $ y \ geq -x $; $ f_2 (x ) = \ sqrt {1-x ^ 2} $ wobei $ y & gt; x $ und $ y \ geq -x $; $ f_3 (y) = - \ sqrt {1-y ^ 2} $ wobei $ y & gt; x $ und $ y & lt; -x $; $ f_4 (x) = - \ sqrt {1-x ^ 2} $ wobei $ y \ leq x $ und $ y & lt; -x $.

    T

    01 March 2012
    rcollyer
2 answers
  • Bezüglich Ihrer zweiten Frage können Sie f im Allgemeinen über f=Interpolation[points] erhalten. Seine Ableitung ist gegeben durch f'[.3] (sagen wir) Dies schlägt jedoch für Ihr Beispiel fehl, weil zwei Punkte mit derselben X-Koordinate erscheinen (da es sich um einen Kreis handelt).

    Versuchen Sie zum Beispiel f = Interpolation[Table[{i, Sin[i]}, {i, 0, 10, .1}]] und dann Plot[f'[x], {x, 0, 2 Pi}].

    Vielleicht könnten Sie erklären, was Sie eigentlich sind versuchen zu tun.

    BEARBEITEN: OK, Sie können dies für f1 tun:

     Quiet[f1 = FunctionInterpolation[Sqrt[1 - y^2], {y, -1, 1}]];
     

    und für Ihr F (das ich zufällig in func umbenannt habe)

     func = FunctionInterpolation[-1 + 1*(x^2 + y^2), {x, -1.5, 
       1.5}, {y, -1.5, 1.5}]
     

    Beachten Sie, dass dies eine Funktion ist, die im Einheitskreis verschwindet. Wenn Sie nur wollen, dass F(x,y) auf (zB) dem Einheitskreis verschwindet, gibt es unendlich viele Funktionen, die dies erfüllen. einer von ihnen ist der, den Sie gegeben haben.

    29 February 2012
    Rodrigo Sieiro
  • Geben Sie zusätzlich zu diesem inneren Punkt einen Begrenzungsrahmen (oder eine andere Kurve) mit einem konstanten Wert größer als 0 an. Auf diese Weise haben Sie eine Interpolationsfunktion, die über einen sinnvollen Bereich tut, was Sie wollen.

    Sie möchten wahrscheinlich mehr Punkte auf Ihrer Kurve vergeben. Hier verdopple ich es auf 32.

     n = 32;
    points = Drop[Table[{Cos[2. i Pi], Sin[2. i Pi]}, {i, 0, 1, 1/n}], -1];
    innerpoint = {{0, 0}, -1};
    bigsize = 10;
    bigval = 5;
    outerbox = Union[Join[
        Table[{{bigsize, j}, bigval}, {j, -bigsize, bigsize}],
        Table[{{-bigsize, j}, bigval}, {j, -bigsize, bigsize}],
        Table[{{j, bigsize}, bigval}, {j, -bigsize, bigsize}],
        Table[{{j, -bigsize}, bigval}, {j, -bigsize, bigsize}]]];
    args = Join[Thread[{points, 0}], {innerpoint}, outerbox];
    
    twodimFunction = Interpolation[args];
    
    Interpolation::udeg: Interpolation on unstructured grids is currently
    only supported for InterpolationOrder->1 or InterpolationOrder->All.
    Order will be reduced to 1. >>`
    
    ContourPlot[
     twodimFunction[x, y], {x, -bigsize, bigsize}, {y, -bigsize, bigsize},
      ContourLabels -> True, PlotPoints -> 80]
     

    Implizite Interpolationsfunktion in Mathematica und ihre explizite Form in kleinen Abschnitten > | |

    Bei einigen äußeren Konturen ist es etwas unscharf. Keine Ahnung warum; muss nur eine vage der Plot-Stichprobe sein. Wenn Sie die PlotPoints auf einen angemessen hohen Wert setzen, können Sie sie visuell abmildern. Dies zeigt, dass nicht die Interpolation Schuld ist.

    12 April 2012
    Yaakov Ellis