Форум сайта python.su
мне нужно вычислить координаты и радиус окружности методом наименьших квадратов, для этого я написал функцию, которая принимает в качестве аргументов два списка с координатами дугиокружности Х и У, а возвращает координаты центра окружности и её радиус. всё работает правильно и хорошо, но слишком медленно, при попытке ускорения с помощью numba припост скорости получился существенный, но результаты оказываются не верные
@numba.njit() def MNK_circle(x,y): n = len(x) x_kv = np.square(x) y_kv = np.square(y) sum_x_kv = int(np.sum(x_kv)) sum_y_kv = int(np.sum(y_kv)) sum_x = int(np.sum(x)) sum_y = int(np.sum(y)) sum_x_kub = int(np.sum(np.power(x, 3))) sum_y_kub = int(np.sum(np.power(y, 3))) sum_xy = int(np.sum(x * y)) sum_x_y_kv = int(np.sum(x * y_kv)) sum_y_x_kv = int(np.sum(y * x_kv)) N11 = 2*(sum_x_kv-(sum_x*sum_x)/n) N12 = 2*(sum_xy-(sum_x*sum_y)/n) W1 = sum_x_kub+sum_x_y_kv-((sum_x_kv*sum_x)/n)-((sum_y_kv*sum_x)/n) N21 = 2*(sum_xy-((sum_x*sum_y)/n)) N22 = 2*(sum_y_kv-((sum_y*sum_y)/n)) W2 = sum_y_x_kv+sum_y_kub-((sum_x_kv*sum_y)/n)-((sum_y_kv * sum_y)/n) detN = N11*N22 - N12*N21 x0 = (W1*N22-W2*N12)/detN y0 = (W2*N11-W1*N21)/detN r = math.sqrt(x0*x0 + y0*y0 + (sum_x_kv + sum_y_kv - 2*(x0*sum_x+y0*sum_y))/n) return int(x0+0.5), int(y0+0.5), int(r+0.5)
Офлайн
Попробуйте использовать Scipy
Офлайн
ZerG
спасибо, я разобрался, проблема действительно оказалась в переполнении, при большом количестве точек значение сумм оказываются огромные и они выходят за пределы int32, изменил на int64 и ошибки ушли, не понятно почему эта проблема вылезла только сейчас
а вопрос по поводу списков в numba Вы мне поможите решить? или мне новую тему создавать?
Офлайн
А что с ними не так?
https://numba.pydata.org/numba-doc/dev/reference/pysupported.html#list
Офлайн
ZerGМНК подразумевает вычисление сумм, суммы квадратов и кубов, поэтому при больших значениях и их большом количестве запросто получаются числа больше 2147483647, в результате получаются отрицательные суммы и все расчёты катится коту под хвост, при использовании int64 у меня диапазон расширяется до 9223372036854775807, чего мне пока хватает
А что с ними не так?
Офлайн