6

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

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

4

2 回答 2

3

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

于 2012-10-24T21:21:35.413 回答
2

Steve Morris有一个文件交换提交,它在给定的时间间隔内找到函数的所有真实根。它是通过用 Chebychev 多项式对多项式进行插值并找到它的根来实现的。

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

polyder您可以在加快速度方面进行的另一种尝试是注意

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

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

于 2012-10-25T04:24:51.097 回答