Lato parametro all'interno di un integrale utilizzando pitone (o un'altra lingua utile)

voti
0

Ho una serie di dati, sostanzialmente con le informazioni di f (x) in funzione di x, e X stesso. So che dalla teoria del problema che sto lavorando sul formato di f (x), che è dato come l'espressione di seguito:

Eq.

In sostanza, voglio usare questo insieme di dati per trovare i parametri a e b. Il mio problema è: come posso farlo? Cosa biblioteca dovrei usare? Vorrei una risposta utilizzando Python. Ma R o Julia sarebbe ok.

Da tutto quello che avevo fatto finora, ho letto di un functionallity chiamato forma curva dalla libreria SciPy ma sto avendo qualche problema in cui formare avrei fatto il codice più a lungo la mia variabile x si trova in una delle zone limite di integrazione .

Per modi migliori di lavorare con il problema, ho anche le seguenti risorse:

Un set di campioni , per cui so che i parametri che sto cercando. Per questo insieme So che a = 2 e b = 1 (e c = 3). E prima che si eleva alcune domande su come so che questi parametri: So che perché ho creato questo set campione utilizzando questi parametri dall'integrazione dell'equazione sopra solo per utilizzare l'esempio di indagare come posso trovarli e avere un riferimento.

Ho anche questo set , per cui l'unica informazione che ho è che c = 4 e voglio trovare a e b.

Vorrei anche far notare che:

i) in questo momento non ho il codice per inviare qui perché non ho la minima idea di come scrivere qualcosa per risolvere il mio problema. Ma sarei felice di modificare e aggiornare la domanda dopo aver letto alcuna risposta o aiuto che voi ragazzi potrebbero fornire me.

ii) Sto cercando prima di una soluzione in cui non so a e b. Ma nel caso che è troppo difficile sarei felice di vedere qualche soluzione in cui suppongo che uno o B è noto.

È pubblicato 13/01/2020 alle 21:59
fonte dall'utente
In altre lingue...                            


2 risposte

voti
0

Sono tre variabili a, b, c, che non sono indipendenti. Uno di loro deve essere data, se vogliamo calcolare i due altri grazie alla regressione. Con data c, risolvendo per a, b è semplice:

entrare descrizione dell'immagine qui

L'esempio di calcolo numerico sotto è fatto con una piccola dati (n = 10) per rendere più facile da controllare.

entrare descrizione dell'immagine qui

Si noti che la regressione è per la funzione t (y) wich non è esattamente lo stesso che per y (x) quando i dati vengono sparsi (Il risultato è lo stesso se nessuna dispersione).

Se è assolutamente necessario avere la regressione di y (x) è necessaria una regressione non lineare. Si tratta di un processo iterativo partendo dalla buona congettura iniziale abbastanza per una, b. Quanto sopra calcolo dà ottimi valori iniziali.

INOLTRE :

Nel frattempo Andrea ha registrato una risposta pertinente. Naturalmente il raccordo con il suo metodo è migliore perché questa è una regressione non lineare anziché lineare come già evidenziato nella nota precedente.

Tuttavia, sforza i diversi valori (a = 1.881; b = 1.617) rispetto a (a = 2.346, b = -0,361) le rispettive curve disegnate seguito non sono lontani l'uno dall'altro:

Curva blu: dalla regressione lineare (metodo di cui sopra)

curva verde: dalla regressione non lineare (di Andrea)

entrare descrizione dell'immagine qui

Risposto il 14/01/2020 a 13:25
fonte dall'utente

voti
0

Vorrei utilizzare un approccio numerico puro, che si può usare anche quando non si può risolvere direttamente l'integrale. Ecco uno snipper per il montaggio solo il aparametro:

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)

entrare descrizione dell'immagine qui

Naturalmente, è possibile ridurre il valore di dxper ottenere la precisione desiderata. Mentre per il montaggio solo la a, quando si tenta di abete bcosì, la misura non converge correttamente (a mio parere perché ae bsono fortemente correlati). Ecco cosa si ottiene:

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

entrare descrizione dell'immagine qui

Come si può vedere, anche se i risultanti ae bparametri costituiscono la misura "non sono buone", la trama è molto simile.

Risposto il 14/01/2020 a 14:24
fonte dall'utente

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