Ошибка в коде, метод для вычисления sqrt (a) - PullRequest
0 голосов
/ 25 февраля 2020

Один из методов для вычисления sqrt (a), a> 0 это

X(n+1) = (a + (X(n)*X(n-1))/(X(n)+X(n-1)), n = 1, 2, …,

с X0=1 и X1=a (то есть известно, что lim n-> infin of Xn = sqrt(a)

Напишите функцию [sqa, nitr] = mySqrt(a), которая реализует это вычисление. Функция должна использовать while-l oop, завершаться, когда разница между Xn + 1 и Xn становится меньше eps(10*a), и выводить Xn + 1 в sqa и значение n, при котором while-l oop было завершено в nitr. Проверьте вашу функцию на a = 103041.

Я написал это, но это не так работа

function [sqa, nitr] = mySqrt (a)
%[sqa, nitr] = mySqrt (a)
% computes square root of a 
% sqa = a;
sqaprev = a;
nitr = 0;
X(n+1) = (a + (X(n)*X(n-1))/(X(n)+X(n-1))); %find the second term
sqa= X(n+1)
while abs (sqaprev-sqa) >= eps (10*a)
    sqaprev = sqa;
    sqa = (1/2) *(sqaprev+ (a/sqaprev));
    nitr = nitr + 1;
end %while
end

я получаю ошибку:

Unrecognized function or variable 'X'.
Error in mySqrt (line 7)
X(n+1) = (a + (X(n)*X(n-1))/(X(n)+X(n-1))); %find the second term

Может ли кто-нибудь мне помочь?

Ответы [ 2 ]

0 голосов
/ 25 февраля 2020

В соответствии с алгоритмом, который вы представили для квадрата root, вы можете попробовать код ниже

function [sqa, n] = mySqrt(a)
n = 2; % start from 2
X = [1,a]; % initial value for sequence X
while true % repeat procedure until termination condition is reached
    X(n+1) = (a + (X(n)*X(n-1)))/(X(n)+X(n-1)); % update sequence X by assigning new values
    if abs(X(n+1)-X(n)) <= eps(10*a) % termination condition
      break;
    end
    n = n + 1;
end 
sqa = X(end); % return the last element of X as the square root
end

такой, что

>> [sqa,n] = mySqrt(a)
sqa =  321.00
n =  20
0 голосов
/ 25 февраля 2020

Вы должны начать с объявления ваших переменных и присвоения им значений

X(1)=1;
X(2)=a;
n=2;

Затем в l oop вы применяете данную формулу рекурсии, а не формулу Герона / Вавилона, полученную откуда-то еще.

...