Как показать поворотные точки для функции на графике в Python?

#python #derivative

#python #производная

Вопрос:

Требование состоит в том, чтобы определить эту функцию f(x) = x^3 - 15x^2 - 18x 1 и затем отобразить ее таким образом, чтобы область построения отображала все поворотные точки.

Я думаю, что мои приведенные ниже расчеты неверны, потому что, если вы посмотрите на график, есть как минимум 2 поворотные точки.
Под этим я подразумеваю, что функция сначала увеличивается, а затем уменьшается, но в моих расчетах я нашел единственное решение для x , где x = 0.5 .

Как я могу решить эту проблему?

 %matplotlib notebook
import matplotlib.pyplot as plt

plt.rcParams.update({'font.size': 14})

#1. define the function
def f(x): 
    return x**3 - 15*x**2 - 18*x   1


#find the turning points of a polynomial of 3rd degree

#2. find the derivative of  x**3 - 15*x**2 - 18*x   1 
# the derivative is -15(2x   1)

#3. by the null factor law, get the value of x: 
# 2x   1 = 0
# 2x = 1
# x = 0.5

#4. check what is f(x) for x = 0.5
0.5**3 - 15*0.5**2 - 18*0.5   1 = -39/4 = -9.75

#5. Therefore, we can conclude that there is a single turning point at A(0.5, -9.75)

x = np.linspace(-5,5,100)
plt.plot(x, f(x))
plt.plot(0.5,f(0.5),'.r', ms=20,label='x_1') #plot A(0.5, -9.75)
plt.xlabel('x')
plt.ylabel('f(x)')
plt.grid()
plt.show()
 

введите описание изображения здесь

ПРАВКА_1

Основываясь на предложении Пикаруса, я пересчитал производную, но решение моего уравнения на графике выглядит не так корректно.

 def f(x): 
    return x**3 - 15*x**2 - 18*x   1


#find the turning points of a polynomial of 3rd degree

#2. find the derivative of  x**3 - 15*x**2 - 18*x   1 
# Workout the derivative
# (x**3)' = 3*x**2
# (-15*x**2)' = -30*x
# (-18x)' = -18
# (1)' = 0 
# Therefore our derviative equation is 3*x**2 -30*x  -18
#Bring it to a more concise form
# 3(x**2 - 10*x -6) = 0

#Find the x solution for x**2 - 10*x -6 
#Delta = b**2 - 4*a*c
#x1 = (10   sqr(76))/2  = 9.358
#x2 = (10 - sqr(76))/2  = -3.84


x1 = (10   np.sqrt(76))/2
x2 = (10 - np.sqrt(76))/2
print(x1)
print(x2)

#4. check what is f(x) for:  x1 = 9.358, x2 = 0.641

x = np.linspace(-5,5,100)
plt.plot(x, f(x))
plt.plot(x1,f(x1),'.r', ms=20,label='x_1') 
plt.plot(x2,f(x2),'.b', ms=20,label='x_2') 
plt.xlabel('x')
plt.ylabel('f(x)')
plt.grid()
plt.show()
 

введите описание изображения здесь

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

1. Производная полинома 3-й степени является полиномом 2-й степени. В частности, ваша производная равна 3 * x ** 2-30 * x-18

2. Хорошо, итак, мы могли бы сказать, что решение для производной таково 3(x**2 - 10x - 6) . Как мне разложить это квадратичное значение, чтобы я мог получить значения x ?

3. Если я не знаю, как учитывать 3(x**2 - 10x - 6) . Я могу попытаться найти дельту и решения для x1, 2 . D = b**2 - 4*a*c . Следовательно D = 100 - 24 = 76 . И x1,x2 = (-b - sqr(D))/2*a . Теперь, x1 = (10 sqr(76) ) / 2 и x2 = (10 - sqr(76) ) / 2 . Это правильно?

4. @Picarus Я отредактировал свой вопрос и реализовал его на основе вашего ответа. Не могли бы вы, пожалуйста, посоветовать?

5. Математика кажется правильной, но ваш график неверен. X2 не отображается в нужном месте. Также увеличьте интервал linspace, чтобы вы могли видеть всю релевантную информацию, сделайте что-то вроде от -10 до 20. Ваши синяя и красная точки должны находиться в верхней или нижней части графика, это локальные максимумы или минимумы. Я отвечаю со своего планшета, поэтому не могу быть более конкретным.

Ответ №1:

 import numpy as np
from matplotlib import pyplot as plt

# generate some toy data
n = 600
t = np.linspace(0, 600, n)
y = (300 * np.exp(-0.1 * t)   1)   20 * (np.random.random(n))

# get the gradient
dy = np.gradient(y)

# search gradient for first occurrence of thresh value:
thresh = 0.01
idx_thresh = np.argmax(dy > thresh)
# y[idx_thresh] would be the "turning point"

# visualization
plt.plot(t, y, 'b', label='y')
plt.plot(t, dy, 'g', label='dy')
plt.plot(t[idx_thresh:], y[idx_thresh:], 'r', label=f'y[dy > {thresh}]')
plt.legend()
 

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

1. Я должен решить эту проблему, не используя встроенные методы, такие как np.gradient . Он больше ориентирован на решение математической задачи вручную и представление ее с помощью python. Я запустил ваш код, и он отображает более 2 точек на графике imgur.com/OeDZG7P