Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 12, 2016 19:54:14

Mechisla
Зарегистрирован: 2016-10-08
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Произвольная функция для работы с ней.

Добрый день! Есть такая задача:
Необходимо написать код для вычисления минимума функции произвольной размерности. Вопрос заключается в том, как можно сделать так, чтобы программа работала в режиме black box, т.е. я ввожу функцию, а она мне точку минимума. Основная проблема, как сделать, чтобы достаточно было только ввести функцию. Пример ввода такой x1^2 + 2x1+ x2^3 + 5x2^2…
Потом, чтобы получить возможность числено производную брать и т.п..
У кого какие идеи есть?

Отредактировано Mechisla (Ноя. 12, 2016 19:59:08)

Офлайн

#2 Ноя. 12, 2016 21:14:42

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2704
Репутация: +  182  -
Профиль   Отправить e-mail  

Произвольная функция для работы с ней.

Как-то так:

 def MIN(txt):
     foo = lambda x: eval(txt)
     return min( foo(x) for x in xrange(-200, 200) ) 
>>> MIN("x**2+x**3+5*x**2") 
-7760000



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Отредактировано Rodegast (Ноя. 12, 2016 21:16:46)

Онлайн

#3 Ноя. 12, 2016 21:35:32

Mechisla
Зарегистрирован: 2016-10-08
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Произвольная функция для работы с ней.

Rodegast
Как-то так:
Размерность функции любая, т.е. переменных в ней может быть и 3, и 10, и так далее.
f = f(x1, x2, x3…)
А нужна функция, так как необходимо реализовать метод Ньютона.

Может можно реализовать подобным образом
 function = str(input())
.
.
.
Я не знаю, как можно сделать так, чтобы создать функцию с переменным количеством аргументов, точнее знаю, что можно использовать **kwargs. Но не получится получить return ax1^t + bx2^3 ….
Может не знаю что-то. Еще опыта не так много.

Отредактировано Mechisla (Ноя. 12, 2016 21:41:19)

Офлайн

#4 Ноя. 13, 2016 00:43:34

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Произвольная функция для работы с ней.

Mechisla
Этим хорошо занимается модуль simpy



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#5 Ноя. 13, 2016 02:49:04

scidam
Зарегистрирован: 2016-06-15
Сообщения: 288
Репутация: +  35  -
Профиль   Отправить e-mail  

Произвольная функция для работы с ней.

Если это упражнение, то все-таки нужно конкретизировать возможный вид функции многих переменных. Если она полиномиального типа, как у вас указано в примере ввода, то здесь SimPy (как правильно указал John_16); С помощью этого пакета производную можно взять символьно, найти все критические точки и найти ту, в которой функция минимальна. Но это, если вид f простой, как вы указали, а то можно легко наткнуться на ситуации, когда df/dx_j = 0 не решатся символьно, да и численно могут быть проблемы.
Если это задача реальная, то можно посмотреть в сторону пакета SciPy раздел оптимизация, здесь есть много методов численного поиска локальных и глобальных минимумов…

Офлайн

#6 Ноя. 14, 2016 19:29:02

Mechisla
Зарегистрирован: 2016-10-08
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Произвольная функция для работы с ней.

scidam
Если это упражнение, то все-таки нужно конкретизировать возможный вид функции многих переменных. Если она полиномиального типа, как у вас указано в примере ввода, то здесь SimPy (как правильно указал John_16); С помощью этого пакета производную можно взять символьно, найти все критические точки и найти ту, в которой функция минимальна. Но это, если вид f простой, как вы указали, а то можно легко наткнуться на ситуации, когда df/dx_j = 0 не решатся символьно, да и численно могут быть проблемы.Если это задача реальная, то можно посмотреть в сторону пакета SciPy раздел оптимизация, здесь есть много методов численного поиска локальных и глобальных минимумов…


К сожалению подобные пакеты нельзя использовать в данной задаче. Нужно написать численный метод самому. Если бы можно было пользоваться такими модулями, тогда я бы не задал такой вопрос. А вопрос конкретный, можно ли как-то преобразовать введенную информацию типа string в функцию. Например приведу на скорую руку кусок кода, который планировал писать, ну или что-то подобное.
 import numpy as np
A = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '+', '-', '^']
func = str(input('function: '))
step = 0
key = []
step = 0 
for i in range(len(func)):
    if func[i] == 'x':
        step += 1
        key.append('x' + str(step+1))  
key = A + key
.
.
.

Но к сожалению не получается создать такую функцию:
 def example(x1, x2, x3, ...)

Если изначально не знаю сколько будет переменных, а возвращать она должна вот по такому принципу:
Если мы вводим, например: 'x1^2 + x2^3 + 15x3, тогда

  return x1**2 + x2**3 + 15*x3 

А дальше соответственно я бы мог делать все, что угодно, так как x1, x2, x3 это переменные

Отредактировано Mechisla (Ноя. 14, 2016 19:32:00)

Офлайн

#7 Ноя. 15, 2016 02:37:23

scidam
Зарегистрирован: 2016-06-15
Сообщения: 288
Репутация: +  35  -
Профиль   Отправить e-mail  

Произвольная функция для работы с ней.

Для динамического создания функций попробуйте следующий варинат:

 import ast
def func(strf):
   root = ast.parse(strf)
   names = sorted({node.id for node in ast.walk(root) if isinstance(node, ast.Name)})
   kwargs = {k:0 for k in names}
   _d = {'kwargs': kwargs, '_s':strf}
   exec('''def newf(**kwargs): 
               for k in kwargs:
                   locals()[k]=kwargs[k]
               return eval(_s)''',_d)
   return _d['newf']
g=func('x1*2+x2+x1**7') 
print(g(x1=1,x2=4))

Не могу сказать, что самый оптимальный, возможно реализовать иначе можно. Можно использовать и регулярные выражения для выделения используемых переменных, если имена переменных и структура выражения “не очень сложные”.

Офлайн

#8 Ноя. 15, 2016 17:07:29

Mechisla
Зарегистрирован: 2016-10-08
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Произвольная функция для работы с ней.

scidam
Для динамического создания функций попробуйте следующий варинат:
Спасибо, это мне очень поможет.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version