Завдання: Обчислити значення натурального логарифма ln(1-x) за допомогою розкладення в ряд Тейлора.
При цьому задана деяка точність епсілон: якщо наступний доданок із ряду Тейлора стає меншим за епсілон, то обчислення припиняються і виводиться результат.
Ряд Тейлора натурального логарифма ln(1-x) має вигляд:
Рекурсивна реалізація
using System;
class Program
{
/// <summary>
/// Рекурсивний метод піднесення до степеню
/// </summary>
/// <param name="num">Число</param>
/// <param name="pow">Степінь</param>
/// <returns>Результат</returns>
static double Power(double num, int pow)
{
if (pow == 0)
{
return 1;
}
return num * Power(num, pow - 1);
}
/// <summary>
/// Рекурсивний метод для обчислення суми ряда Тейлора
/// </summary>
/// <param name="x"></param>
/// <param name="n"></param>
/// <param name="precision"></param>
/// <returns></returns>
private static double Sum(double x, int n = 1, double precision = 1e-10)
{
var current = Power(x, n) / n;
if (current < precision)
{
return current;
}
return current + Sum(x, n + 1, precision);
}
/// <summary>
/// Рекурсивний метод обчислення ln(1-x)
/// </summary>
/// <param name="x"></param>
/// <param name="precision">Точність</param>
/// <returns>Результат</returns>
public static double Ln1MinusX(double x, double precision = 1e-10)
{
return -Sum(x, precision: precision);
}
public static void Main()
{
Console.Write("x = ");
var x = double.Parse(Console.ReadLine());
var result = Ln1MinusX(x);
Console.WriteLine("Ln1MinusX(x) = {0}", result);
Console.WriteLine("Math.Log(1-x) = {0}", Math.Log(1 - x));
Console.ReadKey(true);
}
}
Ітеративна реалізація
using System;
class Program
{
/// <summary>
/// Метод обчислення ln(1-x)
/// </summary>
/// <param name="x"></param>
/// <param name="precision">Точність</param>
/// <returns></returns>
public static double Ln1MinusX(double x, double precision = 1e-10)
{
var current = x;
var sum = 0d;
var pow = x;
var n = 1;
while (current > precision)
{
current = pow / n;
sum += current;
pow *= x;
n++;
}
return -sum;
}
public static void Main()
{
Console.Write("x = ");
var x = double.Parse(Console.ReadLine());
var result = Ln1MinusX(x);
Console.WriteLine("Ln1MinusX(x) = {0}", result);
Console.WriteLine("Math.Log(1-x) = {0}", Math.Log(1 - x));
Console.ReadKey(true);
}
}
Замість метода Power можна використовувати Math.Pow, мови C#.