Задание: Вычислить значение натурального логарифма 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.