Для моего класса я программирую функцию квадратного корня, используя включение. Нет, я не могу использовать любой другой метод …
Это мой код, программа почти работает. Он работает для идеальных квадратных корней и некоторых других значений (например, 11 или 5), но для других он попадает в бесконечный цикл (8, 2).
Причина, по которой это происходит, заключается в том, что верхняя и нижняя границы (b и a) не меняются. В идеале границы должны быть текущим x и предыдущим x, создавая новый x. То, что происходит, — то, что новый x в настоящее время сформирован текущим x и или a или b, будучи постоянной.
Я пытался так долго, но я еще не нашел способ «запомнить» или найти «предыдущий x», так как каждый раз, когда цикл while повторяется, только текущий x доступен для использования. Кто-нибудь знает, как можно решить такую проблему?
void inclusion ()
{
double v ;
cout << "*** Now solving using Inclusion ***" << endl << "To calculate the square root, enter a positive number: " ;
cin >> v ;
while (v<0)
{
cout << "Square roots of negative numbers cannot be calculated, please enter a positive number: " ;
cin >> v ;
}
cout << endl ;
int n = 0;
while (v >= n*n)
n++ ;
double b = n ;
double a = n-1 ;
int t = 0 ;
double x = (a+b)/2 ;
while ((x * x - v >= 0.1) || (x * x - v <= -0.1))
{
t++ ;
if (x * x < v)
{
cout << "Lower Bound: " << x << '\t' << '\t' ;
cout << "Upper Bound: " << b << '\t' << '\t' ;
x = (b + x)/2 ;
cout << "Approximation " << t << ": " << x << endl ;
}
else
{
cout << "Lower Bound: " << a << '\t' << '\t' ;
cout << "Upper Bound: " << x << '\t' << '\t' ;
x = (a + x)/2 ;
cout << "Approximation " << t << ": " << x << endl ;
}
}
cout << endl << "The answer is " << x << ". Iterated " << t << " times." << endl << endl ;
}
Я еще не нашел способ «запомнить» или найти «предыдущий х»
Есть переменная previous_x
что ты previous_x = x
в конце цикла
Но это не твоя проблема. Вы меняете x
, но нет a
или же b
, так что вы попадаете в бесконечно повторяющийся паттерн. Вместо этого вы должны отрегулировать, какой бы предел не привел вас к этому.
void inclusion ()
{
double v ;
cout << "*** Now solving using Inclusion ***" << endl << "To calculate the square root, enter a positive number: " ;
cin >> v ;
while (v<0)
{
cout << "Square roots of negative numbers cannot be calculated, please enter a positive number: " ;
cin >> v ;
}
cout << endl ;
int n = 0;
while (v >= n*n)
n++ ;
double b = n ;
double a = n-1 ;
int t = 0 ;
double x;
for (x = (a+b)/2; abs(x * x - v) >= 0.1; x = (a+b)/2, ++t)
{
if (x * x < v)
{
cout << "Lower Bound: " << x << '\t' << '\t' ;
cout << "Upper Bound: " << b << '\t' << '\t' ;
a = (b + x)/2 ;
cout << "Approximation " << t << ": " << x << endl ;
}
else
{
cout << "Lower Bound: " << a << '\t' << '\t' ;
cout << "Upper Bound: " << x << '\t' << '\t' ;
b = (a + x)/2 ;
cout << "Approximation " << t << ": " << x << endl ;
}
}
cout << endl << "The answer is " << x << ". Iterated " << t << " times." << endl << endl ;
}
Вам нужно обновить границы тоже:
a = x;
x = (b + x)/2;
а также
b = x;
x = (a + x)/2;