#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). Но теперь я понимаю все уравнение. Пытаюсь увидеть какую-либо проблему с кодированием