Closed jsilveyra closed 10 months ago
Estuve pensando y me parece que hay una forma mejor y más fácil de arreglar este bug. Habría que revisar cómo se calcula Mdato a partir del Hx. Me parece que se debe estar usando la función interop1 sin la extrapolación, que es lo que habría que agregar, para cuando Hx cae fuera del dominio: Vq = INTERP1(X,V,Xq'linear','extrap')
Hasta ahora creía que el error que aparecía al poner 2 o más componentes; "Fitting failed after 0.19 s: Unhandled problem encountered; please contact the author with this exact message, and your exact inputs." era por no poner buenos seeds y bounds y tener ya muchas variables.
Pero me di cuenta de que ese no era el problema. A lo sumo encuentra una solución pésima si uno no inicializa bien, pero no error. El problema está en que yo había dicho que Hx:n tenía que ser el promedio (Hcr_n + Hcr_n+1)/2 Y eso es bastante así en la solución óptima. Pero al inicializar, hay algo más importante para no terminar en error. Hx es el campo del eje de abscisas de un punto de la curva dato donde le pedimos a la curva modelada que coincida, además de en el origen y en la punta (tip), donde ya le pedimos cuando hay 1 sola componente: al ir agregando componentes, vamos agregando puntos de la curva como restricciones. Es decir, Hx tiene que estar sí o sí en el domino de la curva dato, sin incluir los puntos extremos "tip" y origen (si es que tiene el origen la curva dato). Pero con los valores que tenemos por default de Hcr1 y Hcr2, puede que Hx1 de un valor que esté fuera de ese dominio.
En el ejemplo de abajo, que daba error incluso al poner "Calculate & Plot", es decir, sin intentar fittear todavía, el Hx1 que aparecía por default, era menor al primer punto positivo de la curva:
Por lo tanto, para corregir este problema, habría que poner que, por default, el seed de Hx_1 fuera el primer punto positivo de la curva (es decir, no cuenta el 0 de estar en la curva dato); Hx_2, el segundo, Hx_3 el tercero... Además, por las dudas, el lower bound de todos los Hx debería ser el primer punto positivo de la curva y el upper bound el anteúltimo (es decir, no el tip sino el anterior).
Igualmente, para hallar una buena solución, conviene ayudarle un poco al solver poniendo buenas seeds a mano mirando el gráfico. Si no, puede que converja en cualquier lugar. Pero ya no va a dar más error por lo menos.
Perdón por darme cuenta de este error mío recién ahora.