Числовой корень для положительно определенной функции в Python
У меня есть очень сложная положительно определенная линейная непрерывная функция одной переменной k
для которого я пытаюсь найти все корни в данном диапазоне k
; сказать -4 < k < 4
,
До сих пор я сначала оценивал минимумы функции, ища точки k_j
где оба $k_{j+1}>k_j$
а также $k_{j-1}>k_j$
, Затем, используя каждую из этих точек в качестве отправной точки, я применяю функцию оптимизации, scipy.optimize.newton
, В какой-то степени этот метод сработал. Однако, поскольку мои функции усложняются, поиск минимумов становится все более трудоемким и, возможно, неточным.
Есть ли встроенная функция в numpy
или же scipy
который ищет в данном домене (например, -4 < k < 4
) функции и находит все корни. Я готов пожертвовать некоторой вычислительной эффективностью, чтобы мне не пришлось указывать точные точки для поиска рядом.
Спасибо
1 ответ
Вы можете использовать диапазон:
k_list = range(-4, 4)
Но это только целые числа, проблема здесь заключается в указании вашего шага. Очевидно, что между -4 и 4 есть бесконечные десятичные дроби, поэтому вам нужно указать, сколько десятичных знаков вы хотите использовать.
Ты можешь использовать numpy.arange
для того, чтобы составить список из диапазона и установить значение приращения
Например
k_list = numpy.arange(-4, 4, 0.5)
будет увеличиваться на 0,5
>>> numpy.arange(-4, 4, 0.5)
>>> [-4, -3.5, -3, -2.5, -2, -1.5, -1, -0.5, 0, 0.5, 1, 1.5, 2, 2.5, 3, 3.5, 4]
если вы хотите увеличить на меньшую величину и, следовательно, получить больший диапазон значений, то сделайте 0,5 меньше.
Вам нужно будет указать приращение, потому что в этом диапазоне, как указано ранее, есть бесконечные десятичные дроби.
После определения вашего списка вы можете перебирать свой список с помощью функции, чтобы найти корни.
for k in k_list:
some_function(k)
return root
РЕДАКТИРОВАТЬ:
Чтобы это работало, вам, конечно, понадобится функция, которая находит корень из k, однако, если я правильно понял ваш вопрос, это будет просто ваше линейное уравнение, если использовать простой пример: root = 2k
(математический способ написания этого, конечно, y=2x
,
Ради простоты давайте просто скажем, что ваша функция y=2x
в этот момент ваш сценарий станет
k_list = numpy.arange(-4, 4, 0.5)
for k in k_list:
root = 2*k
return root
А затем вы просто указываете свое собственное значение для 0,5, чтобы решить, какой десятичный ваш k
значения
Если, конечно, вы не смотрите на форму квадратичного. В этом случае мы можем иметь что-то вроде
y = x^2 - 2x +2
Это делает ваш вопрос немного более запутанным. Вы, очевидно, найдете корень х, установив y=0
однако теперь у вас есть одна переменная, которую я представляю себе, что вы подразумеваете под k, которую вы указываете, оставляя сумму, а не формулу.
В этом случае я бы позволил y=k
а затем укажите свой k
цени и реши найти свой корень.
например:
y = 32x^2 - 7.2x + 12
let y = k
k = 32x^2 - 7.2x +12
let k = -4 (we'd iterate through your range in reality)
4 = 32x^2 - 7.2x + 12
0 = 32x^2 - 7.2x + 8
and solve for x (aka. root)
Я ожидаю, что есть numpy
или же scipy
метод для решения формул с несколькими экземплярами одной и той же переменной. Я не являюсь экспертом ни в одной из библиотек, поэтому я не смогу проконсультировать вас в этом направлении.
Смотрите также: http://docs.scipy.org/doc/numpy/reference/generated/numpy.roots.html http://docs.scipy.org/doc/numpy/reference/generated/numpy.polyval.html