Anpassungsparameter innerhalb eines integral mit Python (oder einem anderen nützliche Sprache)

stimmen
0

Ich habe eine Reihe von Daten, im Grunde mit der Information von f (x) als Funktion von x, und x selbst. Ich weiß aus der Theorie des Problems, dass ich auf das Format von f (x) gerade arbeitete, die im Folgenden als Ausdruck gegeben:

Gl.

Im Wesentlichen möchte ich diesen Satz von Daten verwenden, um die Parameter a und b zu finden. Mein Problem ist: Wie kann ich das tun? Was Bibliothek soll ich verwenden? Ich möchte eine Antwort mit Python. Aber R oder Julia wäre auch in Ordnung sein.

Von allem , was ich bisher getan habe, habe ich über eine functionallity genannt lesen Kurvenanpassung aus der SciPy Bibliothek , aber ich einige Probleme, in welcher Form ich den Code tun würde , so lange meine x - Variable in einer der Integrationsgrenze liegt .

Für bessere Möglichkeiten, sich mit dem Problem arbeiten, ich habe auch die folgenden Ressourcen:

Ein Probensatz , für die ich die Parameter kennen ich suche. Zu diesem Satz ich weiß , dass a = 2 und b = 1 (und c = 3). Und bevor es einige Fragen über steigt , wie ich weiß , diese Parameter: Ich weiß , dass sie , weil ich diese Probe Set unter Verwendung dieser Parameter erstellt aus der Integration der obigen Gleichung nur die Probe zu verwenden , um zu untersuchen , wie kann ich sie finden und eine Referenz.

Ich habe auch diesen Satz , für die die einzige Information I habe , dass c = 4 und will a und b zu finden.

Ich möchte auch darauf hinweisen, dass:

i) jetzt habe ich keinen Code hier posten, weil ich etwas keine Ahnung haben, wie man schreibt mein Problem zu lösen. Aber ich würde gerne zu bearbeiten und aktualisieren Sie die Frage nach dem Lesen eine Antwort oder Hilfe, die ihr Jungs mich zur Verfügung stellen könnte.

ii) Ich suche zuerst nach einer Lösung, wo ich nicht weiß, a und b. Aber für den Fall, dass es zu schwierig ist, würde ich gerne eine Lösung sehen, wo ich, dass man annehmen, entweder a oder b bekannt ist.

Veröffentlicht am 13/01/2020 um 23:59
quelle vom benutzer
In anderen Sprachen...                            


2 antworten

stimmen
0

Sie sind drei Variablen a, b, c, die nicht unabhängig sind. Einer von ihnen ist geboten, wenn wir die beiden anderen durch Regression berechnet werden soll. Bei gegebenen c, für eine Lösung, b ist einfach:

Geben Sie hier image description

Das Beispiel von numerischen Calculus unten mit einem kleinen Daten (n = 10) durchgeführt, um es einfach zu machen, zu überprüfen.

Geben Sie hier image description

Man beachte, dass die Regression ist für die Funktion t (y) Weichen nicht genau die gleiche wie für y (x), wenn die Daten gestreut werden (Das Ergebnis ist das gleiche, wenn nicht scatter).

Wenn es unbedingt notwendig ist, die Regression für y (x) hat eine nicht-lineare Regression erforderlich. Dies beinhaltet einen iterativen Prozess von gut genug anfängliche Schätzung beginnend für a, b. Das obige Kalkül gibt sehr gute Anfangswerte.

UND DAZU :

Inzwischen geschrieben Andrea eine relevante Antwort. Natürlich ist die Bestückung mit seiner Methode ist besser, weil diese anstelle der linearen eine nichtlineare Regression ist wie bereits in der obigen Notiz hingewiesen.

Trotzdem dispite die unterschiedlichen Werte (a = 1,881, b = 1,617) im Vergleich zu (a = 2,346, b = -0,361) unter den jeweiligen Kurven gezeichnet sind nicht weit voneinander:

Blaue Kurve: aus dem linearen Regression (obiges Verfahren)

Grüne Kurve: von nicht-linearer Regression (Andrea)

Geben Sie hier image description

Beantwortet am 14/01/2020 um 15:25
quelle vom benutzer

stimmen
0

Ich würde einen rein numerischen Ansatz verwenden, die Sie verwenden können , selbst wenn Sie nicht direkt das Integral lösen können. Hier ist ein snipper für die Montage nur die aParameter:

import numpy as np
from scipy.optimize import curve_fit
import pandas as pd
import matplotlib.pyplot as plt

def integrand(x, a):
    b = 1
    c = 3
    return 1/(a*np.sqrt(b*(1+x)**3 + c*(1+x)**4))

def integral(x, a):
    dx = 0.001
    xx = np.arange(0, x, dx)
    arr = integrand(xx, a)
    return np.trapz(arr, dx=dx, axis=-1)

vec_integral = np.vectorize(integral)

df = pd.read_csv('data-with-known-coef-a2-b1-c3.csv')
x = df.domin.values
y = df.resultados2.values
out_mean, out_var = curve_fit(vec_integral, x, y, p0=[2])

plt.plot(x, y)
plt.plot(x, vec_integral(x, out_mean[0]))
plt.title(f'a = {out_mean[0]:.3f} +- {np.sqrt(out_var[0][0]):.3f}')
plt.show()

vec_integral = np.vectorize(integral)

Geben Sie hier image description

Natürlich können Sie den Wert senken dxdie gewünschte Genauigkeit zu erhalten. Während für die Montage nur die a, wenn Sie fir versuchen bauch, wird die Passform konvergieren nicht richtig (meiner Meinung nach, weil aund bstark korreliert sind). Hier ist , was Sie bekommen:

def integrand(x, a, b):
    c = 3
    return 1/(a*np.sqrt(np.abs(b*(1+x)**3 + c*(1+x)**4)))

def integral(x, a, b):
    dx = 0.001
    xx = np.arange(0, x, dx)
    arr = integrand(xx, a, b)
    return np.trapz(arr, dx=dx, axis=-1)

vec_integral = np.vectorize(integral)

out_mean, out_var = sp.optimize.curve_fit(vec_integral, x, y, p0=[2,3])
plt.title(f'a = {out_mean[0]:.3f} +- {np.sqrt(out_var[0][0]):.3f}\nb = {out_mean[1]:.3f} +- {np.sqrt(out_var[1][1]):.3f}')

plt.plot(x, y, alpha=0.4)
plt.plot(x, vec_integral(x, out_mean[0], out_mean[1]), color='green', label='fitted solution')
plt.plot(x, vec_integral(x, 2, 1),'--', color='red', label='theoretical solution')
plt.legend()
plt.show()

Geben Sie hier image description

Wie Sie sehen können, auch wenn die daraus resultierenden aund bParameter , die die Passung bilden , sind „nicht gut“, ist die Handlung sehr ähnlich.

Beantwortet am 14/01/2020 um 16:24
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more