Montering parameter inne i en integrert ved hjelp av python (eller en annen nyttig språk)

stemmer
0

Jeg har et sett av data, i utgangspunktet med informasjon av f (x) som en funksjon av x, og x i seg selv. Jeg vet fra teorien om problemet som jeg jobber med formatet f (x), som er gitt som uttrykket nedenfor:

Eq.

I hovedsak vil jeg bruke dette settet med data for å finne de parametrene a og b. Problemet mitt er: Hvordan kan jeg gjøre det? Hva bibliotek bør jeg bruke? Jeg ønsker et svar ved hjelp av Python. Men R eller Julia ville være ok også.

Fra alt jeg hadde gjort så langt, jeg har lest om en functionallity kalt kurve fra SciPy biblioteket, men jeg har noen problemer i hvilken form jeg ville gjøre koden så lenge min x variabel ligger i en av integrasjonsgrensen .

For bedre måter å jobbe med problemet, jeg har også følgende ressurser:

En prøvesett , som jeg vet parametrene jeg leter etter. Til dette settet jeg vet at a = 2 og b = 1 (og c = 3). Og før den stiger noen spørsmål om hvordan jeg vet disse parametrene: Jeg vet de fordi jeg laget denne prøvesett ved hjelp av denne parameterne fra integreringen av ligningen ovenfor bare å bruke prøven for å undersøke hvordan kan jeg finne dem og ha en referanse.

Jeg har også dette settet , som den eneste informasjonen jeg har er at c = 4 og ønsker å finne a og b.

Jeg ønsker også å påpeke at:

i) akkurat nå har jeg ingen kode for å poste her fordi jeg ikke har en anelse om hvordan å skrive noe for å løse mitt problem. Men jeg ville være glad for å redigere og oppdatere spørsmålet etter å ha lest noen svar eller hjelp som dere kunne gi meg.

ii) Jeg ser først for en løsning der jeg ikke vet a og b. Men i tilfelle at det er for vanskelig jeg ville være glad for å se noen løsning der jeg antar at man enten a eller b er kjent.

Publisert på 13/01/2020 klokken 23:59
kilden bruker
På andre språk...                            


2 svar

stemmer
0

De er tre variable a, b, c som er ikke uavhengige. En av dem må gis hvis vi vil beregne de to andre takket være regresjon. Ved gitte c, løse med hensyn på a, b er enkel:

skriv bildebeskrivelse her

Eksemplet med numeriske beregning følgende fremstilles med en liten data (n = 10) for å gjøre det lett å kontrollere.

skriv bildebeskrivelse her

Merk at regresjonen er for funksjonen t (y) wich er ikke nøyaktig den samme som for y (x) når dataene blir spredt (Resultatet er det samme hvis ingen spredning).

Hvis det er helt nødvendig å ha regresjon for y (x) en ikke-lineær regresjon er nødvendig. Dette innebærer en iterativ prosess som starter fra god nok startverdi for a, b. Ovennevnte kalkulus gir meget gode startverdier.

I TILLEGG :

Imens Andrea postet et relevant svar. Selvfølgelig passer med hans metode er bedre fordi dette er en ikke-lineær regresjon i stedet for lineær som allerede påpekt i ovennevnte notat.

Ikke desto mindre, pund selv om de ulike verdiene (a = 1,881, b = 1,617) sammenlignet med (a = 2,346, b = -0,361) de respektive kurvene tegnet nedenfor er ikke langt fra hverandre:

Blå kurve: fra lineær regresjon (ovennevnte metode)

Grønn kurve: fra ikke-lineær regresjon (Andreas)

skriv bildebeskrivelse her

Svarte 14/01/2020 kl. 15:25
kilden bruker

stemmer
0

Jeg ville bruke en ren numerisk tilnærming, som du kan bruke selv når du ikke kan direkte løse integral. Her er en Snipper for montering bare 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)

skriv bildebeskrivelse her

Selvfølgelig kan du redusere verdien av dxå få den ønskede presisjon. Mens for montering bare a, når du prøver å gran bi tillegg, betyr det passer ikke konvergerer riktig (etter min mening fordi aog ber sterkt korrelert). Her er hva du får:

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

skriv bildebeskrivelse her

Som du kan se, selv om de resulterende aog bparametrene danner passform er "ikke bra", er plottet svært like.

Svarte 14/01/2020 kl. 16:24
kilden bruker

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