2016-09-09 14 views
0

Я застрял в проблеме из учебника. Он спрашивает:квадратный корень n, вычисляя следующий член Xi

Написать свою собственную функцию квадратного корня аппроксимации с использованием уравнения Xk+1 = 1/2 * (Xk + n/(Xk), где X0 = 1.

В этом уравнении говорится, что sqrt'n 'можно найти, повторно вычисляя следующий член Xi. Чем больше используется количество терминов, тем лучше ответ. Позвольте вашей функции иметь два входных параметра, число, из которого вы хотите получить квадратный корень, и количество терминов для вычисления. '

Я использую Python3.5.2 для этого.

attached a picture of the problem

Спасибо!

+1

В соответствии с общими рекомендациями по домашнему заданию (http://meta.stackexchange.com/a/10812), вы предлагаете ** добросовестную попытку самостоятельно решить проблему ** и опубликовать это в вашем вопросе. – ahoffner

ответ

0

Новый учебный год, старый вавилонский метод.

Итак, я не разрешу это для вас, но я могу вас начать.

Мы можем написать небольшую функцию, которая вычисляет каждый x_{k+1}:

def sqrt_step(n, xk): 
    return 1/2.0 * (xk + float(n)/xk) 

Зададим n = 100.

sqrt_step(100, 1) # returns 50.5 

Теперь давайте кормить это число в функцию еще несколько раз:

sqrt_step(100, 50.5) # 26.2 

sqrt_step(100, 26.2) # 15.0 

sqrt_step(100, 15.0) # 10.8 

... это сходится к 10, как k уходит в бесконечность.

Теперь, если бы существовал способ повторной операции снова и снова k раз ... Я думаю о трехбуквенном слове, которое начинается с «f» и рифм с «рудой» ...


EDIT

Вы сделали честные усилия, чтобы решить эту проблему - что я собираюсь предположить это домашнее задание практика упражнения и не задание.

Вы можете решить это просто с помощью функции sqrt_step внутри новой функции. Это может быть сделано следующим образом:

def square_root(n, k): 
    xk = 1 
    for i in range(k): 
     xk = sqrt_step(n, xk) # or just: xk = 1/2.0 * (xk + float(n)/xk) 
    return xk 

Тесты:

square_root(64, 100) # 8.0 
square_root(144, 100) # 12.0 

Как вы стали более продвинутые, вы узнаете о функциональных методов программирования, которые позволяют избежать перезаписи переменных и явно писать for петли. На данный момент, однако, это самый простой подход.

+0

Спасибо InNoam за ответ на мой пост и помощь мне начать. У меня все еще есть проблемы с визуализацией того, как повторять эту операцию снова и снова k раз. Я покажу вам, что я пробовал до сих пор. Защиту sqrt_step (п, хк): возвращение 1/2,0 * (хк + поплавок (п)/хк) # как вы упомянули я пытался повторять это к раз по: Защиту sqrt_step (п, хк): для xk в диапазоне (xk, 1, -1): return 1/2.0 * (xk + float (n)/xk) Мое рассуждение состояло в том, чтобы повторить xk, пока оно не достигло 1, каждый раз уменьшая на 1. – Babeeshka

+0

В математике мы называем этот тип метода «явным», потому что 'x_ {k + 1}' зависит только от нас, знающих 'x_ {k}'. На английском языке это означает, что самое главное - знать значение *, полученное на предыдущем шаге. Итак, попробуйте установить значение 'xk = 1' и запустите функцию' sqrt_step() ', а затем * замените *' xk' на нее (в то время как это нарушает принцип программирования, за которым следуют некоторые известные как «неизменяемость», это самый простой способ начать работу). Вам нужно, чтобы цикл 'for' просто указывал компьютеру * сколько раз *, чтобы переписать значение' xk'. Фактический индекс на любом данном этапе не имеет особого значения. – lnNoam

+0

Думаю, я сделал это! Вы так полезны и лучше. Я не уверен, как отформатировать мой комментарий здесь, но я думаю, что я его усложнил, и то, что работало, было просто установить: для i в диапазоне (1,10): между другими строками. – Babeeshka