そこ関数:\(F(X)= X ^ + 6.375 3 \ X ^ 2 + 3倍\ Xタイムズ- 26である\。)
既知の\(F(1.0)\ LT 0、F(2.0)\ GT 0 \) と式\(F(X)= 0 \) 間隔で\([1.0、2.0] \)だけつのルートを有し、ルートが二分法を使用してください取得します。
入力形式
なし。
出力フォーマット
セクションにおける方程式の出力\([1.0、2.0] \)の根。必要小数点に丸めた後\(3 \)ビット。
サンプル入力
なし。
サンプル出力
利用できません。
トピック分析
2点:この質問は、アルゴリズムに関するものです。
我々は以前、整数の半分を使用し、問題のヘッドは、実数間の二分法を使用して、そしてその半分の整数処理は、詳細が若干異なりますが、オリジナルの目的、私たちはこの道を知っている必要があります二分法思考の件名、次いでこの溶液をこの質問は非常に簡単になります。
タイトルは私達に教えた\(F(1.0)\ LT 0、F(2,0)\ GT 0 \)のように区間において、および私達の画像が連続関数である\(\ [1.0、2.0])を一定の間実現可能な解が存在する\(X_0の\)を満たす\(F(X_0)= 0 \)、その後、私たちすることができます半分。
我々は、コマンド開始\(1.0 L = \) 、そう\(R&LT = 2.0 \) (なお、\(Lの\)と\(R&LTの\)は実数です)。
我々は、その後に再循環\(R - Lの\のLT 10 ^ { - 5} \) ここで、我々は、サイクルの終了時のようにすることができ、\(Lの\)と\(R&LT \)小数点以下3桁の結果を保持している同じA。
その後、我々は、各テイク\(MID =(L + R&LT)/ 2 \)を 2例があります:
- 。状況1:\(F(MID)\ GT 0 \) 、この場合記載区間の答\([MID、R] \ ) ためには、我々は\(L = MID \) 。
- ケース2:\(F(MID)\ル0 \) 、実際には、\(F(ミッド)= 0 \) 私たちは直接ループを終了することができますが、同一の処理とケース1を実行するために、我々は聞かせたときに(\をMID = R&LT \) 。
このループ処理は、我々は、サイクルの終了時にそれを保証することができる\(Lの\)と\(R&LT \)の前に\(4 \)を超えないことにより、小数\(10 ^ {--5} \) 、その後、時間を選択しないように\を( Lの\)または\(R \)と二つの重要な結果の配列は、私たちの答えです。
次のようにコードは次のとおりです。
#include <bits/stdc++.h>
using namespace std;
double f(double x) {
return x*x*x + 6.375*x*x + 3.0*x - 26.0;
}
int main() {
double L = 1.0, R = 2.0;
while (R - L >= 1e-5) { // 1e-4是科学计数法,表示1乘10的-4次方
double mid = (L + R) / 2.0;
if (f(mid) > 0.0) R = mid;
else L = mid;
}
printf("%.3lf\n", R); // 因为R-L<=1e-4,所以这个时候输出L和R都一样
return 0;
}