0

私は一般的にMatlab/プログラミングの初心者です。切り捨て誤差が確実に $< 0.5 \times 10 ^{ -5}$ を実行し、反復回数と根の推定値を出力します。

これが私のコンピューターを壊したように見える私の試みです...

%Approximating the root of f(x) = 2*x  - 3*sin(x) + 5 by binary search

%Define variables

low = input('Enter lower bound of range: ');

high = input('Enter upper bound of range: ');

mid = (low + high)/2;


%Define f_low & f_high

f_low = 2*low  - 3*sin(low) + 5;

f_high = 2*high  - 3*sin(high) + 5;

f_mid = 2*mid  - 3*sin(mid) + 5;


%Check that the entered range contains the key

while (f_low * f_high) > 0 || low > high

     disp('Invalid range')

     low = input('Enter lower bound of range: ');

     high = input('Enter upper bound of range: ');

end



%The new range

while abs(f_mid) > 0.5*10^(-5)



    if f_mid < 0

     low = mid;



    elseif f_mid > 0

      high = mid;

    end   



end



fprintf('mid = %.4f \n', mid)

私は反復回数のカウントビットを追加していません(これを行う方法がよくわかりません)、すでに行き詰まっています。

助けてくれてありがとう。

4

2 に答える 2

1

high=mid または low=mid を設定すると、mid と f_mid は再計算されますか? f_low>0かつf_high<0の場合、失敗するようです。これは有効な条件ですが、この場合、リセットする条件を間違って選択しています。また、終了チェックは、低と高の違いではなく、関数値に基づいています。これはあなたが望むものかもしれませんし、両方の方法をチェックしたいかもしれません。非常にフラットな関数の場合、関数値をそれほど小さくできない場合があります。

于 2011-08-06T14:48:27.710 に答える
0

は必要ありませんがf_mid、実際には誤解を招く可能性があります。各ステップで値を計算し、どちらの方向に進むかを確認するだけです。

さらに、低値と高値を変更しているだけですが、f_lowまたはを再度評価することはありませんf_high。Matlab は代数システムではありません (シンボリック計算用のモジュールがありますが、それは別の話です)。そのため、low と high の変更を定義f_lowして変更する必要はありません。最終ループでそれらを再評価する必要があります。f_high

于 2011-08-06T14:48:04.170 に答える