У меня есть несколько векторов размерности (1х44) (вектора a1, a2, a3 ..., a_k). В дальнейшем буду говорить что n=44
Также у меня есть вектор b такой же размерности (1хn)
Я хочу построить линейную комбинацию векторов, которая будет ближе всего к b.
То есть c1a1+c2a2+c3a3 + ... + c_n*a_n должно быть как можно ближе к b
И в общем случае это решается построением СЛАУ и решением ее, но есть проблемы:
1) k необязательно равно n
2) Векторы необязательно линейно независимы между собой
3) Самое главное условие - c1>0, c2>0, c3>0
Я пробовал ввести функцию (|c1a1+c2a2+...+c_n*a_n - b|)^2 и найти ее минимум следующим образом:
def target_function(x):
q = np.matmul(A, abs(x)) - b #A - это матрица из векторов a_i
return np.linalg.norm(q)**2
result=scipy.optimize.minimize(target_function, np.ones((1,44))*100)
Однако мне выдается ошибка
message: Desired error not necessarily achieved due to precision loss.
success: False
status: 2
fun: 2957333486771.303
x: [ 2.132e+01 1.000e+02 ... 1.611e+02 5.252e+01]
nit: 7
jac: [ 2.172e+09 0.000e+00 ... 7.294e+07 1.483e+08]
hess_inv: [[ 1.001e+00 0.000e+00 ... -1.260e-01 -6.809e-02]
[ 0.000e+00 1.000e+00 ... 0.000e+00 0.000e+00]
...
[-1.260e-01 0.000e+00 ... 1.159e+00 5.356e-02]
[-6.809e-02 0.000e+00 ... 5.356e-02 8.509e-01]]
nfev: 4238
njev: 94
Не знаю, что делать. Может есть варианты попроще, чем я придумал?