(отредактировано для учета добавленного кода ОП и подвопроса.)
Общая идея состоит в том, чтобы использовать минимизацию наименьших квадратов, чтобы найти "лучшие" значения a
, b
и c
. Сначала определите функцию, параметры которой a, b, c
, которая возвращает сумму квадратов разностей между заданными значениями y
и вычисленными значениями a * (x-b)**c
. (Эта функция может быть выполнена в виде одной строки.) Затем используйте процедуру оптимизации, например, найденную в scipy, чтобы минимизировать значение этого значения функции. Эти значения a, b, c
- то, что вы хотите - используйте их, чтобы определить желаемую функцию.
Необходимо рассмотреть несколько деталей, например, ограничения на допустимые значения a, b, c
, но они в некоторой степени зависят от ваших списков значений x
и y
.
Теперь, когда вы показали график ваших значений x
и y
, я вижу, что все ваши значения положительные и функция в целом увеличивается. Для этой общей ситуации я бы использовал начальные значения
a = 1.0
b = 0.0
c = 1.0
Это дает прямую линию через начало координат, фактически линию y = x
, которая часто является приличным первым предположением. В вашем случае значения x
и y
имеют очень разную шкалу: y
примерно в сто раз больше, чем x
, поэтому вы, вероятно, получите лучшие результаты, изменив значение a
:
a = 100.0
b = 0.0
c = 1.0
Я вижу еще лучшие значения и некоторые ограничения на конечные значения, но я бы предпочел, чтобы этот ответ был более общим и полезным для других подобных проблем.
Ваша функция problem()
выглядит правильно для меня, хотя я бы написал немного по-другому для большей ясности. Обязательно протестируйте его.