Montage parameter binnen een integraal met Python (of een andere bruikbare taal)

stemmen
0

Ik heb een reeks gegevens wezen de informatie van f (x) als functie van x en x zelf. Ik weet uit de theorie van het probleem dat ik ben bezig met het formaat van f (x), die wordt gezien als de uitdrukking hieronder:

Eq.

Hoofdzakelijk, wil ik deze set van gegevens gebruiken om de parameters a en b vinden. Mijn probleem is: Hoe kan ik dat doen? Wat bibliotheek moet ik gebruiken? Ik wil graag een antwoord met behulp van Python. Maar R of Julia ok zou zijn als goed.

Van alles wat ik tot nu toe gedaan, ik heb gelezen over een functionallity genaamd curve fit uit de scipy bibliotheek, maar ik heb wat problemen in welke vorm ik de code zou doen, zolang mijn x variabele is gelegen in een van de integratie limiet .

Voor een betere manieren van werken met het probleem, heb ik ook de volgende bronnen:

Een sample set , waarvoor ik de parameters ik ben op zoek naar weten. Om deze set ik weet dat a = 2 en b = 1 (c = 3). En voordat hij stijgt een aantal vragen over hoe ik weet dat deze parameters: Ik weet dat omdat ik dit sample set met behulp van deze parameters uit de integratie van de bovenstaande vergelijking alleen maar om het monster te gebruiken om te onderzoeken hoe kan ik ze vinden en hebben een verwijzing gemaakt.

Ik heb ook deze set , waarvoor de enige informatie die ik heb is dat c = 4 en wilt a en b vinden.

Ik zou ook graag op wijzen dat:

i) op ​​dit moment heb ik geen code om hier te posten, want ik heb geen idee hoe om iets te schrijven aan mijn probleem op te lossen. Maar ik zou blij zijn om te bewerken zijn en de vraag bij te werken na het lezen van geen antwoord of hulp die jullie me zou kunnen bieden.

ii) Ik ben voor het eerst op zoek naar een oplossing waar ik weet het niet a en b. Maar in het geval dat het te moeilijk zou ik graag enkele oplossing waarbij ik veronderstel dat men ofwel a of b is bekend te zien.

De vraag is gesteld op 13/01/2020 om 21:59
bron van user
In andere talen...                            


2 antwoorden

stemmen
0

Ze drie variabelen a, b, c die niet onafhankelijk zijn. Een van hen moet worden verleend als we willen berekenen de twee anderen dankzij regressie. Met gegeven c, het oplossen van a, b is eenvoudig:

voer image beschrijving hier

Het voorbeeld van numerieke calculus hieronder is gemaakt met een kleine hoeveelheid gegevens (n ​​= 10) om het gemakkelijk te controleren.

voer image beschrijving hier

Merk op dat de regressie van de functie t (y) welke niet exact hetzelfde als voor y (x) wanneer de gegevens worden verspreid (Het resultaat is hetzelfde als er geen verstrooiing).

Als het absoluut noodzakelijk om de regressie van y (x) een niet-lineaire regressie noodzakelijk. Hiermee is een iteratief proces uitgaande van goed genoeg beginschatting voor a, b. De bovenstaande calculus geeft zeer goede beginwaarden.

DAARNAAST :

Ondertussen Andrea postte een pertinente antwoord. Natuurlijk is de fitting met zijn methode is beter, want dit is een niet-lineaire regressie in plaats van lineair zoals reeds in het bovenstaande noot.

Toch ondanks dat de verschillende waarden (a = 1,881; b = 1,617) in vergelijking met (a = 2,346, b = -0,361) de respectievelijke curven hieronder getekend zijn niet ver van elkaar:

Blauwe curve: uit lineaire regressie (bovenstaande methode)

Groene curve: van niet-lineaire regressie (Andrea's)

voer image beschrijving hier

antwoordde op 14/01/2020 om 13:25
bron van user

stemmen
0

Ik zou een pure numerieke aanpak, die u ook kunt gebruiken wanneer u niet direct de integrale kan oplossen gebruiken. Hier is een snipper voor het aanbrengen van alleen de 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)

voer image beschrijving hier

Natuurlijk kunt u de waarde van te verlagen dxom de gewenste nauwkeurigheid te krijgen. Terwijl voor de montage alleen het a, wanneer u probeert om spar bals goed, de pasvorm niet goed samen (in mijn mening, want aen bzijn sterk gecorreleerd). Hier is wat je krijgt:

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()

voer image beschrijving hier

Zoals u kunt zien, zelfs als de resulterende aen bparameters vormen de fit zijn "niet goed", de plot is zeer vergelijkbaar.

antwoordde op 14/01/2020 om 14:24
bron van user

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