#python #nonlinear-optimization #scipy-optimize
Вопрос:
У меня есть матрица A 11*11 и вектор b длиной 11. Я попытался найти значения 11 неизвестных, используя линейную систему уравнений, которая
z= np.linalg.lstsq(A,b)
Который возвращает мне значение 11 неизвестных факторов, поэтому я получаю вектор с 11 значениями. Теперь, если я добавлю все эти значения, это даст мне значение равенства.
так, например
3x 4y = 19
2x 2y = 23
Я могу получить значения x и y, которые удовлетворяют приведенному выше уравнению
Но мне нужна формулировка, в которой произведение значений на LHS должно давать значение равенства RHS.
3x*4y = 19
2x*2y = 23
Поэтому мне нужно что-то в python, что может вернуть мне значение для x и y, когда они являются мультипликативной системой, а не аддитивной системой.
Достижимо ли это в python?
Комментарии:
1. Я не совсем уверен, является ли это проблемой для вашего варианта использования, но с чисто математической точки зрения мультипликативные уравнения не имеют уникальных решений
x
иy
таким же образом, как и два аддитивных. Они могут быть переформулированы вx*y = 19/12
иx*y = 23/4
, соответственно. Таким образом, они будут либо противоречить друг другу, либо уступатьx = c/y
какой-то константеc
.2. @Ханс На самом деле, у меня есть матрица A 11*11 и вектор b длиной 11. Я попытался найти значения 11 неизвестных, используя z = (A^-1)(b). Который возвращает мне значение 11 неизвестных факторов, поэтому я получаю вектор с 11 значениями. Теперь, если я добавлю все эти значения, это даст мне значение равенства. Но мне нужна формулировка, в которой произведение значений на LHS должно давать значение равенства RHS. Я не знаю, как сформулировать это как продукт факторов
Ответ №1:
Вы можете записать левую часть вашей системы как np.prod(A*z, axis=1)
, где A = np.array([[3, 4],[2, 2]])
и z = [x, y]
. Однако для вашей примерной системы нет решения. Единственный случай, который я вижу, когда у него есть решение, — это когда все значения в массиве np.prod(A, axis=1) / rhs
одинаковы.
В этом случае вы можете решить ее численно с помощью scipy.optimize.root
:
from scipy.optimize import root
# note that np.prod(A, axis=1) / rhs = [1, 1]
A = np.array([[3, 4],[2, 2]])
rhs = np.array([12, 4])
def Eq(z):
return np.prod(A*z, axis=1) - rhs
result = root(Eq, x0=np.ones(2))
где result.x
содержится решение. Обратите внимание, что решение не гарантируется уникальным и будет зависеть от начальной точки x0
.