Dada uma matriz A, na qual alguns dos elementos são funções de x, encontre x tal que det(A) = 0.
Comecei com uma matriz diagonal 5x5, mostrada no código. A função raiz na verdade deu a raiz correta (x = 1,562), mas com
DeprecationWarning: A conversão de uma matriz com ndim> 0 em um escalar está obsoleta e apresentará erros no futuro. Certifique-se de extrair um único elemento de sua matriz antes de executar esta operação.
def test(x):
A = np.zeros((5,5))
for i in range(5):
A[i,i] = x**2-4+x
return np.linalg.det(A)
root(test, 3)
No entanto, se quisermos apenas o determinante, correr test(3)
está perfeitamente bem. Não tenho ideia de como esse aviso surge e como evitá-lo. Suponho que possa haver algo a ver com a função de localização de raiz, mas não tenho certeza de como exatamente. Receio que quando o tamanho da matriz ficar muito grande, ela não encontrará a raiz verdadeira. Alguém já teve problemas semelhantes? Qualquer conselho será apreciado.
Se você olhar o código-fonte do root, verá que ele chama
_root_hybr
se nenhum método for fornecido. Indo para_root_hybr
podemos ver que existe esta linha :Isso converte sua entrada
x0
em3
um array,array([3])
então agora sua entradatest
é um arrayndim=1
em vez do escalar que você forneceu. Portanto, quando você calcula,x**2-4+x
isso também é uma matriz,ndim=1
e não o escalar que você poderia esperar. O aviso afirma que a configuração de um elemento de uma matriz com uma matriz com ndim> 0 está obsoleta, portanto não funcionará no futuro. Para evitar o aviso e o erro futuro, dentro de sua função você precisa converterx
de volta para o valor escalar que sua função espera, o que você pode fazer comx = x.item()
.