Montagem parâmetro dentro de um usando python integral (ou outra língua útil)

votos
0

Eu tenho um conjunto de dados, basicamente, com a informação de f (x) como uma função de x, e x em si. Eu sei que a partir da teoria do problema que eu estou trabalhando no formato de f (x), que é dada como a expressão abaixo:

Eq.

Essencialmente, eu quero usar este conjunto de dados para encontrar os parâmetros a e b. Meu problema é: Como posso fazer isso? Qual biblioteca devo usar? Eu gostaria de ter uma resposta usando Python. Mas R ou Julia seria ok também.

De tudo o que eu tinha feito até agora, eu li sobre um functionallity chamada curva de ajuste da biblioteca SciPy mas eu estou tendo alguns problemas de que forma eu faria o código desde o meu x variável está localizado em uma das limite de integração .

Para melhores maneiras de trabalhar com o problema, eu também tenho os seguintes recursos:

Um conjunto de amostras , por que eu sei que os parâmetros que eu estou procurando. Para este conjunto I sabe que a = 2 e b = 1 (e c = 3). E antes que se levante algumas perguntas sobre como eu sei que estes parâmetros: Eu sei que eles, porque eu criei este conjunto de amostras utilizando estes parâmetros a partir da integração da equação acima apenas para usar a amostra para investigar como posso encontrá-los e ter uma referência.

Eu também tenho esse conjunto , para o qual a única informação que tenho é que c = 4 e quer encontrar um e b.

Gostaria também de salientar que:

i) no momento eu não tenho nenhum código para postar aqui, porque eu não tenho a menor idéia de como escrever algo para resolver o meu problema. Mas eu ficaria feliz em editar e atualizar a questão depois de ler qualquer resposta ou ajuda que vocês poderiam me fornecer.

ii) Eu estou olhando primeiro para uma solução onde eu não sei a e b. Mas no caso de que é muito difícil que eu ficaria feliz em ver alguns solução onde eu suponho que um a ou b é conhecido.

Publicado 13/01/2020 em 23:59
fonte usuário
Em outras línguas...                            


2 respostas

votos
0

Eles são três variáveis ​​a, b, c que não são independentes. Um deles deve ser dada se queremos calcular os outros dois, graças à regressão. Com dado c, resolvendo para a, b é simples:

digite descrição da imagem aqui

O exemplo de cálculo numérico inferior é feito com um pequeno dados (n = 10), a fim de torná-lo fácil de verificar.

digite descrição da imagem aqui

Note-se que a regressão é para a função t (y) os quais não é exactamente o mesmo que para y (x) quando os dados são espalhados (O resultado é o mesmo se nenhuma dispersão).

Se for absolutamente necessário ter a regressão para y (x) uma regressão não-linear é necessário. Este envolve um processo iterativo a partir de boa estimativa inicial para Lamentos, a b. O cálculo acima dá muito bons valores iniciais.

ALÉM DO QUE, ALÉM DO MAIS :

Enquanto isso Andrea postou uma resposta pertinente. Claro que o encaixe com o seu método é melhor porque esta é uma regressão não-linear, em vez de linear como já foi salientado na nota acima.

No entanto, Dispite diferentes valores (a = 1,881, b = 1,617) em comparação com (a = 2,346, b = -0,361) as respectivas curvas desenhadas abaixo não estão longe um do outro:

curva azul: a partir de regressão linear (método acima referido)

curva verde: de regressão não-linear (Andrea)

digite descrição da imagem aqui

Respondeu 14/01/2020 em 15:25
fonte usuário

votos
0

Gostaria de usar uma abordagem numérica pura, que você pode usar, mesmo quando você não pode resolver diretamente o integral. Aqui está um snipper para instalação apenas o aparâmetro:

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)

digite descrição da imagem aqui

Claro, você pode diminuir o valor de dxobter a precisão desejada. Enquanto para a montagem apenas o a, quando você tenta abeto b, bem como, o ajuste não convergir corretamente (na minha opinião, porque ae bestão fortemente correlacionados). Aqui está o que você tem:

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

digite descrição da imagem aqui

Como você pode ver, mesmo que as resultantes ae bparâmetros formar o ajuste são "não é bom", o enredo é muito semelhante.

Respondeu 14/01/2020 em 16:24
fonte usuário

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