Последовательная подгонка кривой сложных функций с 6+ переменными в Python

Я столкнулся с серьезной проблемой, связанной с подгонкой функции к моим данным. Чтобы объяснить задачу, вот график данных с ранней подходящей версией:

похоже, чтобы опубликовать изображение, нужно как минимум 10 репутаций, поэтому вот ссылка на изображение... ---> Изображение здесь ‹---

Зеленая линия — это подогнанная функция в той области, где она была подогнана, а красная — та же самая функция, экстраполированная, чтобы увидеть, куда она пойдет. Последний бит при x>0 не имеет значения для подбора и может быть проигнорирован. Важна только S-образная кривая и два наклона по обе стороны от нее.

Я использую python и curve_fit для соответствия функциям. Что я хочу сделать сейчас, так это подогнать функцию, которая выглядит так:

f(x) = s*g(x) + t*(1-h(x))

с:

g(x) = (m1*x + n1) / (1-10^(a1*x - b1))
h(x) = (m2*x + n2) / (1-10^(-a2*x - b2))

Но поскольку эта функция имеет всего 10 переменных, она очень нестабильна. Прямо сейчас я очень обычно подгоняю его с помощью curve_fit:

def function(x, a1, a2, b1, b1, m1, m2, n1, n2, s, t):
    g = (m1*x + n1) / (1-10^(a1*x - b1))
    h = (m2*x + n2) / (1-10^(-a2*x - b2))
    f = s*g + t*(1-h)
return f 
...
popt, pcov = curve_fit(function, xdata, ydata, maxfev=100000)

Теперь мой актуальный вопрос: возможно ли установить эти функции отдельно? Например:

1: fit left slope. m1*x + n1
2: fit right slope. m2*x + n2
3: fit g(x) according to the pre-fitted slopes
4: fit h(x) according to the pre-fitted slopes
5: fit f(x) 

Набрав это, я просто подумал о какой-то рекурсии для этого, но я не знаю, как передать предварительно фиксированные параметры одного шага другому и сохранить фиксированное значение, так что кривая_fit должна каждый раз соответствовать только очень небольшому количеству переменных.

Буду очень признателен за любую помощь в решении этой проблемы. Может быть, кто-то даже знает совершенно другой подход к этому или что-то, что я мог бы сделать лучше.


person Tobrabo    schedule 07.12.2014    source источник
comment
Но теперь, когда вы, наконец, вернете свой f(x), разве он не даст вам окончательную подобранную кривую в соответствии с уравнениями g(x) и h(x) вместе?? вы также можете попробовать посмотреть этот ответ, если это то, что вы хотите.   -  person Srivatsan    schedule 07.12.2014
comment
Он возвращает правильную функцию, но подгонка немного нестабильна с его 8 или 10 параметрами... поэтому я, хотя я мог бы сказать Curve_fit как-то исправить несколько параметров и подгонять только, скажем, три за раз.   -  person Tobrabo    schedule 11.12.2014