多项式的最大值

时间:2012-10-24 20:56:20

标签: matlab optimization max polynomial-math maximize

我有一个阶数为N的多项式(其中N是偶数)。对于x减/加无穷大,该多项式等于负无穷大(因此它具有最大值)。我现在正在做的是通过使用polyder获取多项式的导数,然后使用Matlab中的roots函数找到N-1阶多项式的根,返回N-1个解。然后我选择真正最大化多项式的真根。问题是我正在更新我的多项式,并且在每一步我使用上述过程来找到最大化器。因此,root函数需要花费太多的计算时间才能使我的应用程序变慢。有没有办法在Matlab或提出的算法中以计算有效的方式实现这种最大化(即只找到一个解决方案而不是N-1解决方案)?感谢。

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

2 个答案:

答案 0 :(得分:3)

我认为你可能运气不好。如果多项式的系数在每个时间步以任意方式改变,那么最终你在每个阶段都面临着一个独特且无关的优化问题。没有足够的信息可以考虑计算导数多项式的根的子集 - 你怎么知道哪个导数根提供多项式的最大静止点而不比较所有导数根的函数值?如果你的多项式系数在每一步都被一个(有界的)少量或以可预测的方式扰动,那么你可以想象你可以尝试迭代来改进每个系统的解决方案。 step(例如粗略的东西,例如使用你之前的根作为一组新的牛顿迭代的起点来识别更新的衍生根),但问题并不表明事实是这样的,所以我只是在猜测。我在这里可能完全错了,但除非你能提供更多关于在每一步产生的多项式之间存在某种关系的信息,否则你可能只是运气不快。

答案 1 :(得分:2)

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或更多的因素并不罕见)。