2016-08-31 5 views
-1

Я хочу написать подпрограмму, которая вычисляет п-ю производную функции, заданной подпрограммой формы:Есть ли лучший способ найти n-ю производную от функции в C?

double func(double x) 
{ 
    // a mathematical expression representing a smooth curve 
    //returns the value of the function at x  
} 

я написал следующую подпрограмму:

double nthderive(double (*f)(double),double x0,int n) 
{ 
    const double delta=1.0e-8; 
    double x1=x0 - delta; 
    double x2=x0 + delta; 
    if(n==0) { 
     return f(x0); 
    } 
    else { 
     return (nthderive(f,x2,n-1)-nthderive(f,x1,n-1))/(2*delta); 
    } 
} 

Может кто-то предложить лучший алгоритм для нахождения n-й производной?

+2

Обратите внимание, что/2 * delta должно быть/(2 * delta) –

+0

Что сказал @Bob__. Я не удивлюсь, если именно поэтому вы продолжаете получать '0.0' – StoryTeller

+0

Спасибо, что это сработало, но есть ли лучший способ вычисления n-й производной? Вот основная причина, по которой я задал этот вопрос –

ответ

0

-й производную можно вычислить с помощью Cauchy's integral lemma.

Преобразование интеграла по пути в «стандартный интеграл» (см. Line integral).

Затем вы можете интегрировать это выражение (например, с помощью trapezoidal rule).

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

+0

Работает только для голоморфных функций. –

+0

Это правда. Однако большинство функций в «ежедневном» использовании голоморфны. (Для op: голоморфное эквивалентно дифференцируемому и заполнению уравнений Коши-Римана. Примерами голоморфных функций являются: полиномы, экспоненциальная функция, sin, cos) – StefanM

0

Не считая числовой вопрос нестабильности, что делает регулировку Delta трудного и исключающее применение производных высокого порядка (скажет n > 3!), Рекурсивное решение довольно неэффективно, так как она принимает 2^n функции оценки, где n+1 являются достаточно.

В самом деле, вы вычислить

f' = f(+1) - f(-1) 
f'' = f'(+1) - f'(-1) = f(+2) - f(0) - f(0) + f(-2) 
f''' = f''(+1) - f''(-1) = f(+3) - f(+1) - f(+1) + f(-1) - f(+1) + f(-1) + f(-1) - f(-3) 
... 

когда биномиальная формула говорит вам

f' = f(+1) - f(-1) 
f'' = f(+2) - 2f(0) + f(-2) 
f''' = f(+3) - 3f(+1) + 3f(-1) - f(-3) 
... 
+0

спасибо, но мой код дает неправильные или слегка отработанные решения в некоторые моменты времени, по-видимому, это может быть связано с тем, что дельта становится меньше в каждый шаг, могу ли я сделать его функцией f, x и n, чтобы убедиться, что он не взорвется или не дает неправильных результатов. –

+0

@AlokRanjan: где вы видели, что ваша Дельта уменьшается ??? Прочитайте все комментарии, верьте им и отбросьте эту регрессивную версию. –