我现在有这样一段代码def QR(A): Q = np.zeros((10, 10)) R = np.zeros((10, 10)) for j in range(10): v = A[:, j] for i in range(j): R[i, j] = np.dot(Q[:, i], A[:, j]) v = v - R[i, j] * Q[:, i] R[j, j] = np.linalg.norm(v) Q[:, j] = v / R[j, j] for i in range(10): for j in range(10): Q[i,j]=Q[j,i] #faire la transposition b = sp.Matrix(sp.symbols('a1:11')) b = Q @ sp.Matrix(b) x = sp.zeros(10, 1) for i in range(9, -1, -1): x[i] = b[i] for j in range(i+1, 10): x[i] -= R[i, j] * x[j] x[i] /= R[i, i] coeff_matrix = sp.Matrix(np.zeros((10, 10))) for i in range(10): for j in range(10): coeff_matrix[i, j] = x[i].coeff(sp.Symbol('a{}'.format(j + 1))) return(coeff_matrix) 来求A的逆矩阵,但是因为这里用到的QR分解的方法精度不够的问题,求出来的逆矩阵也不对。我想要用一种精度更高的方法来做QR分解,但是不使用numpy自带的qr库
时间: 2024-02-28 18:55:51 浏览: 66
python中numpy.zeros(np.zeros)的使用方法
5星 · 资源好评率100%
如果你不想使用numpy自带的qr库,可以使用Householder变换实现QR分解来提高精度。下面是使用Householder变换实现QR分解的代码:
```python
import numpy as np
def householder(a):
"""计算Householder矩阵"""
n = len(a)
v = np.zeros(n)
v[0] = np.linalg.norm(a)
if a[0] < 0:
v[0] = -v[0]
v = v + a
v = v / np.linalg.norm(v)
H = np.eye(n) - 2 * np.outer(v, v)
return H
def qr_factorization(A):
"""使用Householder变换实现QR分解"""
m, n = A.shape
Q = np.eye(m)
R = A.copy()
for j in range(min(m, n)):
a = R[j:, j]
H = np.eye(m)
H[j:, j:] = householder(a)
Q = Q @ H.T
R = H @ R
return Q, R
def QR(A):
Q, R = qr_factorization(A)
b = sp.Matrix(sp.symbols('a1:11'))
b = Q @ sp.Matrix(b)
x = sp.zeros(10, 1)
for i in range(9, -1, -1):
x[i] = b[i]
for j in range(i+1, 10):
x[i] -= R[i, j] * x[j]
x[i] /= R[i, i]
coeff_matrix = sp.Matrix(np.zeros((10, 10)))
for i in range(10):
for j in range(10):
coeff_matrix[i, j] = x[i].coeff(sp.Symbol('a{}'.format(j + 1)))
return coeff_matrix
```
这里的`qr_factorization`函数使用了Householder变换实现QR分解。对于一个列向量$a$,我们可以通过计算一个Householder矩阵$H$来将其变换为下面的形式:
$$
\begin{pmatrix}
\ast \\ 0 \\ 0 \\ \vdots \\ 0
\end{pmatrix}
$$
其中$\ast$表示任意非零数。而Householder矩阵可以表示为:
$$
H=I-2vv^T
$$
其中$v$为一个单位向量,可以通过下面的公式计算:
$$
v=\frac{a-\text{sign}(a_1)\|a\|e_1}{\|a-\text{sign}(a_1)\|a\|e_1\|}
$$
其中$\text{sign}(a_1)$表示$a_1$的符号,$e_1$为第一个单位向量。通过计算每一列对应的Householder矩阵,我们可以将$A$变换为上三角矩阵$R$,同时得到一个正交矩阵$Q$,使得$A=QR$。
最后的求解逆矩阵的方法和之前一样,只是QR分解的方法变成了使用Householder变换的QR分解。
阅读全文