Eu estava tentando executar casos de teste para CG e preciso gerar:
- matrizes definidas positivas simétricas
- de tamanho> 10.000
- DENSA COMPLETA
Usando apenas índices de matriz e, se necessário, 1 vetor (Como )
Com número de condição menor que 1000.
Eu tentei:
Gerando matrizes aleatórias usando
A=rand(N,N)
e, em seguida,A'A
para torná-lo Sym. PD. [Isso aumenta o número da condição]Usando o vetor appraoch como mostrado, mas não consigo obter uma função
(x,i,j)
que garanta o Sym e o PD.
Depois de muita experimentação, criei:
a(it,jt) = (vec(it)+vec(jt))/((it-1)^2+(jt-1)^2);
Se
a(it,it) = x(it)
se
Mas isso é PD até cerca de 500x500.
- XLATMR . [Com toda a classificação e redimensionamento, é muito difícil de entender. Especialmente porque eu não consigo entender a álgebra linear subjacente]
Alguém pode me dar uma função em x (vetor) ei, j (índices) que atenda aos requisitos acima?
linear-algebra
Inquérito
fonte
fonte
a+N*eye(N,N)
garantirá que funcionará para todos os valores além de 5000? Você pode converter seu comentário em uma resposta?Respostas:
Para obter uma matriz definida positiva densa com o número de condição barato, escolha uma matriz diagonal D cuja diagonal consiste em números de [ 1 , c ] (que serão os valores próprios), com 1 e c escolhido pelo menos uma vez e um vetor u . Em seguida, aplique uma transformação de similaridade, por meio de transformações de Householder, para formar a matriz A : = ( I - t u u T ) D ( I - t u u T ) , em que tc D [1,c] 1 c u A:=(I−tuuT)D(I−tuuT) .t=2/uTu
Para formar essa matriz com operações , calcule v : = D u , s : = t 2 u T v / 2 , w : = t v - s u em operações O ( n ) e, em seguida, A como A = D - u w T - w u T . (Se você escolher uO(n2) v:=Du s:=t2uTv/2 w:=tv−su O(n) A A=D−uwT−wuT u O(n)
fonte
1,-1,2,-2...50,-50
.Tente adicionar um número grande (na ordem da norma da matriz) às entradas diagonais da sua matriz. Isso equivale a adicionar a cada um dos seus autovalores e deve melhorar o número da condição reduzindo a diferença entre os autovalores maiores e menores. αα α
fonte
Eu não tenho certeza de como você faria isso com apenas um vetor, mas com dois vetores aleatórios e de tamanho , você pode produzir uma matriz semi-definida positiva via onde é uma rotação no plano dos eixos e .θ N L = Π i R i ( θ i )x θ N R i ( ⋅ ) i i + 1 mod N
Se você deseja melhorar o número da condição, pode adicionar um valor positivo fixo a e redimensionar, se necessário.x
fonte
Uma maneira totalmente diferente de fazer isso seria assim: considere um vetor aleatório , então é uma matriz de classificação um com autovalores iguais a zero e autovalor estritamente positivo igual a com vetor próprio . Também é simétrico.x A=xxT N−1 ∥x∥2 x
Para construir uma matriz SPD densa, adicione muitas dessas matrizes de classificação 1. Em outras palavras, se você possui vetores (por exemplo, vetores aleatórios), então é SPD se e se os vetores forem linearmente independentes (se eles não são linearmente independentes, então é semidefinido positivo). Você pode verificar se seus vetores (ou os primeiros vetores que você desenha do processo aleatório) são linearmente independentes usando a ortogonalização sucessiva de Gram-Schmidt, mas também é provável que você obtenha uma matriz SPD se simplesmente escolher vetoresx i A = M ∑ i = 1 x i x T i M ≥ N x i A M M ≥ N M ≫ NM xi
fonte