2014-09-01 3 views
-2

У меня есть очень сложная положительно определенная линейная непрерывная функция одной переменной k, для которой я пытаюсь найти все корни в заданном диапазоне k; -4 < k < 4.Поиск численного корня для положительно определенной функции в Python

До сих пор я впервые оценил минимумы функции, выполнив поиск точек k_j, где и $k_{j+1}>k_j$, и $k_{j-1}>k_j$. Затем, используя каждую из этих точек в качестве отправной точки, я применяю функцию оптимизации, scipy.optimize.newton. В какой-то степени этот метод сработал. Однако, поскольку мои функции усложняются, поиск минимумов становится все более и более трудоемким и, возможно, неточным.

Есть ли встроенная функция в numpy или scipy, которая ищет в заданном домене (например, -4 < k < 4) функции и находит все корни. Я готов пожертвовать некоторой вычислительной эффективностью, так что мне не нужно указывать точные точки для поиска поблизости.

Благодаря

+1

очень сложная линейная функция одной переменной? если это не сообщение тролля, вам придется немного объяснить себя. –

+0

Если вы дали мне функцию, я могу расширить свой ответ, чтобы сделать ее лучше. –

ответ

0

Вы можете использовать диапазон:

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 

EDIT:

Для этой работы вы, конечно, нужна функция, которая находит корень к, однако, если я понял ваш вопрос правильно, это должно быть просто ваш линейное уравнение, чтобы использовать простой пример:. 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 

Это делает ваш вопрос несколько более запутанным. Вы, очевидно, нашли корень x, установив 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#numpy.polyval

+0

Хотя ваше усилие в написании этого сообщения похвально, я не думаю, что это подходящее место или формат, чтобы изобретать поле численной оптимизации с нуля. –

+0

Мое намерение состояло в том, чтобы не изобретать численную оптимизацию (в то время как по теме это действительно место, где численная оптимизация вообще?). Как вы упомянули в своем комментарии к вопросу «очень сложная линейная функция одной переменной» не так много. Все, с чем мне пришлось работать, - это диапазон, который он дал. То, что я пытался сделать, это предоставить OP инструменты для создания диапазона, прокрутить его и найти корни. С учетом данной информации было трудно сказать «Это код, чтобы найти корни в этом диапазоне для этой формулы». Я понимаю, что вы говорите. –

Смежные вопросы