2015-06-04 4 views
2

Перед тем, как войти в мою проблему, я искал соответствующие темы на StackOverflow с той же проблемой:Python SciPy fsolve «несоответствие между входным и выходным формой„Func“аргумент»

Из того, что я понимаю читать об этой ошибке,

raise TypeError(msg)
TypeError: fsolve: there is a mismatch between the input and output shape of the 'func' argument 'fsolve_function'

Вопрос заключается в том, что форма ввода и вывода являются не то же самое.

В моем примере кода ниже, я следующее:

  • вход, initialGuess (исходная оценка для использования в fsolve функции в scipy.optimize). Вход, initialGuess имеет 3 стартовых оценки для координат x, y и z. Поэтому я ожидаю, что моя начальная исходная оценка будет всегда иметь три входа.
  • выход, out (нелинейные уравнения одновременного действия). В этом примере у меня есть 4 нелинейных уравнения.
  • scipy.optimize.fsolve вызывает ошибку, отмеченную выше, потому что вход и выход не имеют одинаковую форму. В моем конкретном случае я хочу, чтобы у моего ввода всегда было три значения (чтобы угадать начальные начальные точки x, y и z). Выход в этом случае имеет 4 нелинейных уравнения для решения с использованием начальной оценки ввода.
  • Сторона примечания: использование той же формы ввода и вывода, например. входной формы 3 [x, y, z] и вывода 3 нелинейных уравнений, fsolve будет делать расчет соответствующим образом. Мне просто интересно, как вы можете расширить fsolve, чтобы использовать, скажем, равные или более 4 нелинейных синхронных уравнений с тремя исходными оценками ввода?
  • код ниже:

    from scipy.optimize import fsolve 
    
    def fsolve_function(arguments): 
        x = arguments[0] 
        y = arguments[1] 
        z = arguments[2] 
    
        out = [(35.85 - x)**2 + (93.23 - y)**2 + (-39.50 - z)**2 - 15**2] 
        out.append((42.1 - x)**2 + (81.68 - y)**2 + (-14.64 - z)**2 - 27**2) 
        out.append((-70.90 - x)**2 + (-55.94 - y)**2 + (-68.62 - z)**2 - 170**2) 
        out.append((-118.69 - x)**2 + (-159.80 - y)**2 + (-39.29 - z)**2 - 277**2) 
    
        return out 
    
    initialGuess = [35, 93, -39] 
    result = fsolve(fsolve_function, initialGuess) 
    print result 
    

ответ

4

fsolve является оберткой MINPACK-х hybrd, который требует аргумент и функция вывода имеют одинаковое количество элементов. Вы можете попробовать другие алгоритмы из более общего scipy.optimize.root, которые не имеют этого ограничения (например, lm):

from scipy.optimize import fsolve, root 

def fsolve_function(arguments): 
    x = arguments[0] 
    y = arguments[1] 
    z = arguments[2] 

    out = [(35.85 - x)**2 + (93.23 - y)**2 + (-39.50 - z)**2 - 15**2] 
    out.append((42.1 - x)**2 + (81.68 - y)**2 + (-14.64 - z)**2 - 27**2) 
    out.append((-70.90 - x)**2 + (-55.94 - y)**2 + (-68.62 - z)**2 - 170**2) 
    out.append((-118.69 - x)**2 + (-159.80 - y)**2 + (-39.29 - z)**2 - 277**2) 

    return out 

initialGuess = [35, 93, -39] 
result = root(fsolve_function, initialGuess, method='lm') 
print(result.x) 

Кстати, он не может найти фактический ноль --- это там должен быть один на всех?

Вы также можете заставить fsolve использовать функцию, если поставить его первоначальное предположение с «фиктивной» четвертой переменной:

initialGuess = [35, 93, -39, 0] 

, но я не уверен, насколько надежны результаты в этом случае.

+0

Спасибо за ответ. Я ожидаю решения, которые будут иметь некоторую ошибку в ответе, но в пределах допустимого порога. –

+0

По умолчанию 'root' использует' method = 'hybr'' и, следовательно, генерирует ту же ошибку, что и 'fsolve'. Но это позволяет вам указать другие методы, которые этого не делают (как я иллюстрировал). Что касается ошибки - вы уверены, что есть корень? Может быть, вам нужно искать минимум (используя соответствующую функцию)? – fjarri

+0

Строка 'result = root (fsolve_function, initialGuess, method = 'lm')' работает. Мне нужно было добавить конкретный метод, который был 'lm'. Еще раз спасибо, я думаю, это решает мой вопрос. –

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