示例#1
0
def _eigvals(arg):
    "Return the eigenvalues of the argument"
    try:
        return eigvals(arg)
    except TypeError:
        get_linalg_funcs()
        return eigvals(arg)
示例#2
0
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