Чтобы использовать fsolve
, вам нужна
Функция, которая принимает хотя бы один (возможно, векторный) аргумент и возвращает значение изодинаковая длина .
Итак, число уравнений должно быть равно числу неизвестных.Если у вас есть функция, которая принимает аналогичные входные данные, за исключением того, что одна из входных переменных известна, то оберните ее в другую функцию, например:
def f(a, b, c, d):
return [a-b, b-c, c-d]
def func(p):
a, b, d = p
c = 0.5
return f(a, b, c, d)
Здесь func
подходит для использования в fsolve
, например
fsolve(func, [0, 0, 0]) # returns [0.5, 0.5, 0.5]
Количество неизвестных, отличное от числа уравнений
Если в математических задачах больше (или меньше) неизвестных, чем уравнений, то fsolve
использовать нельзя,Тогда я использовал бы инструмент least_squares
, который минимизирует сумму квадратов func
.
def func(p):
a, b, c, d = p
return [a-b, b-c, c-d]
least_squares(func, [3, 2, 5, 1])
Это находит решение задачи наименьших квадратов как [2.75, 2.75, 2.75, 2.75]
.Он также возвращает стоимость, которая, будучи почти нулевой, говорит нам, что func
действительно превращается в ноль в найденной точке.Это решение не является уникальным.