Anpassungsfunktion mit nicht-konstantem Hintergrund

Inhalt

  1. 1 Zusammenfassung
  2. 2 Was Sie lernen werden
  3. 3 Beispiele und Schritte
    1. 3.1 Vorbereiten der Daten
    2. 3.1 Definieren der Funktion
    3. 3.3 Automatische Parameterinitialisierung
    4. 3.2 Anpassen der Kurve

 

Zusammenfassung

Viele Standardfunktionen von Origin werden definiert mit:

\begin{matrix}y=y_0+......\end{matrix}

, wobei y0 als der "konstante Hintergrund" betrachtet werden kann. Wie ist es möglich, Kurven mit nicht-konstantem Hintergrund anzupassen? Eine Möglichkeit besteht in der Verwendung des Impulsanalysators. Der Impulsanalysator bietet mehrere Methoden, um die Basislinie zu subtrahieren, einschließlich des exponentiellen oder polynomialen Hintergrunds. In diesem Tutorial zeigen wir Ihnen, wie Sie so eine Kurve mit Hilfe des Impulsanalysators anpassen können.

Origin-Version mind. erforderlich: 8.0 SR6

Was Sie lernen werden

Beispiel und Schritte

Vorbereiten der Daten

Beginnen Sie dieses Tutorial durch den Import der Datei \Samples\Spectroscopy\Peaks on Exponential Baseline.dat. Die Sparkline des Arbeitsblatts zeigt uns, dass es in der Kurve zwei Peaks gibt. Um das Problem zu vereinfachen, passen wir in diesem Beispiel nur einen Peak an.

Image:Fit_Function_with_Nonconstant_Background_001.png

Rufen Sie jetzt das Dialogfeld Arbeitsblattanfrage über Worksheet : Arbeitsblattanfrage auf. Extrahieren Sie die Daten von Zeile 1 bis Zeile 240:

Image:Fit_Function_with_Nonconstant_Background_002.png

Die anzupassende Kurve sollte folgendermaßen aussehen:

Image:Fit_Function_with_Nonconstant_Background_003.png

Definieren der Funktion

Wie unten dargestellt, betrachten wir die Quellkurve als die Kombination einer exponentiellen Zerfallskomponente (der Hintergrund) und einem Voigt-Peak:

Image:Fit_Function_with_Nonconstant_Background_004.png

Soll die gesamte Gleichung aufgeschrieben werden, um die Funktion zu definieren, sähe das folgendermaßen aus:

y=y_0+A_1e^{-x/t1}+A_2\frac{2w_L\ln{2}}{\pi^{\frac{3}{2}}w^2_G}\int_{-\infty}^{\infty}\frac{e^{-t^2}}{\left( \sqrt{\ln2}\frac{w_L}{w_G} \right)^2 + \left( \sqrt{4\ln{2}}\frac{x-x_c}{w_G}-t \right)^2}dt

Es handelt sich hierbei um eine komplizierte Gleichung, die eine unendliche Integration enthält. Das Aufschreiben einer solchen Gleichung ist mühsam. Wir haben allerdings bereits diese zwei Standardfunktionen:

ExpDec1:

\begin{matrix}y=y_0+Ae^{-x/t}\end{matrix}

Voigt:

y=y_0+A\frac{2w_L\ln{2}}{\pi^{\frac{3}{2}}w^2_G}\int_{-\infty}^{\infty}\frac{e^{-t^2}}{\left( \sqrt{\ln2}\frac{w_L}{w_G} \right)^2 + \left( \sqrt{4\ln{2}}\frac{x-x_c}{w_G}-t \right)^2}dt

Daher können wir einfach die Methode nlfxFuncName verwenden, um diese zwei Standardfunktionen anzugeben und eine neue Funktion zu erstellen. Drücken Sie F9, um den Dialog Fitfunktionen verwalten zu öffnen und unten eine Funktion zu definieren:

 

 

Funktionsname: ExpVoigt
Funktionstyp: Benutzerdefiniert
Unabhängige Variable: x
Abhängige Variable: y
Parameternamen: y0, A1, t1, xc, A2, wG, wL
Funktionsform: Origin C
Funktion: y = nlf_ExpDec1(x, y0, A1, t1) + nlf_Voigt(x, y0, xc, A2, wG, wL) - y0;
Hinweis:
  1. Einige der Standardfunktionsnamen sind nicht konsistent mit dem tatsächlichen Namen der DLL-Funktion. Wie die Voigt-Funktion ist dies in Voigt5.FDF definiert. Wenn Sie die FDF-Datei mit Notepad öffnen, können Sie eine Zeile im Abschnitt [GENERAL INFORMATION] (Allgemeine Informationen) sehen, die besagt:
    Function Source=fgroup.Voigt5
    Der Name nach "fgroup" ist der tatsächliche Name, der in nlf_FuncName eingegeben werden sollte.
  2. In Versionen vor Origin 8.1 SR2 sollte der Funktionskörper die alte Notation nlfxFuncName verwenden und definiert werden durch:

    	y = nlfxExpDec1(x, y0, A1, t1) + nlfxVoigt(;x, y0, xc, A2, wG, wL) - y0;
    	x; xc; A1; t1; A2; wG; wL;
    	
    Die Parameter werden am Ende aufgelistet, um zu vermeiden, dass der Fehler "parameter not used inside the function body" (Parameter werden in dem Funktionskörper nicht verwendet) auftritt, obwohl Sie diese Parameter bereits verwenden. Falls nicht, können Sie die Funktion nicht erfolgreich kompilieren.

Klicken Sie auf die Schaltfläche Image:User-Defined Fitting Functions-2.png rechts von den Parametereinstellungen und geben Sie diese Parameterinitialisierungswerte ein:

 

 

Y0 0
A1 5
t1: 50
xc: 100
A2 50
wG: 10
wL: 10

Der endgültige Teil der Funktionsdefinition sollte folgendermaßen aussehen:

Image:Fit_Function_with_Nonconstant_Background_006.png

Automatische Parameterinitialisierung

Im obenstehenden Abschnitt wurden die festen Parameterinitialisierungswerte gesetzt. Wenn die die möglichen Anpassungsergebnisse kennen, können Sie die Initialisierungswerte dementsprechend festlegen. Aber was passiert, wenn sich die Daten ändern? Origin bietet eine Origin C-Schnittstelle zum "groben Schätzen" der Initialisierungswerte. Um den Parameterinitialisierungscode zu verwenden, stellen Sie sicher, dass die Kontrollkästchen Automatische Initialisierung aktivieren und Origin C verwenden aktiviert sind, und bearbeiten Sie den Code im Code Builder, indem Sie auf das Symbol Image:User-Defined Fitting Functions-2.png klicken.
(P.S: Sollten Sie die Initialisierungswerte gut kennen oder Codierung nicht mögen, überspringen Sie bitte diesen Abschnitt.)

Image:Fit_Function_with_Nonconstant_Background_007.png

Jetzt, da die Kurve sich aus zwei Komponenten zusammensetzt, können wir die Parameterwerte grob schätzen, indem diese zwei Teile getrennt werden. Der Initialisierungscode beinhaltet dann Folgendes:

  1. Verwenden Sie die Funktion get_exponent zum Anpassen der Kurve und erhalten Sie auf diese Weise die Parameterwerte für die exponentielle Komponente.
  2. Entfernen Sie den Hintergrund -- exponentielle Komponente -- aus den Quelldaten.
  3. Führen Sie eine Annäherung an den Impuls durch den Gauss-Impuls mit Hilfe der Funktion peak_pos durch und legen Sie die Initialisierungswerte für die Impulskomponente fest.

Der Initialisierungscode im Code Builder sollte folgendermaßen aussehen:

void _nlsfParamExpVoigt( 
// Fit Parameter(s):
double& y0, double& A1, double& t1, double& xc, double& A2, double& wG, double& wL,
// Independent Dataset(s):
vector& x_data,
// Dependent Dataset(s):
vector& y_data,
// Curve(s):
Curve x_y_curve,
// Auxilary error code: 
int& nErr)
{
        // Beginning of editable part
        int nSign;
        // Evaluates the parameters' value, y0, ln(A) and R for y = y0+A*exp(R*x).
        t1 = get_exponent(x_data, y_data, &y0, &A1, &nSign);
        // Set the exponential component values for the fitting function.
        t1 = -1/t1;
        A1 = nSign*exp(A1);
        // Remove the exponential component from the curve;
        x_y_curve = x_y_curve - (y0 + A1 * exp(-x_data/t1));
        // Fit to get peak values.
        xc = peak_pos(x_y_curve, &wG, &y0, &A2);
        wL = wG;
        // End of editable part
}
Hinweis:

Wenn Sie Automatische Initialisierung aktivieren aktivieren und den Initialisierungscode eingeben, deckt sich dieser Code mit den Initialisierungswerten in Parametereinstellungen.

Anpassen der Kurve

Unabhängig davon, welche Parameterinitialisierungsmethode Sie verwenden, markieren Sie Spalte B und drücken Sie Strg + Y, um das Dialogfeld NLFit aufzurufen. Wählen Sie dann die Funktion ExpVoigt und führen Sie die Anpassung durch. Das Ergebnis sollte folgendermaßen aussehen:

Image:Fit_Function_with_Nonconstant_Background_008.png