Ich habe einige Anpassungen in Python mit numpy gemacht (die kleinste Quadrate verwendet).
Ich habe mich gefragt, ob es eine Möglichkeit gibt, die Daten anzupassen, während man sie durch einige Fixpunkte zwingt. Wenn nicht, gibt es eine andere Bibliothek in Python (oder eine andere Sprache, zu der ich verlinken kann - zB c)?
ANMERKUNG Ich weiß, dass es möglich ist, einen festen Punkt zu erzwingen, indem man ihn zum Ursprung bewegt und den konstanten Ausdruck auf Null setzt, wie hier angemerkt, aber allgemein für 2 oder mehr behoben Punkte:
Die mathematisch korrekte Art, eine Anpassung mit festen Punkten durchzuführen, besteht darin, Lagrange-Multiplikatoren zu verwenden. Im Grunde modifizieren Sie die Zielfunktion, die Sie minimieren möchten, die normalerweise die Summe der Quadrate der Residuen ist, indem Sie für jeden Fixpunkt einen zusätzlichen Parameter hinzufügen. Es ist mir nicht gelungen, eine modifizierte Zielfunktion einem von Scipys Minimierern zuzuführen. Aber für eine polynomische Anpassung können Sie die Details mit Stift und Papier herausfinden und Ihr Problem in die Lösung eines linearen Gleichungssystems umwandeln:
%Vor% Um zu testen, ob es funktioniert, versuchen Sie folgendes, wobei n
die Anzahl der Punkte ist, d
der Grad des Polynoms und f
die Anzahl der Fixpunkte:
Und natürlich passt das angepasste Polynom genau durch die Punkte:
%Vor% Wenn Sie curve_fit()
verwenden, können Sie das Argument sigma
verwenden, um jedem Punkt eine Gewichtung zu geben. Das folgende Beispiel gibt den ersten, mittleren und letzten Punkt als sehr kleines Sigma an, sodass das Anpassungsergebnis sehr nahe bei diesen drei Punkten liegt:
Ein einfacher und direkter Weg ist die Verwendung von Constrained Least Squares, wo Constraints mit einer größeren Zahl M gewichtet werden, wie:
%Vor% Offensichtlich ist dies keine wirklich allumfassende Lösung, aber anscheinend scheint es mit einem einfachen Beispiel ( for M in [0, 4, 24, 124, 624, 3124]
) vernünftig zu funktionieren:
und produzieren wie:
Bearbeiten: 'exact' Lösung hinzugefügt:
%Vor%und Testen der Passform:
%Vor%