2016-06-20 10 views
1

さまざまな方法で非合理的根を持つ関数の根を数値的に見つけるプログラムを書いています。この、非連続関数(漸近線とのすなわち機能)のために、しかし関数の漸近ではない根の検索

bool fxn1 = false; 
bool fxn2 = false; 
vector<float> root_list; 

if(f_x(-100) < 0) 
{ 
    fxn2 = true; 
} 
for(float i = -99.99; i < 100.01; i += 0.01) 
{ 

    fxn1 = fxn2; 
    if(f_x(i) < 0) 
    { 
     fxn2 = true; 
    } 
    else 
    { 
     fxn2 = false; 
    } 
    if((fxn1 == false && fxn2 == true) || (fxn1 == true && fxn2 == false)) 
    { 
     root_list.push_back(i-0.01); 
     root_list.push_back(i); 
    } 
} 

: は、線形補間などの方法については、私はこのコードを書いたこのため、内ルート嘘おおよその範囲を見つける必要がありますファンクションが漸近線のいずれかの側で正の値から負の値にスワップすると、コードもトリガされます。 プログラムにルートと漸近線の違いを伝える方法はありますか?予め

+1

これはプログラミング上の問題ではなく、数学の問題です。しかし、漸近線には無限に逃げる性質があるので、 'f_x(i)<0'ならば' f_x(i + 0.005) f_x(i) 'である。 – CompuChip

+0

また、 'fxn2 = f_x(i)<0;で' if'文を両方とも置き換えることができます。 if(fxn1!= fxn2){...} '、9行を2行に置き換えます。 – CompuChip

+0

符号の代わりに絶対値を見て、それが十分小さいかどうかを確認してください。 –

答えて

0

おかげ機能場合、f(x)は、ハーフウェイポイント(a + b)/2a又はbよりゼロに近くなければならない次いで[a,b]内部の点に収束されます。

この観察は、以下の手順につながる:この擬似コードで

Let mid = (a + b)/2 
If |f(mid)| < |f(a)| AND |f(mid)| < |f(b)| Then 
    Algorithm has converged to a root 
Else 
    Algorithm has converged to an asymptote 
End 

|.|浮動小数点絶対値を表します。

+1

'1/x'と対称区間の場合、' f(mid) 'が存在しないことに注意してください。 「ゼロ除算」エラーを処理する準備をします。 – CompuChip

+0

あなたは良い点を作っていますが、ルートファインダーがブラックボックスとして機能することは珍しいことではありません。関数がある時点で定義されておらず、適切に処理されている場合は、例外をスローすることをお勧めします。 –

+1

*関数f(x)が[a、b]の内側の点に収束している場合、中間点(a + b)/ 2はaまたはb *よりゼロに近くなるはずです。それは間違っている。 * nice *関数の場合にのみ当てはまりますが、x#0とf(0)= 0のf(x)= x sin(1/x)のような単純な関数を使って反例を簡単に見つけることができます。 0は継続していますが、あなたの財産は間違っています。 –

0

機能がniceのプロパティを持ち、少なくとも連続している場合、数値的にルートが見つかるだけです。

F:あなたはこの1についてはどう思うだろう - x>のF(X)で定義される:

  • 2 * I < X < 2 * I + 1(Z iの要素):F( X)= X
  • 2 - I + 1 < X < 2 * I(Z iの要素):F(X)= -x
  • X = I(Z iの要素):F(X)= 1

これは、Rで完全に定義され、任意の有界1より大きい任意の間隔で正と負の値を持ち、任意の非整数点で連続しますが、ルートはありません。

単にルートセグメント上に存在しなければならないという規則] Xので関数が間隔で連続的である場合、Y [X 場合、YまたはY Xのみ適用されています。

数値演算で関数の連続性をテストしたい場合は...