Задача.
Для заданного [latex]x>1[/latex] вычислить [latex]y=\sqrt{x}[/latex] по итерационной формуле: [latex]y_{i}=\frac{1}{2}(y_{i-1}+\frac{x}{y_{i-1}})[/latex] c заданной погрешностью ε, задав начальное приближение [latex]y_{0}=x[/latex]. Сравнить с результатом использования встроенной функции. Сколько итераций пришлось выполнить?
Тесты.
x | ε | [latex]y_{i}[/latex] | [latex]\left|\sqrt{x}-y_{i} \right|[/latex] | i | Комментарий |
5 | 1e-2 | 2.236069 | 9.18e-07 | 4 | Пройден |
100 | 1e-1 | 10.000053 | 5.29e-05 | 6 | Пройден |
100 | 1e-2 | 10.000000 | 1.40e-10 | 7 | Пройден |
100 | 1e-6 | 10.000000 | 0.00e+00 | 8 | Пройден |
100 | 1e-10 | 10.000000 | 0.00e+00 | 9 | Пройден |
Решение.
C++
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#include <stdio.h> #include <math.h> int main() { double x,e; //описание переменных scanf("%lf%lf",&x,&e); //ввод условий double y1; int i=0; double y2=x; //задаем начальное приближение do { y1=y2; y2=0.5*(y1+x/y1); //вычисление по заданной формуле i=i+1; //подсчет количества итераций } while(fabs(y2-y1)>=e); printf("%lf\n",y2); printf("%e\n",fabs(sqrt(x)-y2)); //сравнение с результатом встроенной функции printf("%d",i); } |
Java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
import java.util.*; import java.lang.*; import java.io.*; class Ideone { public static void main (String[] args) { double x,e; //описание переменных Scanner sc = new Scanner(System.in); x = sc.nextDouble(); //ввод условий e = sc.nextDouble(); double y1; int i=0; double y2=x; //задаем начальное приближение do { y1=y2; y2=0.5*(y1+x/y1); //вычисление по заданной формуле i=i+1; //подсчет количества итераций } while(Math.abs(y2-y1)>=e); System.out.printf("%f\n",y2); System.out.printf("%e\n",Math.abs(Math.sqrt(x)-y2)); //сравнение с результатом встроенной функции System.out.printf("%d",i); } } |
Для подсчета значения квадратного корня для заданного числа создадим цикл. Цикл выполняется пока [latex]\left|y_{i}-y_{i-1}>=\varepsilon\right|[/latex].
С повышением точности растёт количество итераций, но из-за того что, начиная с [latex]\varepsilon=10^{-5}[/latex], погрешность не вычисляется, зависимость оценить нельзя.
Для выполнения программы и проверки тестов можно воспользоваться следующей ссылкой(C++) или другой(Java).
Интересно, кому нужен корень из числа с точностью 0.1? Хотелось бы посмотреть на число итераций с эпс = 1е-6, например.
Зачтено.
Только добавьте несколько тестов с большой точностью. Оцените скорость сходимости.
Отредактировал.
Хорошо, только куда теперь делись отступы?
Вернул. Не представляю почему они исчезли.
Главное, что они вернулись..
Зачтено
Засчитана Java версия.