Я работаю над своим заданием, где я должен тренировать метод деления пополам на 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