【问题标题】:maximum of a polynomial多项式的最大值
【发布时间】:2012-10-14 23:43:13
【问题描述】:

我有一个 N 阶多项式(其中 N 是偶数)。对于 x 负/正无穷大,这个多项式等于负无穷大(因此它有一个最大值)。我现在正在做的是使用polyder 对多项式求导,然后使用Matlab 中的roots 函数找到N-1 次多项式的根,该函数返回N-1 个解。然后我选择真正最大化多项式的真正根。问题是我经常更新多项式,并且在每个时间步我都使用上述过程来找到最大化器。因此,roots 函数需要太多的计算时间,使我的应用程序变慢。 Matlab 或提议的算法中是否有一种方法可以以计算有效的方式进行这种最大化(即只找到一个解决方案而不是 N-1 个解决方案)?谢谢。

编辑:我也想知道Matlab中是否有一个例程只返回真正的根而不是 roots 返回所有实数/复数。

【问题讨论】:

  • 你的意思是说你的多项式系数每个时间步都会改变?
  • 是的,系数在每个时间步都发生变化,系数也是真实的。
  • 我怀疑你能做到比这更有效。你的多项式系数如何变化? N的数量级是多少?您可以发布一些代码以及需要优化它的原因吗? (即为什么你认为值得优化代码的这个特定部分)。
  • @pedrosorio,N 是设计参数。这是我的应用程序中泰勒近似的顺序。根据分析器roots 需要超过 80% 的计算时间。我在统计推理应用程序的上下文中使用它。
  • 除非多项式之间存在某种关系,否则能够更快地做到这一点意味着知道任何 N 次多项式的最大值可以让您更快地找到任何其他(不相关的)N 次多项式的最大值。

标签: matlab optimization max polynomial-math maximize


【解决方案1】:

Steve Morris 有一个file exchange submission,它可以找到给定区间内所有函数的实根。它是通过用 Chebychev 多项式对多项式进行插值并找到它的根来实现的。

您可以将其中伴随矩阵的eig 评估修改为eigs。这使您可以只找到一个(或几个)根并节省时间(很有可能也可以分析地计算 Chebychev 的根或极值,尽管我找不到好的参考为此(或者甚至是一个糟糕的问题......))。

另一个加快速度的尝试是注意polyder 所做的不过是

Pprime = (numel(P)-1:-1:1) .* P(1:end-1);

为您的多项式P。此外,roots 只是查找伴随矩阵的特征值,因此您可以自己找到这些特征值,从而阻止调用 roots。这可能都是有益的,因为在循环中调用非内置函数会阻止 Matlab 的 JIT 编译器将循环转换为机器语言。否则,这可能会给您带来很大的速度增益(100 或更多的因素并不少见)。

【讨论】:

    【解决方案2】:

    我认为你可能不走运。如果多项式的系数在每个时间步以任意方式变化,那么最终您将在每个阶段都面临一个独特且不相关的优化问题。没有足够的信息来考虑仅计算导数多项式的根的子集 - 如果不比较所有导数根处的函数值,您如何知道哪个导数根提供了多项式的最大驻点?如果您的多项式系数在每一步仅受到(有界)少量或以可预测的方式受到干扰,那么可以想象您将能够尝试迭代来优化每个步骤的解决方案步骤(例如一些粗​​略的东西,例如使用您以前的根作为一组新的牛顿迭代的起点来识别更新的导数根),但问题并不表明实际上是这种情况,所以我只是猜测。我在这里可能完全错了,但是除非您可以提供更多信息,说明在每一步生成的多项式之间存在某种关系,否则您可能无法获得更快的速度。

    【讨论】:

    • 最大化器在每个时间步可能不会移动太多,尤其是当算法继续运行时(我试图最大化的分布达到平衡),所以我可以使用较旧的根作为初始猜测你已经说过了。但是一开始多项式是任意变化的,所以你的方法在一个点之后才有意义。但是,仍然存在 N 解决方案而不是 1 的问题。roots 甚至返回虚根,而我正在寻找实线上的最大化器。谢谢你的回答。
    • 有没有比 matlab 中的 roots 更快的例程,它只返回实根而不是所有实/复根。谢谢。
    • @YBE 恐怕我不知道
    • @YBE - 不。没有更快的例程只返回真正的根。想要魔法发挥作用是不够的,即使你非常想要它。
    猜你喜欢
    • 2016-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多