2017-05-01 9 views
0

関数内のすべての根[f(x)= 0]を見つけようとしています。私の現在の解決策は、十分に離れていて、お互いに干渉していない場合にのみ機能します。 (例:x^2 - 2の場合)ダーツ - 関数内のすべての根を見つける

bool numberIsCloseToZero(num number){ 
    return (num.parse(number.abs().toStringAsFixed(1)) == 0.0) ? true : false; 
} 

List<num> calculateRoots(String function){ 

    num eval = 0.0; 
    List<num> roots = []; 

    for (num x = -10; x < 10; x += 0.1){ 
    eval = calculateYOfX(function, x); 
    if (numberIsCloseToZero(num.parse(eval.toStringAsFixed(2)))){ 
     roots.add(x); 
    } 
    } 
    return roots; 
} 

明らかに、これは私の丸めによるものです。 (例えば、x^2の根の周囲の値はゼロに近すぎるので、それらも根であると仮定します)。私は実際に根を "強制的に"強制する代わりに、方程式を実際に解くべきだと思いますか?

ありがとうございました

+1

これは良い質問ですが、実際はDartプログラミングに関するものではありません。 –

答えて

1

許容される機能にはいくつかの制限が必要です。そうでないと希望がありません。

たとえば、有限個の値(と考える)、または指定された間隔内の有限数の値(と考える)が存在することを保証するものではありません。または無限に接続されたゼロ(f(x) = max(0,x)

これらのケースは特に病理学的な数学的機能とは考えられていません。

関数がゼロ以外の値になるようにする必要がある場合は、滑らかで連続的で、有界な第1次と第2次の導関数を使用すると、相対的に与えられた有限領域内のすべてのゼロを保証する簡単なアルゴリズムです。

(I再帰的領域を分割し、各間隔に厳格な境界を決定するサブディビジョンに基づくアルゴリズムを探したい。)

我々は、誘導体が既知の定数すなわち|f'(x)| < Dによって制限される場合の例アルゴリズムを導出することができます。ある点でfを評価すると、pの場合、他の点についてはp+dと表示されます。f(p) - |d| D < f(p+d) < f(p) + |d| Dです。

[A,B] - [p-d, p+d]と書くことができます。これは、p=(A+B)/2d=(B-A)/2のように書くことができます。サンプルfは中間点でf(p)になります。最小値fは、間隔がf(p) - d Dで、最大値がf(p) + d Dです。 f(p)-d D <= 0 <= f(p) +d D|f(p)| < d Dに等しい場合、この区間にはルートのみを持つことができます。

[A,B]にルートが存在しない場合は、完了しました。それ以外の場合は、2つの半分[A,p][p,B]を繰り返します。 (f(p)=0の場合は注意が必要です)

+0

おかげで、私は二分法で基本的な機能のルーツを得ることができました。素晴らしい答えbtw。 – OhMad

3

分析ソリューションが見つかる場合は、それを使用してください。低次の多項式(例えば、x^2 - 2のように)が可能です。

一般的に、数値的な方法を学ぶ必要があります。この場合は、root findingです。

bisectionメソッドまたはNewthon'sメソッドで開始します。彼らはすべてのステップで根のより正確な位置を得ることができます。

+0

さて、ありがとう、ありがとう:) – OhMad

関連する問題