Ax=b,用python求解A,没有唯一解

问题描述 投票:0回答:1

我正在尝试求解

Ax=b
形式的线性方程组,其中
A
是未知的方阵,而向量
x
b
是已知的。我对一个物理问题感兴趣,其中我的
A
是酉矩阵,它将随机单位向量
x
旋转为
b
,其形式为 [1,0,0...0]。人们无法找到
A
的唯一解决方案。我只需要众多可能的解决方案之一。 因为我想将其缩放到更大的尺寸,所以我希望计算机能够解决它。

我尝试遵循此链接中问题的答案,但

A
并不统一。

我正在考虑使用 cvxpy 来给我一个解决方案,我编写了一个代码,首先将维度设置为 3。不知道在没有唯一解的情况下cvxpy是否合适。代码如下。它在约束部分给出一个错误,指出“给定 0 维数组。数组必须至少是二维”。我认为我拥有的是 cvxpy 中矩阵的有效表示。我很高兴被纠正。

有人可以帮我解决这个问题吗?如果你有其他方法也可以。

import numpy as np
import cvxpy as cp
n = 3
alpha=0.01
np.random.seed(1)
b= [1,0,0]
x = np.random.randn(n)+1j*np.random.randn(n)
x=x/np.linalg.norm(x)


#Construct the problem.
A = cp.Variable((n,n),complex=True)
objective = cp.Minimize(cp.sum_squares(A @ x - b))
constraints = [A.H==np.linalg.inv(A)]
prob = cp.Problem(objective, constraints)

# The optimal objective value is returned by `prob.solve()`.
result = prob.solve()
print(A.value)

追溯:

Traceback (most recent call last):
    File "/Users/sreerampg/untitled1.py", line 22, in <module>     constraints = [A.H==np.linalg.inv(A)]
    File "<__array_function__ internals>", line 6, in inv    File "/Applications/anaconda3/lib/python3.7/site-packages/numpy/linalg/linalg.py", line 539, in inv     _assert_stacked_2d(a)
    File "/Applications/anaconda3/lib/python3.7/site-packages/numpy/linalg/linalg.py", line 197, in _assert_stacked_2d     
    'at least two-dimensional' % a.ndim)  LinAlgError: 0-dimensional array given. Array must be at least two-dimensional
python linear-algebra cvxpy linear-equation
1个回答
0
投票

看来你可以通过分析来解决这个问题,因为你正在寻找轮换。在 3 维中,您可以通过计算

a
b
之间的角度以及垂直于两者的向量来直接构建旋转矩阵:

import numpy as np
from scipy.spatial.transform import Rotation

def find_rot(a, b):
    a /= np.linalg.norm(a)
    b /= np.linalg.norm(b)
    angle = np.arccos(np.dot(a, b))
    vec = np.cross(a, b)
    return Rotation.from_rotvec(vec * angle / np.linalg.norm(vec))

a = np.random.rand(3)
b = np.array([1., 0., 0.])
rot = find_rot(a, b)
print(a, b, rot.apply(a), rot.as_matrix(), sep='\n')

在更高的维度中,它并不那么直接,因为你不能只使用叉积,尽管可能有一种方法可以使用外部积来概括上述内容,为此我需要更多地温习我的线性代数技能。

除此之外,您可以构造一系列“高维旋转矩阵”,连续将每个维度归零,其形式为:

[1 . . . . 
 . 1 
 .   1
 .     . 
 .       cosT -sinT
 .       sinT cosT]

其中 T 是向量

a
和单位向量
[0, 0, ...., 1, 0]
之间的角度 theta,然后重复向下移动一暗点。本质上,您每次从每个维度“旋转”出一个向量,然后将它们全部相乘以获得最终的酉矩阵。

© www.soinside.com 2019 - 2024. All rights reserved.