Montaje de parámetro dentro de un pitón usando integral (o en otro idioma útil)

votos
0

Tengo un conjunto de datos, básicamente con la información de f (x) como una función de x, y X en sí. Sé por la teoría del problema que estoy trabajando en el formato de f (x), que se da como la siguiente expresión:

Eq.

En esencia, quiero utilizar este conjunto de datos para encontrar los parámetros a y b. Mi problema es: ¿Cómo puedo hacer eso? Lo biblioteca debería usar? Me gustaría una respuesta usando Python. Pero Julia R o estaría bien también.

A partir de todo lo que había hecho hasta ahora, he leído acerca de una funcionabilidad llamada curva de ajuste de la biblioteca SciPy pero estoy teniendo algunos problemas en los cuales forman lo haría el código siempre mi variable x se encuentra en uno de los límites de integración .

Para obtener mejores formas de trabajar con el problema, también tengo los siguientes recursos:

Un conjunto de muestras , por lo que yo sé los parámetros que estoy buscando. Para este conjunto Sé que a = 2 y b = 1 (y c = 3). Y antes de que se levanta algunas preguntas sobre cómo sé que estos parámetros: Sé que ya he creado este conjunto de muestras usando estos parámetros de la integración de la ecuación anterior sólo para usar la muestra para investigar cómo puedo encontrarlos y tener una referencia.

También tengo este conjunto , por lo que la única información que tengo es que c = 4 y quiero encontrar a y b.

También me gustaría señalar que:

i) en este momento no tengo ningún código para publicar aquí porque no tengo ni idea de cómo escribir algo para resolver mi problema. Pero yo estaría feliz de editar y actualizar la pregunta después de leer cualquier respuesta o ayuda que ustedes me podrían proporcionar.

ii) Busco primera para una solución en la que no sé a y b. Pero en caso de que sea demasiado duro estaría feliz de ver un poco de solución donde supongo que uno sea A o B se conocen.

Publicado el 13/01/2020 a las 21:59
fuente por usuario
En otros idiomas...                            


2 respuestas

votos
0

Son tres variables a, b, c, que no son independientes. Uno de ellos se debe dar si queremos calcular los dos otros gracias a la regresión. Con dada C, la solución para a, b es simple:

introducir descripción de la imagen aquí

El ejemplo de cálculo numérico a continuación se hace con un pequeño de datos (n = 10) con el fin de hacer que sea fácil de comprobar.

introducir descripción de la imagen aquí

Tenga en cuenta que la regresión es para la función t (y) wich no es exactamente el mismo que para y (x) cuando se dispersa los datos (el resultado es el mismo si no dispersión).

Si es absolutamente necesario disponer de la regresión para y (x) es necesaria una regresión no lineal. Esto implica un proceso iterativo a partir de buena conjetura inicial lo suficientemente para a, b. El cálculo anterior da muy buenos valores iniciales.

ADICIONALMENTE :

Mientras tanto, Andrea ha publicado una respuesta pertinente. Por supuesto, el ajuste con su método es mejor porque se trata de una regresión no lineal en lugar de lineal, como ya se ha señalado en la nota anterior.

Sin embargo, dispite los diferentes valores (a = 1,881; b = 1,617) en comparación con (a = 2,346, b = -0,361) las curvas respectivas extraídas a continuación no están lejos una de la otra:

Curva azul: a partir de la regresión lineal (método anterior)

curva verde: a partir de la regresión no lineal (de Andrea)

introducir descripción de la imagen aquí

Respondida el 14/01/2020 a las 13:25
fuente por usuario

votos
0

Me gustaría utilizar un enfoque numérico puro, que se puede utilizar incluso cuando no puede resolver directamente la integral. He aquí una snipper para el montaje de sólo el 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)

introducir descripción de la imagen aquí

Por supuesto, se puede disminuir el valor de dxobtener la precisión deseada. Mientras que para el montaje de sólo el a, cuando intenta abeto b, así, el ajuste no converge correctamente (en mi opinión porque a, y bestán fuertemente correlacionados). Esto es lo que se obtiene:

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

introducir descripción de la imagen aquí

Como se puede ver, incluso si las resultantes ay bparámetros forman el ajuste son "no es bueno", la trama es muy similar.

Respondida el 14/01/2020 a las 14:24
fuente por usuario

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