def _eigvals(arg): "Return the eigenvalues of the argument" try: return eigvals(arg) except TypeError: get_linalg_funcs() return eigvals(arg)
def roots(p): """ Возвращает корни многочлена с коэффициентами Значения в массиве `p` ранга 1 являются коэффициентами многочлена. Если длина `p` равна n + 1, то многочлен описывается следующим образом: p[0] * x**n + p[1] * x**(n-1) + ... + p[n-1]*x + p[n] :param ---------- p : array Массив коэффициентов ранга 1. :return: ------- out : ndarray Массив, содержащий корни многочлена. ------ ValueError Когда `p` не может быть преобразован в массив ранга 1. дополнение -------- poly : Найдите коэффициенты многочлена с заданной последовательностью корней. polyval : Вычислите значения полиномов. polyfit : Подбор полинома по методу наименьших квадратов. poly1d : Класс одномерных полиномов. """ # Если входные данные скалярны, это делает их массивом p = np.atleast_1d(p) # >>> np.atleast_1d(1, [3, 4]) # [array([1]), array([3, 4])] if p.ndim != 1: raise ValueError("Входные данные должны быть массивом с рангом 1..") # найти ненулевые значения массива non_zero = NX.nonzero(NX.ravel(p))[0] # Вернуть пустой массив, если в полиноме все нули if len(non_zero) == 0: return NX.array([]) # найти количество конечных нулей - это количество корней в 0. trailing_zeros = len(p) - non_zero[-1] - 1 # убрать начальные и конечные нули p = p[int(non_zero[0]):int(non_zero[-1]) + 1] # перевод в массив с переменными типа 'float' if not issubclass(p.dtype.type, (NX.floating, NX.complexfloating)): p = p.astype(float) N = len(p) if N > 1: # построить сопутствующую матрицу и найти ее собственные значения (корни) A = np.diag(NX.ones((N - 2,), p.dtype), -1) A[0, :] = -p[1:] / p[0] roots = eigvals(A) else: roots = NX.array([]) # добавляем нули roots = np.hstack((roots, NX.zeros(trailing_zeros, roots.dtype))) return roots