Проблема с реализацией логарифма в серии Тейлора - PullRequest
0 голосов
/ 10 апреля 2019

Я попытался сделать функцию, вывод которой приблизительно равен значению логарифма x (x - это плавающее число), используя расширение Тейлора.

Серия натуральных логарифмов Тейлора:

ln (x) = {n = 0 (сигма) inf} (-1) ^ n * (x-1) ^ (n + 1) / (n + 1)

(используется сигма суммирование) для более четкого изображения расширения Тейлора, см. https://en.wikipedia.org/wiki/Taylor_series#First_example

Кроме того: log (a, b) = log (a) / log (b) (a является основанием)

Ниже моя реализация, использующая эти принципы:

double logtaylor(double a,double b,double prec)
{
    double suma=0,sumb=0,n;


    for(n=0;n<prec+1;++n)
    {
            suma+=(pow(-1,n)*pow(a-1,n+1)/(n+1));
            sumb+=(pow(-1,n)*pow(b-1,n+1)/(n+1));
            printf("%d)suma=%lf\n",(int)n,suma);
            printf("%d)sumb=%lf\n",(int)n,sumb);
    }


    return suma/sumb;
}

Я тестировал логарифм от 3 до основания 2 -логтайлор (2,3,30) - на уровне точности 30.

Выход:

math.h: 0.630930
0)suma=1.000000
0)sumb=2.000000
1)suma=0.500000
1)sumb=0.000000
2)suma=0.833333
...
26)suma=0.711323
26)sumb=3272620.000449
27)suma=0.675609
27)sumb=-6314360.570980
28)suma=0.710091
28)sumb=12198429.497986
29)suma=0.676758
29)sumb=-23592964.635348
30)suma=0.709016
30)sumb=45680701.429168

Оба утверждения суммирования a и b абсолютно одинаковы, за исключением переменных, однако они ведут себя совершенно по-разному. Сумма довольно близка к реальному значению, вычисленному в математическом заголовке. 3) ~ 0,63092975356) - тогда как его коллега отклоняется от огромных размеров до миллионов. Я не мог обернуться вокруг этого. Я ценю любую помощь. Заранее спасибо.

1 Ответ

1 голос
/ 10 апреля 2019

Область сходимости ряда Тейлора для ln равна (0, 2]. Вне этого ряд не будет сходиться к значению ln x ; он будет расти по величине вечно. Другими словами, у вас математическая проблема, а не проблема программного обеспечения - программное обеспечение правильно оценивает ряд, но ряд Тейлора не приближается к ln x за пределами 0 <<em> x ≤ 2 .

...