6

次数 N (N は偶数) の多項式があります。この多項式は、x マイナス/プラス無限大のマイナス無限大に等しい (したがって、最大値を持つ)。私が今やっているのは、を使用して多項式の導関数を取得し、次を使用しpolyderて N-1 次多項式の根を見つけることです。rootsN-1 ソリューションを返す Matlab の関数。次に、多項式を実際に最大化する実根を選択しています。問題は、多項式を何度も更新していて、各時間ステップで上記の手順を使用してマキシマイザーを見つけていることです。したがって、roots 関数は計算時間がかかりすぎて、アプリケーションが遅くなります。Matlab または提案されたアルゴリズムのいずれかで、計算効率の高い方法でこの最大化を行う方法はありますか (つまり、N-1 ソリューションの代わりに 1 つのソリューションを見つけるだけです)? ありがとう。

roots編集:Matlab に、実数/複素数をすべて返すのではなく、実根のみを返すルーチンがあるかどうかも知りたい です。

4

2 に答える 2

3

あなたはおそらく運が悪いと思います。多項式の係数が時間ステップごとに任意の方法で変化する場合、最終的には、すべての段階で別個の無関係な最適化問題に直面することになります。微分多項式の根のサブセットだけを計算することを検討するには、利用できる情報が不十分です。すべての微分根の関数値を比較せずに、どの微分根が多項式の最大静止点を提供するかをどのように知ることができますか?? 多項式係数が各ステップで (制限された) 少量または予測可能な方法で摂動されている場合、それは考えられます各ステップでソリューションを改良するために反復的なものを試すことができるでしょう(たとえば、以前のルートをニュートン反復の新しいセットの開始点として使用して、更新された微分ルートを特定するなどの粗雑なもの)が、質問はそうではありませんこれが実際に当てはまることを示唆しているので、私は推測しています。ここで私は完全に間違っている可能性がありますが、各ステップで生成された多項式の間に何らかの関係があるという詳細情報を提供できない限り、何かを高速化するのは運が悪いだけかもしれません.

于 2012-10-24T21:21:35.413 に答える
2

スティーブモリスによるファイル交換の提出があり、与えられた間隔で関数のすべての本当のルーツを見つけます。これは、多項式をChebychev多項式で補間し、その根を見つけることによって行われます。

eigそこでのコンパニオン行列の評価をに変更できますeigs。これにより、1つ(またはいくつか)の根を見つけることができ、時間を節約できます(Chebychevの根または極値を分析的に計算することも可能ですが、そのための良い参照は見つかりませんでした(または悪い)そのことについては1つ...))。

あなたが物事をスピードアップするために行うことができるもう一つの試みは、それpolyderが何もしないことに注意することです

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

あなたの多項式のためにP。また、rootsコンパニオンマトリックスの固有値を見つけるだけなので、これらの固有値を自分で見つけることができます。これにより、への呼び出しが妨げられrootsます。ループ内の組み込みでない関数を呼び出すと、MatlabのJITコンパイラーがループを機械語に変換できないため、これは両方とも有益である可能性があります。そうしないと、速度が大幅に向上する可能性があります(100以上の係数は珍しいことではありません)。

于 2012-10-25T04:24:51.097 に答える