【问题标题】:Fastest way to solve long polynomial with lots of different powers求解具有许多不同幂的长多项式的最快方法
【发布时间】:2011-12-06 20:58:26
【问题描述】:

我正在寻找这个多项式方程的最快解 x:

设 m 为集合 M 中的一个元素。

对所有 m 求和 {a_m * x^(b_m) - c_m * x^(b_m - 1)} = 0,其中每个 m 的 a_m、b_m、c_m 都是不同的。集合 M 有 ~15-20 个元素。

如果解 > 4,则返回 4。如果解

我更喜欢 python 和其他语言的解决方案,前提是它对切换非常有益。

注意这是目标函数的导数。我只是想最大化目标函数,所以如果除了解决这个多项式之外还有更好的方法来做到这一点,那也可以!解决方案应该相当快,因为​​我正在尝试解决其中许多目标函数。

【问题讨论】:

  • 我们可以假设M的元素都是正数吗?
  • Scipy 的优化包 (docs.scipy.org/doc/scipy/reference/optimize.html) 可能让您直接解决最大化问题,尽管我认为优化问题通常是寻找最小值。同一个包也有根查找例程 (docs.scipy.org/doc/scipy/reference/optimize.html#root-finding)。
  • 集合 M 中的元素不是数字,它们只是为常量 a、b、c 下标,因为每个不同的 m 都不同。 a_m 可以是负数或正数。 b_m 和 c_m 都是负数。根源将是价格,所以复杂的根源并不能真正帮助我。事实上,我不能收取 > 4 的价格,所以我猜如果一个根 > 4,我将使用 4 作为最优解。
  • 你知道函数在区间 (0,4) 中只有一个根吗?此外,如果(正如您所评论的)指数 b_m 为负数,那么您想要找到“the”解决方案的函数不是多项式。但是,如果指数是整数,则可以通过将函数乘以 x 的足够大的幂来转换为 x > 0 上的多项式求根问题。
  • 如果这里的答案不令人满意,您可以尝试在新的scicomp 网站上发布此内容。

标签: python performance math optimization package


【解决方案1】:

如果您只寻找一个根而不是所有根,您可以使用Newton's Method,我预计对于您描述的多项式来说它相当快。

让 f(x) = 对所有 m 求和 {a*x^(b) - c*x^(b-1)}

那么 f(x) 的导数 f'(x) 是所有 m {(a*b)*x^(b-1) - (c*(b-1))*x^(b-2)} 的总和。

def newton(f, fprime, firstguess, epsilon):
    x = firstguess
    while abs(f(x)) > epsilon:
        x = x - (f(x) / fprime(x))
    return x

这将为您的多项式返回一个近似根。如果不够准确,请传入一个较小的 epsilon,直到它足够准确为止。

请注意,此函数可能会发散,并永远运行,或者抛出 ZeroDivisionError。小心处理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-10
    • 2013-09-03
    • 2021-02-23
    • 1970-01-01
    • 2019-10-03
    • 1970-01-01
    • 2012-08-31
    相关资源
    最近更新 更多