Illesztési paraméter belsejében szerves alkalmazásával python (vagy egy másik hasznos nyelven)

szavazat
0

Van egy adathalmazt, alapvetően az információkat az f (x) függvényében x és x is. Tudom, az elmélet a probléma, hogy én dolgozom a formátum f (x), amely a megadott kifejezést az alábbiakban:

Eq.

Lényegében szeretném használni ezt adathalmazt, hogy megtalálják a és b paraméterekkel jellemzett. A problémám a következő: Hogyan tudom megcsinálni? Mi könyvtár érdemes használni? Szeretnék egy válasz Python. De R vagy Julia lenne rendben is.

Tól minden, amit tettem eddig olvastam a funkcionalitása nevű görbeilleszkedés a SciPy könyvtárban, de én némi baj, hogy milyen formában szeretnék csinálni a kódot, amíg én x változó található, az egyik az integrációs határ .

A jobb munkamódszerek a probléma, én is a következő forrásokat:

A minta készlet , amelyre tudom, hogy a paraméterek keresem. Ahhoz, hogy ez a készlet tudom, hogy a = 2 és b = 1 (és c = 3). És mielőtt emelkedik néhány kérdést, hogy hogyan tudom ezeket a paramétereket: tudom, hogy azért, mert hoztam létre ezt mintakészletbeli ezzel paramétereket az integráció a fenti egyenlet csak használni a minta vizsgálatára hogyan találom meg őket, és egy hivatkozást.

Én is ezt a készletet , amelyre az egyetlen információ van az, hogy c = 4, és szeretné megtalálni a és b.

Azt is szeretném kiemelni, hogy:

i) most nincs kódot tegye ide, mert nem egy nyom, hogyan kell írni valamit, hogy megoldja a problémát. De én szívesen szerkessze és frissítse a kérdés elolvasása után semmilyen választ, vagy segítséget, hogy ti is nyújt számomra.

ii) keresem először a megoldást, ahol nem tudom, a és b. De abban az esetben, hogy ez túl nehéz Örülnék, hogy néhány megoldást, ahol azt hiszem, hogy az egyik vagy 'b' ismert.

A kérdést 13/01/2020 21:59
a forrás felhasználó
Más nyelveken...                            


2 válasz

szavazat
0

Ők három változó a, b, c, amelyek nem függetlenek. Egyikük meg kell adni, ha azt akarjuk számítani a másik kettő köszönhetően regresszió. Az adott c, és megoldja a, b egyszerű:

írja kép leírása itt

A példa a numerikus fogkő alább készül egy kis adatok (n = 10), annak érdekében, hogy könnyen ellenőrizni.

írja kép leírása itt

Megjegyezzük, hogy a regresszió a funkció t (y) wich nem pontosan ugyanaz, mint az y (x), ha az adatok szétszórva (Az eredmény ugyanaz, ha nem szórás).

Ha ez feltétlenül szükséges, hogy a regresszió y (x) nem-lineáris regressziós szükséges. Ez magában foglalja egy iteratív folyamat kezdve jó enought kezdeti becslés a, b. A fenti fogkő ad nagyon jó kezdeti értékeket.

TOVÁBBÁ :

Közben Andrea írt egy találó választ. Természetesen a szerelvény az ő módszer jobb, mert ez egy nem-lineáris regressziós lineáris helyett, ahogyan azt már a fenti megjegyzés.

Mindazonáltal, dispite a különböző értéket (a = 1,881, b = 1,617), mint a (a = 2,346, b = -0,361) a megfelelő görbék alább közölt nem messze az egyik a másik:

Kék görbe: lineáris regressziós (fenti módszer)

Zöld görbe nem lineáris regresszió (Andrea)

írja kép leírása itt

Válaszolt 14/01/2020 13:25
a forrás felhasználó

szavazat
0

Szeretném használni a tiszta numerikus megközelítés, amelynek segítségével akkor is, ha közvetlenül nem oldja meg az integrál. Itt egy szabó beszereléséhez csak a aparaméter:

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)

írja kép leírása itt

Persze, akkor csökkentheti az értéket dx, hogy a kívánt pontosságot. Míg illeszkedő csak a, amikor megpróbál fenyő bis, az illeszkedés nem konvergál megfelelően (véleményem, mert aés berősen korrelál). Itt van, amit kapsz:

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

írja kép leírása itt

Mint látható, még akkor is, ha a kapott aés bparaméterek alkotják a fit „nem jó”, a cselekmény nagyon hasonló.

Válaszolt 14/01/2020 14:24
a forrás felhasználó

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