ML15

Задача. Определить силу притяжения [latex]F[/latex] между телами массы [latex]m_1[/latex] и [latex]m_2[/latex], находящимися на расстоянии [latex]r[/latex] друг от друга.

Тесты

Масса первого тела(кг) Масса второго тела(кг) Расстояние(м) Сила притяжения
2e15 1.5e10 1e3 2.00215e+09 Н
3e20 2.5 1e5 4.00430e+05 Н
7e-1 9 2 1.05113e-10 Н
3e20 0 1e5 0.00000e+00 Н
20 50 9e5 8.23931e-20 Н

Алгоритм

Задача состоит в том, чтобы успешно применить формулу закона всемирного тяготения. Мы должны вычислить силу притяжения между двумя телами, если известны их массы, а также расстояние между ними. Это легко найти без дополнительных преобразований по следующей формуле:

[latex]F=G\cdot \frac{m1\cdot m2}{r^2}[/latex],

где [latex]m_1[/latex], [latex]m_2[/latex] — массы тел,  [latex]r[/latex] — расстояние, а [latex]G[/latex] — гравитационная постоянная, значение которой задается в виде константы. Остальные значения вводятся с клавиатуры,  в системе СИ.

Результат программы выводится в стандартном виде. Точность мантиссы по умолчанию равна пяти знакам после запятой.

Код программы:

Код программы

Ю3.20

Задача: Для заданных [latex]a[/latex] и [latex]p[/latex] вычислить [latex]x = \sqrt[p]{a}[/latex] по рекуррентному соотношению Ньютона: 

[latex]x_{n+1}=\frac{1}{p}*\left[(p-1)x_{n}+\frac{a}{x_{n}^{p-1}}\right][/latex]  [latex]x_{0} = a[/latex]

Сколько итераций надо выполнить, чтобы для достижения заданной погрешности [latex]\varepsilon[/latex] выполнялось соотношение:

[latex]\left|x_{n+1}-x_{n}\leq\varepsilon\right|[/latex]?

Тесты:

[latex]a[/latex] [latex]p[/latex] Значение корня [latex]x[/latex] Значение корня [latex]x[/latex], подсчитанного с помощью соотношения Количество итераций
57 5  2.24479 2.24479  18
16 2 4 4 5
230 2  15.1658  15.1658 7
9 3  2.08008 2.08008  7

Код на С++: 

Код на Java:

 

 

Решение: Для подсчёта значения корня с помощью рекуррентного соотношения, я создал цикл, в котором организовал подсчёт значения таким образом, что пока разница значения корня x, подсчитанного с помощью функции pow, cо значением текущего корня xn,  подсчитанным с помощью соотношения, больше заданной погрешности eps, то, записывая текущее значение в переменную x_prev, подсчитываю новое значение корня. В зависимости от заданной погрешности, программа считает результат и выводит его на экран вместе с кол-вом итераций.

UPD: По предложению Игоря Евгеньевича добавил быстрое возведение в целую степень.

Решение UPD: Чтобы построить алгоритм быстрого возведения в степень, необходимо рассмотреть две ситуации:

  1. Когда степень чётна;
  2. Когда степень не чётна;

Ситуация 1 : Проведя несложный анализ  можно заметить, что [latex]{a}^{p}[/latex] можно представить в виде

[latex](a^{\frac{p}{2}})^{2}[/latex].

Ситуация 2: В этой ситуации необходимо перейти в степень [latex]p-1[/latex], которая является чётной.

[latex]a^{p}=a^{p-1} * a[/latex]

И в результате получим алгоритм, который работает за [latex]O(\log n)[/latex].

 

Проверить правильность работы программы можно здесь (UPD):  http://ideone.com/VBLGKO