Что пошло не так с моим алгоритмом метода Бисекции - PullRequest
0 голосов
/ 05 октября 2018

Я работаю над своим заданием, где я должен тренировать метод деления пополам на Python.На мой взгляд, алгоритм выглядит правильно, но когда я запускаю код, я получаю

TypeError: неподдерживаемые типы операндов для *: 'NoneType' и 'NoneType'

.Что не так и как я могу это исправить?

Q: Представлять полином p (x) = a 0 + a 1 x + a 2 x 2 + ⋯ + a n x n в виде списка коэффициентов [a 0 , a 1 , ..., а п ].Напишите функцию с именем poly_critical, которая принимает 4 входных параметра p, a, b и N, где p - это список чисел Python, представляющих полином p (x), a и b - числа, определяющие интервал [a, b], а N - это aцелое положительное число.

Функция poly_critical реализует N итераций метода деления пополам, примененного к уравнению p ′ (x) = 0, и возвращает приближение критической точки c, где p ′ (c) = 0 для c∈[a, b].

Например, если p = [1, -1,1,0,0,1] (что представляет собой p (x) = 1-x + x 2 + x 5 ), a = 0, b = 1 и N = 10, тогда функция возвращает значение 0,4212656546685004, что приблизительно равно 5x 4 + 2x − 1 = 0.

Функция poly_critical может завершаться четырьмя способами:

Если len(p) < 2 (p является линейным), функция должна вывести «Нет критических точек».и вернуть нет.Если любая начальная конечная точка является критической точкой, верните конечную точку.Если значения на обеих конечных точках и средней точке имеют одинаковый знак на любой итерации, функция должна вывести «Метод деления пополам».и вернуть нет.Функция успешно реализует N итераций метода деления пополам и возвращает среднюю точку N-го подинтервала.

Мой алгоритм:

def poly_critical(p,a,b,N):

    dp = [n*p[n] for n in range(1,len(p))]

    if len(p) < 2:
        print("No critical points")
        return None

    an = a
    bn = b

    def dP(x):

        seq = [dp[i]*x**i for i in range(1,len(dp))]
        sum_seq = sum(seq)
        return sum_seq

    if dP(an)*dP(bn) >= 0:
        print("Bisection method fails.")
        return None

    if dP(an)*dP(bn) < 0:
        mn = (an+bn)/2

        for n in range(1,N+1):
            mn = (an+bn)/2

            if dP(mn)*dP(an) < 0:
                an = an
                bn = mn

            elif dP(mn)*dP(bn) < 0:
                an = mn
                bn = bn

            elif dP(mn) == 0:
                return mn

            else:
                print("Bisection method fails.")
                return None

        return (an + bn)/2
...