2015-12-17 5 views
0

мне нужна помощь с этим кодом:Входная функция для SciPy расчетов

import numpy 
import math 
from scipy.optimize import fmin_slsqp 

def f(x, sign=-1.0): 
    tmp = exec('(' + str(input()) + ')') 
    return tmp 

res = fmin_slsqp(f, [5, 5], iter = 10000) 
print(res) 

Я пытаюсь минимизировать функцию из пользовательского ввода. Пример функции: 20*x[0]**0.3*x[1]**0.4 - 2*x[0] - 3*x[1]. Но что-то пошло не так, и я получаю TypeError: unsupported operand type(s) for -: 'NoneType' and 'NoneType' Я потратил много времени, чтобы заставить его работать, но не могу решить эту проблему. Что я делаю неправильно?

ответ

0

execNone. Используйте eval. Используйте eval.

И input возвращает строку; Вам не нужно преобразовывать его в строку:

def f(x, sign=-1.0): 
    return eval('(' + input() + ')') 
+0

Ну, eval работает, спасибо большое! Но тогда у меня есть еще одна ошибка: 'не удалось преобразовать 8-й аргумент g из _slsqp.slsqp в массив C/Fortran'. Это похоже на ошибку scipy модуля, и у нее нет решения. Ничто не меняется от разных представлений функций. Так что scipy не полезен? – Mental

+0

Есть вероятность, что '('+ input() +')' не вернет скаляр (требуется slsqp. Попробуйте с помощью 'return eval (input())' –

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