【问题标题】:Evaluating Polynomial coefficients评估多项式系数
【发布时间】:2013-05-31 09:41:16
【问题描述】:

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

系数为a0、a1、a2、a3的n次多项式........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

这适用于 n4 的范围,但不知道为什么。

【问题讨论】:

  • 提示:查看sumenumerate 做了什么。 (PS:不要忘记,在 Python 中,我们使用** 而不是^ 进行求幂,即x*x = x**2。)
  • 我知道 sum 是做什么的,但让我失望的是如何编写代码以便合并 n 值
  • @Snarre 看看我的回答,我想这就是你想要的。
  • enumerate 随时为您服务。看看它的作用。它应该可以帮助您为每个系数创建 n。
  • @Answerers:由于 OP 要求 任何数字输入,具体取决于 x 和系数,因此在求和时可能需要使用调整后的顺序以避免损失太多精度。

标签: python python-3.x iteration


【解决方案1】:

最有效的方法是使用霍纳法则反向评估多项式。在 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

【讨论】:

    【解决方案2】:

    简单:

    定义聚(lst,x): n, tmp = 0, 0 对于一个 in lst: tmp = tmp + (a * (x**n)) n += 1 返回 tmp 打印 poly([1,2,3], 2)

    简单递归:

    def poly(lst, x, i = 0): 尝试: tmp = lst.pop(0) 除了索引错误: 返回 0 返回 tmp * (x ** (i)) + poly(lst, x, i+1) 打印 poly([1,2,3], 2)

    【讨论】:

    • 使用枚举比保留索引 i 容易得多。
    • @Imagine 是的,看起来像。不知道。
    • @Snarre lst.pop(0) 是你的“a0”,列表中的第一个元素
    • @Snarre 是的,不需要它,x**0 是 1
    • @Snarre 你在这里不需要递归。这不是一个。
    【解决方案3】:
    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
    

    【讨论】:

    • 是的,它可以工作,但我们还没有在课堂上介绍枚举,所以我不确定它为什么或如何工作。
    • (1) 我不认为你想从 1 开始。OP 的第一个任期是 a0*x**0。 (2) 我们可以把整个东西压缩成sum(coeff*x**i for i, coeff in enumerate(lst))
    • @DSM 我想把它作为一个单线,但认为这可能会令人困惑。但无论如何我都会添加它:)。
    • 好吧,因为我们还没有在课堂上使用 enumerate 或 lambda,但我认为我需要坚持使用索引。但令我困惑的是,你的代码中的函数 p(x)= a0+a1*x+a2*x^2+a3*x^3+.....+an*x^n 在哪里?跨度>
    • @Snarre 这来自for 循环。 for power, coeff in enumerate(lst) 将从 0、a0 开始。然后,下一个将是 1,a1。 a0和a1是lst提供的系数,0和1是enumerate函数提供的幂。
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:
      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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多