Консультация № 193312
24.05.2018, 21:51
0.00 руб.
0 3 1
Уважаемые эксперты! Пожалуйста, ответьте на вопрос:
Не используя стандартные функции (за исключением abs), вычислить с точностью eps>0:
y=ln(1+x)=x-x^2/2+x^3/3-...+((-1)^(n-1))*x^n+...(|x|<1);
Считать, что требуемая точность достигнута, если очередное слагаемое по модулю меньше eps, - все последующие слагаемые можно уже не учитывать.
Программа есть, но не знаю как сделать рекурентную формулу для расчета.
Помогите, пожалуйста.


Приложение:
using System;
using System.Diagnostics;

namespace Task2
{
class Program
{
public static void Main(string[] args)
{
while (true) //Цикл для многократного выполнения программы
{

Console.WriteLine("Программа для вычисления значения функции y=Log");
Console.WriteLine("Введите точность");
double eps = double.Parse(Console.ReadLine());
Console.WriteLine("Введите х");
double x = double.Parse(Console.ReadLine());
Console.WriteLine("Выберите алгоритм расчёта");
Console.WriteLine("1. Итерационный");
Console.WriteLine("2. Точный");

try
{

int i= int.Parse(Console.ReadLine());

switch (i)
{
case 1:
Stopwatch timer = new Stopwatch(); //оператор для измерения времени работы алгоритма
timer.Start();
//инициализация переменных n, y, step
double n = 1; //согласно формуле
double y = x; //начальному значению у присваиваем значение х
double step = x; //первое слагаемое
double z = Math.Log(x);

while (Math.Log(step)>eps) // цикл, который вычисляет натуральный логарифм.
//завершается, когда очередное слагаемое по модулю меньше eps, – все последующие слагаемые уже не учитываются
{
n=n+1; //увеличение на n 1
z=Math.Log(x); //умножение слагаемого на рекурентную формулу
//получаем следующее слагаемое
y=y+step; //прибавляем полученное слагаемое к у
}
timer.Stop();
Console.WriteLine("Log{0}={1}", x, y); //выводим на экран результат
Console.WriteLine("Время работы итерационного алгоритма: "+timer.ElapsedTicks/10000.0 + " миллисекунд.");
Console.ReadKey();
break;

case 2:
Stopwatch timer2 = new Stopwatch(); //оператор для измерения времени работы алгоритма
timer2.Start();
double d = Math.Log(x); //вычисление точного значения
timer2.Stop();
Console.WriteLine("Log{0}={1}", x, d);
Console.WriteLine("Время работы точного алгоритма: "+timer2.ElapsedTicks/10000.0 + " миллисекунд.");
Console.ReadKey();
break;
}
}
catch (Exception ex)
{
Console.WriteLine("Ошибка: " + ex.Message);
}
Console.WriteLine();
}
}
}
}

Обсуждение

давно
Советник
400484
472
25.05.2018, 12:05
общий
Добрый день,
вот вариант рекурсивной функции
Код:

/// <summary>
////Функция вычисления ln(1+x)=x-x^2/2+x^3/3-...+((-1)^(n-1))*x^n/n+...
/// </summary>
/// <param name="eps">вычислить с точностью eps>0</param>
/// <param name="x">введеное значение Х</param>
/// <param name="n">число n</param>
/// <param name="minus">значение -1</param>
/// <param name="res">результат текущего цикла</param>
/// <returns>результат вычисления</returns>
static double Func(double eps, double x, int n, int minus, double res)
{
double temp = 1.0;
for (int i = 0; i < n; i++)
{
temp *= x;
}
temp /= n;
temp *= minus;

if (Math.Abs(temp) < eps)
return temp + res;

temp += res;
return Func(eps, x, ++n, minus * -1, temp);
}

вызов будет так:
Код:

Func(eps, x, 1, 1, 0);
давно
Посетитель
402095
1
26.05.2018, 21:17
общий
Адресаты:
Цитата: solowey
Спасибо за помощь
давно
Советник
400484
472
27.05.2018, 13:35
общий
это ответ
Здравствуйте, dasha.savina2012!
вот вариант рекурсивной функции
Код:

/// <summary>
////Функция вычисления ln(1+x)=x-x^2/2+x^3/3-...+((-1)^(n-1))*x^n/n+...
/// </summary>
/// <param name="eps">вычислить с точностью eps>0</param>
/// <param name="x">введеное значение Х</param>
/// <param name="n">число n</param>
/// <param name="minus">значение -1</param>
/// <param name="res">результат текущего цикла</param>
/// <returns>результат вычисления</returns>
static double Func(double eps, double x, int n, int minus, double res)
{
double temp = 1.0;
for (int i = 0; i < n; i++)
{
temp *= x;
}
temp /= n;
temp *= minus;

if (Math.Abs(temp) < eps)
return temp + res;

temp += res;
return Func(eps, x, ++n, minus * -1, temp);
}

вызов будет так:
Код:

Func(eps, x, 1, 1, 0);
5
Форма ответа