Я пытаюсь минимизировать сильно нелинейную функцию, оптимизируя три неизвестных параметра a, b и c0. Я пытаюсь воспроизвести некоторые основные уравнения шарика рулетки казино в Python 3.
Вот ссылка на исследовательскую работу: http://www.dewtronics.com/tutorials/roulette/documents/Roulette_Physik.pdf
Я буду ссылаться на уравнения (35) и (40) в статье. По сути, я измеряю секундомером круги шарика рулетки, вращающегося на колесе. Для каждого последующего круга время круга будет увеличиваться из-за потери импульса из-за неконсервативных сил трения. Затем я беру эти измерения времени и подгоняю уравнение (35) с помощью метода наименьших квадратов Левенберга-Марквардта в уравнении (40).
У меня двоякий вопрос: (1) я использую метод scipy.optimize.least_squares()='lm' и не знаю, как написать целевую функцию! Прямо сейчас у меня есть функция, написанная точно так же, как в документе:
def fall_time(k,a,b,c0):
F = (1 / (a * b)) * (c0 - np.arcsinh(c0) * np.exp(a * k * 2 * np.pi))
return F
def parameter_estimation_function(x0,tk):
a = x0[0]
b = x0[1]
c0 = x0[2]
S = 0
for i,t in enumerate(tk):
k = i + 1
S += (t - fall_time(k,a,b,c0))**2
return [S,1,1]
sol = least_squares(parameter_estimation_function,[0.1,0.8,-0.1],args=([tk1]),method='lm',jac='2-point',max_nfev=2000)
print(sol)
Так вот, в примерах документации я ни разу не видел, чтобы целевая функция была написана так, как она у меня есть. В документации целевая функция всегда возвращает остаток, а не квадрат остатка. Кроме того, в документации никогда не используется сумма! Поэтому мне интересно, автоматически ли сумма и квадрат обрабатываются под капотом least_squares()
?
(2) Возможно, мой второй вопрос является результатом того, что я не понимаю, как записать целевую функцию. Но в любом случае, у меня возникли проблемы с тем, чтобы алгоритм сходился к минимуму. Я знаю, что это потому, что алгоритм Левенберга «жадный» и останавливается около ближайших минимумов, но я полагал, что смогу, по крайней мере, сойтись примерно с одним и тем же результатом при разных начальных предположениях. С небольшими изменениями в первоначальном предположении я получаю результаты параметров с разными знаками. Кроме того, мне еще предстоит найти комбинацию начальных предположений, которая позволила бы алгоритму сойтись! Он всегда истекает, прежде чем находит решение. Я даже увеличил количество вычислений функций до 10 000, чтобы посмотреть, так ли это. Но безрезультатно!
Возможно, кто-то может пролить свет на мои ошибки здесь! Я все еще относительно новичок в python и библиотеке scipy!
Вот несколько примеров данных для tk
, которые я измерил самостоятельно по видео здесь: https://www.youtube.com/watch?v=0Zj_9ypBnzg
tk = [0.52,1.28,2.04,3.17,4.53,6.22]
tk1 = [0.51,1.4,2.09,3,4.42,6.17]
tk2 = [0.63,1.35,2.19,3.02,4.57,6.29]
tk3 = [0.63,1.39,2.23,3.28,4.70,6.32]
tk4 = [0.57,1.4,2.1,3.06,4.53,6.17]
Спасибо