scipy.optimize.curve_fit no puede adaptarse a la curva gaussiana sesgada desplazada

Estoy tratando de ajustar una curva gaussiana sesgada y cambiada usando scipy'scurva de ajuste función, pero me parece que en ciertas condiciones el ajuste es bastante deficiente, a menudo me proporciona una línea recta o casi exacta.

El siguiente código se deriva de lacurve_fit documentación. El código proporcionado es un conjunto arbitrario de datos para fines de prueba, pero muestra el problema bastante bien.

import numpy as np
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt
import math as math
import scipy.special as sp

#def func(x, a, b, c):
#    return a*np.exp(-b*x) + c

def func(x, sigmag, mu, alpha, c,a):
    #normal distribution
    normpdf = (1/(sigmag*np.sqrt(2*math.pi)))*np.exp(-(np.power((x-mu),2)/(2*np.power(sigmag,2))))
    normcdf = (0.5*(1+sp.erf((alpha*((x-mu)/sigmag))/(np.sqrt(2)))))
    return 2*a*normpdf*normcdf + c

x = np.linspace(0,100,100)
y = func(x, 10,30, 0,0,1)
yn = y + 0.001*np.random.normal(size=len(x))

popt, pcov = curve_fit(func, x, yn,) #p0=(9,35,0,9,1))

y_fit= func(x,popt[0],popt[1],popt[2],popt[3],popt[4])

plt.plot(x,yn)
plt.plot(x,y_fit)

El problema parece surgir cuando cambio el gaussiano demasiado lejos de cero (usandomu). He intentado dar valores iniciales, incluso los idénticos a mi función original, pero no resuelve el problema. Para un valor demu=10, curve_fit Funciona perfectamente, pero si lo uso.mu>=30 Ya no se ajusta a los datos.

Respuestas a la pregunta(2)

Su respuesta a la pregunta