Montarea parametrilor în interiorul unei folosind piton integral (sau o altă limbă utilă)

voturi
0

Am un set de date, în principiu, cu informațiile de f (x) ca funcție de x, și se x. Știu de la teoria problemei pe care lucrez la formatul f (x), care este dat ca expresia de mai jos:

Eq.

În esență, vreau să folosesc acest set de date pentru a găsi parametrii a și b. Problema mea este: Cum pot face asta? Ce bibliotecă ar trebui să folosesc? Aș dori un răspuns folosind Python. Dar R sau Julia ar fi ok la fel de bine.

Din tot ce am făcut până acum, am citit despre o functionallity numita curbă în formă de bibliotecă SciPy dar am unele probleme în care forma aș face codul meu , atâta timp x variabila este situat într - una din limita de integrare .

Pentru modalitati mai bune de a lucra cu problema, am, de asemenea, următoarele resurse:

Un set de probă , pentru care știu parametrii pe care le caut. Pentru acest set știu că o = 2 și b = 1 (și c = 3). Și înainte de a ridica câteva întrebări cu privire la modul în care știu acești parametri: Eu știu că am creat acest set de probă , folosind acest parametrii de integrare a ecuației de mai sus doar pentru a utiliza proba pentru a investiga modul în care le pot găsi și au o referință.

Am , de asemenea , acest set , pentru care singurele informații am este aceea că c = 4 și doresc să găsească o și b.

De asemenea, aș dori să subliniez faptul că:

i) chiar acum am nici un cod pentru a posta aici, pentru că nu au o idee despre cum să scrie ceva pentru a rezolva problema mea. Dar aș fi fericit să editeze și să actualizeze întrebarea după ce a citit nici un răspuns sau ajutor pe care voi putea sa-mi oferi.

ii) Caut mai întâi o soluție în cazul în care nu știu a și b. Dar, în cazul în care este prea greu, aș fi fericit să văd unele soluții în cazul în care presupun că unul, fie a sau b este cunoscută.

Întrebat 13/01/2020 la 23:59
sursa de către utilizator
În alte limbi...                            


2 răspunsuri

voturi
0

Acestea sunt trei variabile a, b, c, care nu sunt independente. Una dintre ele trebuie să aibă, dacă vrem calcula două altele datorită regresie. Cu dat c, pentru rezolvarea a, b este simplu:

introduceți descrierea imaginii aici

Exemplul de calcul numeric de mai jos se face cu un mic de date (n = 10), în scopul de a face mai ușor de verificat.

introduceți descrierea imaginii aici

Rețineți că regresia este pentru funcția t (y) nu este exact CARE la fel ca și pentru y (x), atunci când datele sunt împrăștiate (Rezultatul este același în cazul în care nici o împrăștiere).

Dacă este absolut necesar să aibă regresia pentru y (x) este necesară o regresie non-lineară. Acest lucru implică un proces iterativ pornind de la bun ghici inițială enought pentru a, b. Calculul de mai sus dă valori inițiale foarte bune.

ÎN PLUS :

Între timp, Andrea a postat un răspuns pertinent. Desigur, dotarea cu metoda lui este mai bine, deoarece aceasta este o regresie non-liniară în loc de liniare așa cum deja a subliniat în nota de mai sus.

Cu toate acestea, în ciuda faptului diferitele valori (a = 1,881; b = 1.617), comparativ cu (a = 2.346, b = -0.361) curbele respective trase de mai jos nu sunt departe unul de altul:

Albastru curba: de regresie liniară (metoda de mai sus)

Curba verde: de regresie non-lineară (Andrea)

introduceți descrierea imaginii aici

Publicat 14/01/2020 la 15:25
sursa de către utilizator

voturi
0

Mi - ar folosi o abordare numerică pură, pe care o puteți utiliza chiar și atunci când nu se poate rezolva în mod direct integralei. Iată un Snipper pentru montarea numai aparametru:

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)

introduceți descrierea imaginii aici

Desigur, puteți reduce valoarea dxpentru a obține precizia dorită. În timp ce pentru montarea doar a, atunci când încercați să brad b, de asemenea, se potrivesc nu converg în mod corespunzător (în opinia mea , deoarece ași bsunt puternic corelate). Iată ce veți obține:

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

introduceți descrierea imaginii aici

După cum puteți vedea, chiar dacă rezultă ași bparametrii formează se potrivesc „nu sunt bune“, intriga este foarte asemănătoare.

Publicat 14/01/2020 la 16:24
sursa de către utilizator

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