Вычислить функцию Erf с использованием правила Хорнера (без использования факториала и мощности)

#c #math

#c #математика

Вопрос:

Хотя моя первая часть позволяет мне использовать факториал и мощность, поэтому я создаю некоторые прототипы функций и использую рекурсивную функцию для получения функции ошибки следующим образом:

 double erf(double x, int N)
{
if (N < 0) return 0;

return 1.128379167*(power(-1,N)*power(x,2*N 1))/((2*N 1)*fact(N)) erf(x, N-1); 
}
  

Проблема в том, что во второй части мне нужно использовать правило Хорнера, в то время как a1, a2, a3 ….a (n) включают факториальную функцию. Итак, что мне следует сделать, чтобы изменить факториальную функцию на что-то другое, чтобы я мог использовать рекурсивную функцию для вычисления erf без использования факториала.

Правило Хорнера

Функция ошибки

Комментарии:

1. Из вашего описания неясно, в чем проблема. Рассмотрите возможность переформулировки, пожалуйста, или покажите нам больше кода.

2. Проблема заключается в том, как связать взаимосвязь между этими двумя формулами, учитывая использование рекурсивной функции или цикла

3. Попытайтесь понять, что это очень расплывчатый запрос, в котором практически нет кода. Попробуйте, может быть, обрисовать проблему математически, чтобы посмотреть, поможет ли это людям понять. Я не знаю, например, что вы подразумеваете под «этими двумя формулами».

4. Можете ли вы кэшировать значения факториала с точностью до определенного N и использовать таблицу подстановки? Вычисление факториала для больших чисел из N — это нетривиально.

Ответ №1:

Вы могли бы упростить прямую сумму как

 res = 1;
term = 1;
for(k=1; k<=N; k  ) {
    term *= -x*x/k;
    res  = term/(2*k 1);
}
return 1.128379167*x*res;
  

Для реализации, подобной Хорнеру, рассмотрим сначала пример для внутренней суммы (т. Е. без общего множителя 1.128379167*x )

 1 - x^2/1!/3   x^4/2!/5 - x^6/3!/7

= 1 - x^2 * (1/3 - x^2/2 * (1/5 - x^2/3 * (1/7 - ...) ) )
  

Таким образом

 innersum(x,k,N) {
    if(k>N) return 0;
    return 1/(2*k 1)-x*x/(k 1)*innersum(x,k-1,N);
}

erf(x,N) {
    return 1.128379167*x*innersum(x,0,N);
}
  

Комментарии:

1. x ^ 6/3!/7 превращается в x^2/3 * (1/7-….. , разве это не должно быть x ^ 2/3! * (1/7-….

2. Вам нужно собрать все коэффициенты, присутствующие в этом вложенном выражении.

3. извините, я не совсем знаком с использованием цикла в части ‘return 1.128379167*x res;’ и ‘return 1.128379167 * x innersum (x, 0, N);’, поэтому он не будет использовать общий множитель дважды?

4. хорошо, я забыл, что внутренняя функция будет умножена на внешнюю функцию, поэтому факториал может быть преобразован таким образом. Теперь я пытаюсь ввести код по-своему, чтобы увидеть любую проблему

5. я вижу проблему, возможно, -x x / (k 1) * внутренняя сумма (x, k 1, N), сначала она вычислит -x x / (k 1) * 1 / (2 * k 2). Но теперь я понимаю все уравнение. Пытаюсь увидеть какую-либо проблему с кодированием