Табулирование функции. Как правильно описать цикл разложения ряда функции ln((1+x)/(1-x)?
Есть функция с описанием члена ряда. И при в ходе в эту функцию, каждый член считается заново и аккамуляции ряда не идет. Приложу задание. Были перепробованы разные циклы, но ничего не помогает.
In ((1+x)/(1-x)) =2*(x+x^3/3+x^5/5 +⋯+x^(2m-1 )/(2m-1)+⋯),xϵ[-1;1]
Подобрать значения начального и конечного значения х, а также шага его изменения исходя из области определения математической функции и области сходимости ряда. Результатом работы программы должна быть таблица, состоящая из столбцов. В первом должны находится значения аргумента, во втором – значение функции в данной точке х, в третьем – сумма значений ряда (без применения рекурсии), в четвертом - сумма значений ряда (с применением рекурсии), в пятом – количество вызовов рекурсивной функции. При построении таблицы необходимо использовать указатели на функции. Завершать процесс суммирования членов ряда необходимо до момента когда разница между значением математической функции и суммой членов её разложения меньше эпсилон (вводится с клавиатуры). При наборе заданий возможны ошибки. В таких случаях производить вычисления до момента, когда n – ый член последовательности меньше эпсилон, или просто ограничить значение n.
#include <iostream>
#include <cmath>
using namespace std;
double LogFunction(double x);
double SumRows(double x, double Eps);
int main()
{
double XStart, XFinish, DeltaX, X, Y, Result, Eps;
double(*Logarifm)(double x);
Logarifm = LogFunction;
double(*RowTeylor)(double x, double Eps);
RowTeylor = SumRows;
setlocale(LC_ALL, "rus");
cout << "Введите начальное значение аргумента X на [-1;1]" << endl;
cin >> XStart;
cout << "Введите конечное значение аргумента X на [-1;1]" << endl;
cin >> XFinish;
cout << "Введите значение приращения X" << endl;
cin >> DeltaX;
cout << "Введите значение погрешности Епсилон" << endl;
cin >> Eps;
X = XStart;
while (X < XFinish + 1e-8)
{
Y = Logarifm(X);
Result = RowTeylor(X, Eps);
cout.setf(ios::fixed);
cout.precision(3);
cout << X << " " << Y << " " << Result << endl;
X += DeltaX;
}
system("pause");
}
double LogFunction(double x)
{
return log((1 + x) / (1 - x));
}
double SumRows(double x, double Eps)
{
int sum = 0;
for(int i=1;i<=20; i++)
{
sum += 2 * (pow(x, 2 * i - 1) / (2 * i - 1));
i++;
}
return sum;
}
Ответы (1 шт):
Вообще-то лучше бы написать вот так:
double SumRows(double x, double eps)
{
double sum = x, term = x;
x = x*x;
for(int i = 3; fabs(x)/i > eps; i+=2) sum += (term *= x)/i;
return 2*sum;
}
А, да! рекурсивно -
double Recurs(double x, double eps, double term = 0, int i = 1)
{
if (i == 1)
{
term = x;
}
else if (fabs(term)/i < eps) return 2*term/i;
return 2*term/i + Recurs(x,eps,term*x*x,i+2);
}