评估多项式系数

时间:2013-06-04 20:49:50

标签: python python-3.x iteration

我正在尝试编写一个函数,该函数将多项式p(x)的系数列表(a0,a1,a2,a3 ...... a n)和值x作为输入。该函数将返回p(x),这是在x处计算的多项式的值。

n次多项式,系数a0,a1,a2,a3 ........ an是函数

p(x)= a0+a1*x+a2*x^2+a3*x^3+.....+an*x^n

所以我不确定如何解决这个问题。我想我需要一个范围,但我怎么能这样做它可以处理x的任何数字输入?我不希望你们给出答案,我只是需要一点启动。我是否需要for循环,while循环或递归是一个选项吗?

def poly(lst, x)

我需要迭代列表中的项目,我是否使用索引,但是如何让它迭代未知数量的项目?

我想我可以在这里使用递归:

    def poly(lst, x):
        n = len(lst)
        If n==4:
           return lst[o]+lst[1]*x+lst[2]*x**2+lst[3]*x**3
        elif n==3:
           return lst[o]+lst[1]*x+lst[2]*x**2
        elif n==2:
           return lst[o]+lst[1]*x
        elif n==1:
           return lst[o]
        else:
            return lst[o]+lst[1]*x+lst[2]*x**2+lst[3]*x**3+lst[n]*x**n

这适用于n< = 4但是我得到一个索引错误:列表索引超出n> 4的范围,但是看不清楚原因。

5 个答案:

答案 0 :(得分:3)

最有效的方法是使用Horner规则向后评估多项式。在Python中很容易做到:

# Evaluate a polynomial in reverse order using Horner's Rule,
# for example: a3*x^3+a2*x^2+a1*x+a0 = ((a3*x+a2)x+a1)x+a0
def poly(lst, x):
    total = 0
    for a in reversed(lst):
        total = total*x+a
    return total

答案 1 :(得分:2)

def evalPoly(lst, x):
    total = 0
    for power, coeff in enumerate(lst): # starts at 0 by default
        total += (x**power) * coeff
    return total

或者,您可以使用列表然后使用sum

def evalPoly(lst, x):
        total = []
        for power, coeff in enumerate(lst):
            total.append((x**power) * coeff)
        return sum(total)

没有枚举:

def evalPoly(lst, x):
    total, power = 0, 0
    for coeff in lst:
        total += (x**power) * coeff
        power += 1
    return total

替代非枚举方法:

def evalPoly(lst, x):
    total = 0
    for power in range(len(lst)):
        total += (x**power) * lst[power] # lst[power] is the coefficient
    return total

同样@DSM说,你可以将它们组合在一起:

def evalPoly(lst, x):
    return sum((x**power) * coeff for power, coeff in enumerate(lst))

或者,使用lambda

evalPoly = lambda lst, x: sum((x**power) * coeff for power, coeff in enumerate(lst))

递归解决方案:

def evalPoly(lst, x, power = 0):
    if power == len(lst): return (x**power) * lst[power]
    return ((x**power) * lst[power]) + evalPoly(lst, x, power + 1)

enumerate(iterable, start)是一个生成器表达式(因此它使用yield而不是return生成一个数字,然后生成一个迭代的元素。该数字等于元素的索引+开始。

From the Python docs, it is also the same as

def enumerate(sequence, start=0):
    n = start
    for elem in sequence:
        yield n, elem
        n += 1

答案 2 :(得分:2)

简单:

def poly(lst, x): 
  n, tmp = 0, 0
  for a in lst:
    tmp = tmp + (a * (x**n))
    n += 1

  return tmp

print poly([1,2,3], 2)

简单递归:

def poly(lst, x, i = 0):
  try:
    tmp = lst.pop(0)
  except IndexError:
    return 0
  return tmp * (x ** (i)) + poly(lst, x, i+1)

print poly([1,2,3], 2)

答案 3 :(得分:1)

无论是递归还是没有,解决方案的本质是在“n”上创建一个循环,因为多项式从x ^ 0开始并上升到a_n.x ^ n,这也是你应该考虑的变量作为输入。除此之外,使用一个称为乘法和累积的技巧,以便能够计算每次循环迭代的部分结果。

答案 4 :(得分:0)

def evalPoly(lst, x, power):
    if power == 0:
        return lst[power]
    return ((x**power) * lst[power]) + evalPoly(lst, x, power - 1)

lst = [7, 1, 2, 3]
x = 5
print(evalPoly(lst, x, 3))

要计算的公式是-3x ^ 3 + 2x ^ 2 + x + 7 当x = 5时,结果是-437