Ajustar una función vectorial con curve_fit en Scipy

Quiero ajustar una función con salida vectorial usando Scipy'scurve_fit (o algo más apropiado si está disponible). Por ejemplo, considere la siguiente función:

import numpy as np
def fmodel(x, a, b):
    return np.vstack([a*np.sin(b*x), a*x**2 - b*x, a*np.exp(b/x)])

Cada componente es una función diferente pero comparten los parámetros que deseo ajustar. Idealmente, haría algo como esto:

x = np.linspace(1, 20, 50)
a = 0.1
b = 0.5
y = fmodel(x, a, b)
y_noisy = y + 0.2 * np.random.normal(size=y.shape)

from scipy.optimize import curve_fit
popt, pcov = curve_fit(f=fmodel, xdata=x, ydata=y_noisy, p0=[0.3, 0.1])

Perocurve_fit no funciona con funciones con salida vectorial y un errorResult from function call is not a proper array of floats. es aventado. Lo que hice en su lugar es aplanar la salida de esta manera:

def fmodel_flat(x, a, b):
    return fmodel(x[0:len(x)/3], a, b).flatten()

popt, pcov = curve_fit(f=fmodel_flat, xdata=np.tile(x, 3),
                       ydata=y_noisy.flatten(), p0=[0.3, 0.1])

Y esto funciona. Si en lugar de una función vectorial, en realidad estoy ajustando varias funciones con diferentes entradas pero que comparten parámetros del modelo, puedo concatenar tanto la entrada como la salida.

¿Hay alguna forma más adecuada de ajustar la función vectorial con Scipy o quizás algún módulo adicional? Una consideración importante para mí es la eficiencia: las funciones reales para adaptarse son mucho más complejas y la adaptación puede llevar algún tiempo, por lo que si estecurve_fit está destrozado y está dando lugar a tiempos de ejecución excesivos. Me gustaría saber qué debo hacer en su lugar.

Respuestas a la pregunta(2)

Su respuesta a la pregunta