Оптимизация функции в заданном диапазоне в scipy - PullRequest
0 голосов
/ 28 апреля 2020

Я пытался получить минимум для функции одной переменной. Функция:

sym.sqrt((x+6)**2 + 25) + sym.sqrt((x-6)**2 - 121)

Производная функции (которая (x - 6) /sym.sqrt ((x - 6) ** 2 - 121) + (x + 6) /sym.sqrt ((x + 6) ** 2 + 25)) взрывается при x, равном -5, и становится сложным при x, превышающем (например, -4), но меньше 18 (что мы можем игнорировать для простоты здесь), в связи с первым сроком. Поэтому я написал код, чтобы оценивать функцию только для x в диапазоне от -6 до -10 (по результатам проверки я мог видеть, что минимум составлял около -8,6, поэтому я выбрал -10):

def h(x):

    for x in np.arange(-10,-5):

        sym.sqrt((x+6)**2 + 25) + sym.sqrt((x-6)**2 - 121)

    result = optimize.minimize_scalar(h,bounds=(-10,-5))

    x_min = result.x

    print(x_min)

К сожалению, я получил эту ошибку:

TypeError: ufun c 'isnan' не поддерживается для типов ввода, и входы не могут быть безопасно приведены к каким-либо поддерживаемым типам согласно правилу приведения «safe» '

Может кто-нибудь помочь мне с этим вопросом?

С уважением,

Прасанна

1 Ответ

0 голосов
/ 28 апреля 2020

Я не думаю, что numpy и sympy играют хорошо вместе, если вы не lambdify ваше уравнение sympy. И я не уверен с NaN значениями, которые, кажется, находятся в вашем уравнении.

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

import numpy as np
from matplotlib import pyplot as plt
from scipy.signal import argrelmax

x = np.linspace(-10, -6, 256) # generate x range of interest
y = np.sqrt((x+6)**2 + 25) + np.sqrt((x-6)**2 - 121)

dydx = (x - 6)/np.sqrt((x - 6)**2 - 121) + (x + 6)/np.sqrt((x + 6)**2 + 25)

maximum, = argrelmax(dydx) # returns index of maximum

x[maximum]
>>> -8.50980392

# plot it
plt.plot(x, y)
ax = plt.gca().twinx() # make twin axes so can see both y and dydx
ax.plot(x, dydx, 'tab:orange')
ax.plot(x[maximum], dydx[maximum], 'r.')

plot of code above with maximum identified

...