Member 12597839 Ответов: 2

Объясните логику и смысл этого кода Python.


x = 25
epsilon = 0.01
step = epsilon**2
numGuesses = 0
ans = 0.0

while (abs(ans**2 - x)) >= epsilon and ans <= x:
    ans += step
    numGuesses += 1

print('numGuesses = ' + str(numGuesses))

if abs(ans**2-x) >= epsilon:
    print('Failed on square root of ' + str(x))

else:
    print(str(ans) + ' is close to the square root of ' + str(x))


Что я уже пробовал:

Как эта программа определяет квадратный корень?
Анс: я все понял. Он уменьшает x на небольшое значение, то есть на 0,0001, то есть шаг до тех пор, пока x не станет меньше Эпсилона. ans увеличивается на ANS += step. Поэтому, когда он достигает значения, большего или равного x, цикл завершается.

Я не уверен в этом, и я написал, скажите мне, это правильно или неправильно

Richard MacCutchan

Это вопрос математики, а не питона.

Sergey Alexandrovich Kryukov

Это, по сути, не вопрос Python, но это вопрос о числовом алгоритме, который, я думаю, является одной из тем этого форума. См. Решение 1.
—СА

2 Ответов

Рейтинг:
2

Sergey Alexandrovich Kryukov

- Что случилось? Вся идея. Вы используете epsilon = 0.01 и пишете об использовании 0.0001. Хорошо, тогда попробуйте найти квадратный корень не из 25, а из 0,000025 и посмотрите, что получится. Конечно, вы можете уменьшить Эпсилон, чтобы сделать его входным значением малой доли, но вы все равно не сможете получить приемлемую точность. Для этого есть две причины: 1) Вы только увеличиваете свой " ответ" ans, никогда не уменьшаются, 2) вы используете фиксированный шаг, то есть в ваших итерациях точность каждой итерации не принимается как ans**2 становится ближе к входному значению.

И вы даже не определили никакой функции для вычисления корня.

Вот что работает: Методы вычисления квадратных корней.

—СА


Рейтинг:
1

Patrice T

Цитата:
Анс: я все понял. Он уменьшает x на небольшое значение, то есть на 0,0001, то есть шаг до тех пор, пока x не станет меньше Эпсилона. ans увеличивается на ANS += step. Поэтому, когда он достигает значения, большего или равного x, цикл завершается.
Неправильный.
Эта программа ищет квадратный корень из x путем перебора всех возможных ans в последовательности, начинающейся с 0 и приращение с небольшим значением 0.0001 .
На каждой петле квадрат фактического ans сравнивается с x пока разница не станет меньше, чем epsilon и ans меньше того x.

Метод очень наивный и имеет много проблем.
- это медленно, очень медленно, вааай медленно.
- для x больше 10000, вы начинаете находить значения, где ans никогда не входит в epsilon толерантность.