Проблема с нахождением суммы и значений функции в ряде тейлора

Дано следующее задание : На интервале [a,b] вычислить значения функции f(x) и суммы S(x) , заданной в виде разложения в ряд Тейлора , с точностью epsilon.Считать вычисления корректными если при малых значениях погрешности(eps<=0.0001) значения функции и суммы отличаются не более чем на eps.

Написал функцию , которая будет подсчитывать сумму ряда (Summ) , значения функции вычисляю с помощью встроенной функции log (по заданию ln(x+1) = Сумма от 0 до inf : ((-1)^n*x^(n+1))/(n+1) , думаю что проблема именно в составлении алгоритма, но никак не могу найти причину , можете помочь ?

#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;

double Summ(double x, const double &epsilon,double &S)
{
    
    double an;
    int n1;
    n1 = 0;
    an = x;
    while (fabs(an) > epsilon)
    {
        S += an;
        n1++;
        an *= -x / ((n1+1) / n1);
    }
    return S;
}

int main()
{
    setlocale(LC_ALL, "rus");

    double a, b;//границы возможных значений интервала (a>-1 , b<=1)
    double dx;
    double epsilon;//epsilon<=0.0001
    double an;

    double S=0;

    double x;

    cout << "Введите начало интервала(а):\t";
    cin >> a;
    cout << "Введите начало интервала(b):\t";
    cin >> b;
    cout << "Введите погрешность(epsilon):\t";
    cin >> epsilon;
    cout << "Введите шаг dx:\t";
    cin >> dx;

    int n = 0;
    an = a;

    cout << setw(2) << "x" << setw(15) << "f(x)=ln(x+1)" << setw(5) << "S(x)" << setw(3) << "n" << endl;
    for (x = a; x <= b; x += dx)
    {
        
        if (fabs(Summ(x, epsilon, S) - log(x + 1.0)) <= epsilon)
        {
            cout << setw(2) << x << setw(15) << log(x + 1) << setw(5) << Summ(x, epsilon, S) << setw(3) << n << endl;
            n++;
        }
        else break;

    }
    cout << log(1.0 + 0.1) << endl;
    cout << Summ(0.1, 0.0001, S) << endl;

    return 0;
}

Ответы (1 шт):

Автор решения: Harry

Ну, промолчим о форматировании вывода и прочих мелочах... Но зачем вам третий параметр в функции Summ?

double Summ(double x, double epsilon)
{
    double S = x, t = x;
    for(int k = 2; abs(t) >= epsilon; ++k) S += (t *= -x)/k;
    return S;
}

Вот и все. Больше ничего не нужно... Только будьте осторожны при x, близком к 1 - там ряд сходится из рук вон плохо...

→ Ссылка