Натуральний логарифм ln(1+x)

Завдання: Обчислити значення натурального логарифма 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="num">Число</param>
    /// <returns>Абсолютне значення числа</returns>
    static double Abs(double num)
    {
        if (num >= 0)
        {
            return num;
        }

        return -num;
    }

    /// <summary>
    /// Рекурсивний метод обчислення ln(1+x)
    /// </summary>
    /// <param name="x"></param>
    /// <param name="n"></param>
    /// <param name="precision">Точність</param>
    /// <returns>Результат</returns>
    public static double Ln1PlusX(double x, int n = 0, double precision = 1e-10)
    {
        var current = Power(-1, n) * Power(x, n + 1) / (n + 1);
        if (Abs(current) < precision)
        {
            return current;
        }

        return current + Ln1PlusX(x, n + 1, precision);
    }

    public static void Main()
    {
        Console.Write("x = ");
        var x = double.Parse(Console.ReadLine());
        var result = Ln1PlusX(x);
        Console.WriteLine("Ln1PlusX(x)   = {0}", result);
        Console.WriteLine("Math.Log(1+x) = {0}", Math.Log(1 + x));
        Console.ReadKey(true);
    }
}

Ітеративна реалізація

using System;

class Program
{
    /// <summary>
    /// Модуль числа
    /// </summary>
    /// <param name="num">Число</param>
    /// <returns>Абсолютне значення числа</returns>
    static double Abs(double num)
    {
        if (num >= 0)
        {
            return num;
        }

        return -num;
    }

    /// <summary>
    /// Метод обчислення ln(1+x)
    /// </summary>
    /// <param name="x"></param>
    /// <param name="precision">Точність</param>
    /// <returns></returns>
    public static double Ln1PlusX(double x, double precision = 1e-10)
    {
        var current = x;
        var sum = 0d;
        var pow = x;
        var sign = -1;
        var n = 0;
        while (Abs(current) > precision)
        {
            sign *= -1;
            current = sign * pow / (n + 1);
            sum += current;
            pow *= x;            
            n++;
        }

        return sum;
    }

    public static void Main()
    {
        Console.Write("x = ");
        var x = double.Parse(Console.ReadLine());
        var result = Ln1PlusX(x);
        Console.WriteLine("Ln1PlusX(x) =   {0}", result);
        Console.WriteLine("Math.Log(1+x) = {0}", Math.Log(1 + x));
        Console.ReadKey(true);
    }
}

Замість метода Power можна використовувати Math.Pow, мови C#.
Замість метода Abs можна використовувати Math.Abs.

Дивіться також: