Montáž parametr uvnitř integrální Python (nebo jiný vhodný jazyk)

hlasů
0

Mám sadu dat, v podstatě s informacemi o f (x) jako funkce x, a x sám. Znám z teorie problému, který jsem pracoval na formátu f (x), která je uvedena jako výraz níže:

Ekv.

V podstatě chci používat tuto sadu dat najít parametry A a B. Můj problém je: Jak to mám udělat? Co knihovny bych měl použít? Chtěl bych odpověď Python. Ale R nebo Julia by bylo ok stejně.

Ze všeho, co jsem udělal tak daleko, jsem četl o functionallity volal proložení z knihovny scipy ale mám nějaké problémy, v nichž tvoří tak dlouho, můj x proměnná se nachází v jedné z limitu integrace bych dělat kód ,

Pro lepší způsoby práce s tímto problémem, mám také v následujících zdrojích:

Vzorek set , u nichž vím, že parametry já hledají. K této sady vím, že a = 2, b = 1 (a c = 3). A před tím, než se zvedne pár otázek o tom, jak vím, že tyto parametry: Já vím, že proto, že jsem vytvořil tento ukázkový soubor pomocí těchto parametrů z integrace do výše uvedené rovnice, jen aby použít vzorek, aby prošetřila, jak mohu najít a mít odkaz.

Mám také tuto sadu , pro které je jediná informace mám, je, že c = 4 a chtějí najít a b.

Také bych rád zdůraznil, že:

i) právě teď nemám kód zveřejnit tady, protože nemám ponětí, jak napsat něco vyřešit můj problém. Ale byl bych rád, upravovat a po přečtení žádnou odpověď či pomoc, kterou kluci mi mohl poskytnout aktuální otázku.

ii) Dívám se nejprve pro řešení, kdy nevím, a a b. Ale v případě, že je příliš tvrdý Byl bych rád se podívat na nějaké řešení, kde jsem se předpokládat, že jeden buď a nebo b je znám.

Položena 13/01/2020 v 23:59
zdroj uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
0

Jsou tři proměnné a, b, c, které nejsou nezávislé. Jeden z nich musí být uveden, pokud chceme vypočítat dvěma dalšími díky regresi. S daným c, řešení pro a, b je jednoduchá:

zadejte popis obrázku zde

Příklad číselného počtu níže se provádí s malým dat (n = 10), tak, aby se snadno kontrolovatelná.

zadejte popis obrázku zde

Všimněte si, že regrese je pro funkci t (y) Která není přesně stejné jako pro y (x), když je datový rozptýlené (Výsledek je stejný, pokud nedošlo k rozptylu).

V případě, že je to nezbytně nutné, aby regrese pro y (x) nelineární regrese je nezbytné. To zahrnuje iterativní proces byl z dobrého enought prvním odhadem a, b. Výše uvedený počet dává velmi dobré počáteční hodnoty.

Kromě toho:

Mezitím Andrea vykázal relevantní odpověď. Samozřejmě tvarovky s jeho metody je lepší, protože se jedná o nelineární regrese namísto lineární jak již bylo uvedeno ve výše uvedeném sdělení.

Nicméně, dispite různé hodnoty (a = 1,881, B = 1,617) ve srovnání s (a = 2,346, b = -0,361) příslušné křivky níže tažené nejsou daleko od sebe:

Modrá křivka: z lineární regrese (výše uvedeným způsobem)

Zelená křivka: z nelineární regrese (Andrea je)

zadejte popis obrázku zde

Odpovězeno 14/01/2020 v 15:25
zdroj uživatelem

hlasů
0

Chtěl bych použít čistě numerický přístup, který lze použít, i když není možné přímo vyřešit integrál. Zde je snipper pro montáž pouze aparametr:

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)

zadejte popis obrázku zde

Samozřejmě, můžete snížit hodnotu dxzískat požadovanou přesnost. Zatímco pro montáž jen apři pokusu o jedle bstejně, fit nebude konvertován správně (dle mého názoru následujících důvodů aa bjsou silně korelovány). Tady je to, co dostanete:

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

zadejte popis obrázku zde

Jak můžete vidět, i když výsledné aa bparametry tvoří fit „nejsou dobré“, děj je velmi podobná.

Odpovězeno 14/01/2020 v 16:24
zdroj uživatelem

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