Перед тем, как войти в мою проблему, я искал соответствующие темы на StackOverflow с той же проблемой:Python SciPy fsolve «несоответствие между входным и выходным формой„Func“аргумент»
- input/output error in scipy.optimize.fsolve
- Python fsolve() complains about shape. Why?
- fsolve - mismatch between input and output
- I/O shape mismatch when using scipy.optimize.fsolve on 2-dimensional anonymous function array variable
Из того, что я понимаю читать об этой ошибке,
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
Спасибо за ответ. Я ожидаю решения, которые будут иметь некоторую ошибку в ответе, но в пределах допустимого порога. –
По умолчанию 'root' использует' method = 'hybr'' и, следовательно, генерирует ту же ошибку, что и 'fsolve'. Но это позволяет вам указать другие методы, которые этого не делают (как я иллюстрировал). Что касается ошибки - вы уверены, что есть корень? Может быть, вам нужно искать минимум (используя соответствующую функцию)? – fjarri
Строка 'result = root (fsolve_function, initialGuess, method = 'lm')' работает. Мне нужно было добавить конкретный метод, который был 'lm'. Еще раз спасибо, я думаю, это решает мой вопрос. –