尝试求解线性方程组,其中我的输出之一是未知的,但我知道它需要最大化

Attempting to solve a system of linear equations, where one of my outputs is unknown but I do know it needs to be maximized

我正在尝试求解一组线性方程。我有五个随机分配的变量,总和为 1。我将这些变量按行应用于矩阵(即 Ax = B)但是,需要注意的是,我的 B 变量之一需要最大化,但要遵守约束条件我的其余 B 变量为 0。我的数据如下:

import pandas as pd 

A =  [[0.031982, 0.02606, 0.055933, 0.004529, 0.064116],
     [-0.000167, 0.181031, 0.145465, 0.120430, 0.114093],
     [0.627812, 0.254377, 0.138211, 0.41156, -0.000801],
     [-0.228139, 0.377169, 0.085415, 0.008888, -0.020791],
    [-0.067697, -0.114113, 0.089583, 0.100222, -0.005291]]

B = [[maximized],
     [0],
     [0],
     [0],
     [0]]

x = [x1, x2, x3, x4, x5]

注意:'maximized'是我试图最大化的值

到目前为止我做了什么:

import numpy as np

ABC=[]
A = DataFrame(A)
N=1000 #my attempt at maximizing by repeating the sequence N times and taking the largest value that results
for i in range(N):
     x = np.random.rand(5) #creating random variables
     x/= np.sum(x) #so that they sum to one
     x=x*A.T[0] #I apply the variables to my data. I want to maximize the sum of the first column, so I transpose and take a slice that I sum below
     x=x.sum()
     ABC.append(x)
ABC = DataFrame(ABC)
A2=ABC.sort_values(by=0,ascending=False).head(1) #I sort by largest first and take the highest value and store in a new dataframe
maximized=np.array(A2) #I convert the dataframe back into an array

B = [[maximized],[0],[0],[0],[0]]
X = np.linalg.inv(A).dot(B)
X

显然这有很多错误,并没有真正实现我想要的。我想要做的是 运行 一个最大化函数,它给我最大值并将该值输入到我的矩阵中。我真的不知道从这里去哪里,或者在这种情况下适用哪种最大化函数。如果有人有任何想法,那将不胜感激!

如果我没理解错的话,你有一个给定的矩阵A。然后你想找到一个总和为 1 的正向量 x,这样如果 Ax = b 那么 b 是全零向量,除了第一个条目被最大化,而不是零。

A0为矩阵的第一行A,其余为Ar。然后我们可以将您的问题改写为:

Find vector x such that its entries are non-negative, sum to 1, where Ar x = b, b = 0 and maximizing A0 x.

这只是一个标准的线性规划实例(通过向 Ar 添加单个全一行和向 b 添加 1 条目来处理 'sum-to-1' 要求).

我认为这并不是真正的最大化问题。指定结果只有一个答案。如果我们的最大数是 c,那么 b = [[c,0,0,0,0]].T = c*[[1,0,0,0,0]].T 让我们将 b_ 设置为 [[1,0,0,0,0]].T 所以 b = c*b_

如果我们用 x_ = Ainv @ b_ 求解 A @ x_ = b_,我们会得到一个 x_ 矩阵,它仍然需要归一化以形成 x。如果len_x_ = np.linalg.norm(x_),那么:

A @ (c * x_) = (c * b_)   # multiplying `c` though
A @ (c * x_) = b          # substituting `b = c * b_`
c * x_ = x = x_ / len_x_  # therefore . . . 
c = 1 / len_x_
如果A是正定的,

c只能取一个值,因此x只能取一个值:

b_ = np.array([[1,0,0,0,0]])
x_ = np.linalg.inv(A).dot(b_)
c = 1 / np.linalg.norm(x_)
b = b_ * c
x = x_ * c

现在,如果 A 不是确定的(即它没有逆),它会变得 很多 更有趣。但我不确定这是否在范围内,因为您目前正在通过反转 A.

来解决