Решите нелинейное уравнение на Python

#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 .