Форум сайта python.su
Добрый день! Есть такая задача:
Необходимо написать код для вычисления минимума функции произвольной размерности. Вопрос заключается в том, как можно сделать так, чтобы программа работала в режиме black box, т.е. я ввожу функцию, а она мне точку минимума. Основная проблема, как сделать, чтобы достаточно было только ввести функцию. Пример ввода такой x1^2 + 2x1+ x2^3 + 5x2^2…
Потом, чтобы получить возможность числено производную брать и т.п..
У кого какие идеи есть?
Отредактировано Mechisla (Ноя. 12, 2016 19:59:08)
Офлайн
Как-то так:
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)
Онлайн
RodegastРазмерность функции любая, т.е. переменных в ней может быть и 3, и 10, и так далее.
Как-то так:
function = str(input()) . . .
Отредактировано Mechisla (Ноя. 12, 2016 21:41:19)
Офлайн
Mechisla
Этим хорошо занимается модуль simpy
Офлайн
Если это упражнение, то все-таки нужно конкретизировать возможный вид функции многих переменных. Если она полиномиального типа, как у вас указано в примере ввода, то здесь SimPy (как правильно указал John_16); С помощью этого пакета производную можно взять символьно, найти все критические точки и найти ту, в которой функция минимальна. Но это, если вид f простой, как вы указали, а то можно легко наткнуться на ситуации, когда df/dx_j = 0 не решатся символьно, да и численно могут быть проблемы.
Если это задача реальная, то можно посмотреть в сторону пакета SciPy раздел оптимизация, здесь есть много методов численного поиска локальных и глобальных минимумов…
Офлайн
scidam
Если это упражнение, то все-таки нужно конкретизировать возможный вид функции многих переменных. Если она полиномиального типа, как у вас указано в примере ввода, то здесь SimPy (как правильно указал John_16); С помощью этого пакета производную можно взять символьно, найти все критические точки и найти ту, в которой функция минимальна. Но это, если вид f простой, как вы указали, а то можно легко наткнуться на ситуации, когда df/dx_j = 0 не решатся символьно, да и численно могут быть проблемы.Если это задача реальная, то можно посмотреть в сторону пакета SciPy раздел оптимизация, здесь есть много методов численного поиска локальных и глобальных минимумов…
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, ...)
return x1**2 + x2**3 + 15*x3
Отредактировано Mechisla (Ноя. 14, 2016 19:32:00)
Офлайн
Для динамического создания функций попробуйте следующий варинат:
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))
Офлайн
scidamСпасибо, это мне очень поможет.
Для динамического создания функций попробуйте следующий варинат:
Офлайн