Разложения экспоненциальной функции в ряд Тейлора

Мне нужно написать программу на C, которая вычисляет разложение функции pow(a,x). Я уверен, что мой код неверен, может ли кто-нибудь помочь мне с этим?

расширение:

1 + x log(a) + 1/2 x^2 log^2(a) + 1/6 x^3 log^3(a) + 1/24 x^4 log^4(a) + 1/120 x^5 log^5(a) +...

Без использования функции pow. Следующее выражение должно быть вычислено из предыдущего.

Вот с чем мне удалось прийти:

double series(double x)
{
int i;
double s,w,x2;
s=x;
w=x;
    for(i=1;i<LWS;i++)
{
    w=(w*x/(i+1))*log10(x);
    s+=w;
}
return s;
}

У меня уже есть остальная часть кода.


person adrian1337    schedule 28.01.2017    source источник
comment
Вы забыли задать вопрос   -  person Ed Heal    schedule 28.01.2017


Ответы (2)


log a необходимо рассчитать только один раз. Приличный компилятор сделает это за вас, но на всякий случай помогите.

Теперь каждый член равен 1/i! * х^я *лога^я

1/я! член растет очень быстро и означает, что в течение нескольких итераций, если x не является огромным, ошибка будет незначительной.

Вы можете продолжать использовать коэффициенты, если хотите, если (i factorial) умножается на i (убедитесь, что это двойное число, а не целое число), xp (степень x) умножается на x при каждом взаимодействии, и то же самое происходит с loga .

На самом деле я не могу вспомнить, чтобы расширить ряд pow, поэтому я просто предполагаю, что ваша формула верна. Выглядит в принципе правильно. Мы используем натуральные логарифмы (ln в математической нотации, log в C), которые как бы сокращаются с факториальным членом, связанным с e^x.

person Malcolm McLean    schedule 28.01.2017
comment
Сначала протестируйте его, распечатав условия. Сходятся ли они к нулю очень быстро при разумных значениях а и х? Если не дает правильный ответ, что это не так? Вы убедились, что я факториал двойной? В вашем коде он будет равен 0, поскольку хранится как целое число. - person Malcolm McLean; 28.01.2017

По сути, вы делаете следующее: a^x = e^(x * ln(a)), а затем используете расширение ряда Тейлора e.

У вас есть несколько ошибок в вашем коде:

  1. Поскольку вы используете расширение e, вам нужно использовать натуральные логарифмы (по основанию e), а не логарифмы по основанию 10.
  2. Начальное значение s вне цикла должно быть установлено на 1. Это потому что a^x = 1 when x=0 (если a != 0).
  3. Вне цикла w должно быть установлено на 1. Это должно иметь хороший набор полномочий x * ln(a). Ранее с w=x степень x была бы на единицу больше, чем степень ln(a).
  4. i должен зацикливаться, начиная с i=0. Это нужно для того, чтобы получить факториалы сразу после внесения вышеуказанного изменения.

Итак, код становится:

double series(double x)
{
    int i;
    double s,w,x2;
    s=1.0;
    w=1.0;
    for(i=0;i<LWS;i++)
    {
        w=(w*x/(i+1))*log(x);
        s+=w;
    }
    return s;
}
person user1952500    schedule 28.01.2017
comment
Но проблема в том, что начальное значение формулы должно быть 1. - person adrian1337; 28.01.2017
comment
@adrian1337 рад это слышать. Если вы считаете, что какой-либо из ответов здесь или где-либо еще на сайте помог вам, не забудьте проголосовать. Также не забудьте принять ответ. - person user1952500; 28.01.2017