二分法を使用して多項式の根を見つけている場合、場合によっては、多項式によっては、根が負または正になることがあります。
多項式の評価結果に基づいて、根が負になるか正になるかを判断できることは理解していますが、x として何を使用するかはわかりません。
誰かがここで洞察を与えることができますか?
根が負にも正にもなり得るという事実は、二分法とは何の関係もありません。根の存在は、微積分の中間値定理を使用して証明できます。
したがって、あなたがしなければならないのは、マイナスでありプラスであるポイントなどを見つけることだけx1
ですx2
. 次に、IVT から と の間にルートがあることがわかります。その間隔で二分探索を行うことでそれを行います。が負の場合、区間 で二分探索を繰り返します。それ以外の場合は、 interval で検索します。y(x1)
y(x2)
x1
x2
y(x3) = y((x1+x2)/2)
[x3,x2]
[x1,x3]
ルートが負であるか正であるかは問題ではありません。それがあなたの質問に答えているかどうかはわかりませんが、アルゴリズムを理解するのに役立つことを願っています.
あなたはおそらくこれが役に立つと思うでしょう。
システムを使用する;
名前空間Bisection_Method
{{
class Program
{
public double midPoint (double xl, double xu)
{
return (xl + xu) / 2;
}
public double function(double x)
{
return (x*x-2);
}
static void Main(string[] args)
{
Program root = new Program();
double xm=0, xl=1, xu=2, check=0;
for (int x = 0; x < 20; x++)
{
xm = (xl + xu) / 2;
check = root.function(xl) * root.function(xm);
if (check < 0)
xu = xm;
else if (check > 0)
xl = xm;
else if (check == 0)
{
break;
}
}
Console.WriteLine("The Approximate of the Root is {0}", xm);
}
}
}
http://mustafa.amnbytes.com/2012/09/bisection-method-program-in-c.html
二分アルゴリズムを使用するには、最初にルートを含む区間を見つける必要があります。このための標準的なアルゴリズムは、スツルムの定理に示されています。
ただし、標準の二分アルゴリズムでは、エンドポイントの関数値の符号が異なることが想定されています。これは問題になる可能性があります。最も単純な例は、2次の単一のルート0を持つx ^2です。x^2はゼロ以外のすべてのxに対して正であるため、二分アルゴリズムでの使用に適したルートを囲む区間を見つけることができません。
多くのルートファインダーでは、ユーザーが検索を開始するための開始点を指定できます。これにより、ユーザーは結果を「いじる」ことでさまざまなルートを見つけたり、ファインダーをルートに収束させたりすることができます。
ユーザーが開始値を提供できるようにすることが意味をなさない場合は、いくつかのポイントを調査することから始めることができます。
入力が奇数多項式の場合、これは最終的に二分法に適した範囲を検出します。入力が偶数の多項式の場合、符号の変化をキャッチできない可能性があります(f(x)= x ^ 2-を考慮してください。負になることはありません)。したがって、一定の(構成可能な?)量のプロービングの後で諦める準備をしてください。
ここでは、範囲を10の累乗で大きくすることを提案しました。二等分アプローチは毎回範囲を半分に減らすので、おそらくこれはあまりにも保守的です。(範囲を次の「よりタイトな」ブラケットに減らすには、二分法を2〜3回繰り返す必要があります。)おそらく、ジャンプを大きくする方がよいでしょう。
これにより、実行するプローブは少なくなりますが、より多くの二等分が必要になります。いくつかの多項式を試して、両方の提案で根を見つけるための実行時間を追跡します。