UTNianos

Versión completa: Problema de Matlab
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Buenas, tengo un tema con un pedacito de codigo en matlab.
Necesito calcular autovalores y autovectores de mas o menos 20 matrices (en realidad es una matriz fija (simbolica) y el producto de cada una de sus componentes por las componentes de un vector que es de norma fija y va haciendo un barrido de 0 a 2pi).. El tema es que para esto lo que veo mas conveniente es guardar todos los resultados en una matriz tridimensional que guarde todos los resultados en matrices separadas. Pero aparece el error cuando hago la siguiente asignacion:


Autovectores(:,:,i) = R; (R es la matriz de autovectores).


Cita:The following error occurred converting from sym to double:
DOUBLE cannot convert the input expression into a double array.

Error in Untitled (line 39)
Autovectores(:,:,i) = R;

alguien tiene idea como puedo solucionar este error? la unica que se me ocurre es calcular los autovectores a mano, armar 20 matrices de 2 dimensiones (porque el error lo hace aparecer ese "(:,:,i)", si la asignacion la hago solo con una matriz de 2 dimensiones no aparece ese error.
Hola Maik. ¿Podés poner el código? Tuve un problema así en algún momento, pero no recuerdo cómo lo solucioné.
Cita:% Inicializacion de variables.
syms C densidad velocidad Autovectores

C=[ sym('C11') sym('C12') sym('C13') sym(0) sym(0) sym(0) ;
sym('C21') sym('C22') sym('C23') sym(0) sym(0) sym(0) ;
sym('C31') sym('C32') sym('C33') sym(0) sym(0) sym(0) ;
sym(0) sym(0) sym(0) sym('C44') sym(0) sym(0) ;
sym(0) sym(0) sym(0) sym(0) sym('C55') sym(0) ;
sym(0) sym(0) sym(0) sym(0) sym(0) sym('C66') ];
%Arreglo tridimensional para manejar todos los valores de los 360º para las
%3 velocidades encontradas.
Autovectores=zeros(3,3,20)
Autovalores=zeros(3,3,20);
angulo=0;
i=0;

l1 = sin(degtorad(angulo)); %prefiero trabajar el angulo en grados y no en radianes
l2 = 0;
l3 = cos(degtorad(angulo));
L=[ l1 , l2 , l3];

for i=1:5
l1 = sin(degtorad(angulo));
l2 = 0;
l3 = cos(degtorad(angulo));
L=[ l1 , l2 , l3];

R=[ C(1,1)*l1^2+C(6,6)*l2^2+C(5,5)*l3^2 (C(1,2)+C(6,6))*l1*l2 (C(1,3)+C(5,5))*l1*l3
(C(1,2)+C(6,6))*l1*l2 C(6,6)*l1^2+C(2,2)*l2^2+C(4,4)*l3^2 (C(4,4)+C(2,3))*l2*l3
(C(1,3)+C(5,5))*l1*l3 (C(4,4)+C(2,3))*l2*l3 C(5,5)*l1^2+C(4,4)*l2^2+C(3,3)*l3^2];
J = R-eye(3)*(densidad*velocidad^2);
end


%angulo = angulo+tanto;
%end
[D,R]= eig(J);
Autovalores(:,:,i) = D;
%Autovectores(:,:,i) = R;
Autovectores(2,3,1)=R(1,1)

es un calculo tensorial.
la cosa es que en J tengo la matriz que quiero analizar, los autovectores estan en funcion de las constantes del material (velocidad de propagacion de onda en esa direccion y la densidad).
el for seria el barrido del vector por cada angulo que quiera hacer el calculo.
y las cosas que deje como comentarios los puse asi hasta solucionar el problema.

estoy bastante seguro que el problema pasa de extraer el resultado de una matriz bidimensional y meterlo en una tridimensional. no se si hay que usar los comandos como los de concatenar o algo asi. estoy intententando ver como se usan, pero no se si entiendo bien como usarlo y que es lo que hace.
Bueno, yo lo solucioné evaluando y a la mierda. Se ve que no puede manejar la N-dimensionalidad. Tal vez las últimas vesiones sí (yo tengo la 2013).

¿Por qué no declarás "Autovectores" como simbólica? No se puede declarar una matriz 3D de símbolos, pero se puede usar reshape.

m = sym('m', [1 180]);
m = reshape(m, 3, 3, 20);

Y después sí:

m(:,:,i) = R;
me sigue tirando error, creo que voy a graficar directamente todo, sin guardar los valores, y ver si los puedo graficar directamente a medida que los va calculando.
Hay un paquete de Matlab para laburar con tensores. Eso capaz lo arregla.
URLs de referencia