Итак, у меня есть эта проблема оптимизации Ньютона, где я должен найти значение f'(x) и f''(x), где x = 2,5 и f = 2 * sin(x) - ((x)**2/10) для вычисления, но я пытался использовать sympy и np.diff для первой и второй производной, но не знаю, потому что он продолжает получать ошибку, поэтому я возвращаюсь к ручному производному. Любая подсказка, как получить функцию f с помощью другой библиотеки, Вот код
def Newton(x0):
x = x0
f = lambda x : 2 * np.sin (x) - ((x)**2/10)
f_x0 = f(x0)
#First Derivative
f1 = lambda x : 2 * np.cos (x) - ((x)/5)
f_x1 = f1(x0)
#Second Derivative
f2 = lambda x : -2 * np.sin (x) - (1/5)
f_x2 = f2(x0)
x1 = x0 - (f_x1/f_x2)
x0 = x1
return x,f_x0,f_x1,f_x2,x0
нахождение первой и второй производной без ручного способа.
В вашем случае производные можно рассчитать с помощью библиотеки scipy следующим образом:
from scipy.misc import derivative
def f(x):
return 2 * sin(x) - ((x)**2/10)
print("First derivative:" , derivative(f, 2.5, dx=1e-9))
print("Second derivative", derivative(f, 2.5, n=2, dx=0.02))
Здесь вычисляются первая и вторая производные для вашей функции при x=2,5.
То же самое можно сделать с библиотекой sympy, и некоторым это может показаться проще, чем описанный выше метод.
from sympy import *
x = Symbol('x')
y = 2 * sin(x) - ((x)**2/10) #function
yprime = y.diff(x) #first derivative function
ydoubleprime = y.diff(x,2) #second derivative function
f_first_derivative = lambdify(x, yprime)
f_second_derivative = lambdify(x, ydoubleprime)
print("First derivative:" , f_first_derivative(2.5))
print("Second derivative",f_second_derivative(2.5))
Обратите внимание, что существует не только 2 способа сделать одно и то же. Первый – числовая оценка производных. В то время как второй является символическим точным вычислением. Второй не будет работать ни для каких функций (иногда даже люди не знают, как вычислить производную, кроме как численно). Первый всегда работает (пока мы можем вычислить
y
для любого значенияx
), но всегда имеет ошибку.