Cómo crear una matriz simbólica usando un bucle en matlab
En lo que respecta al problema en sí, no es difícil. Por ejemplo, se pueden utilizar las siguientes líneas de código: N=5;
[i, j, k. , l]= ndgrid(1:N, 1:N, 1:N, 1:N);
syms?x
y=sin((i j k l)*pi* x);
I=int(y, 0, 0.5);
Tenga en cuenta que aquí solo estoy demostrando la idea básica de resolver el problema, por lo que la escala del problema se reduce en gran medida a N = 5.
Utilice MATLAB Profiler para analizar el tiempo necesario para ejecutar estos códigos. Los siguientes son los resultados correspondientes a N=5 y 10:
También probé el caso de N=20. Lo calculé en mi máquina durante una hora y todavía no obtuve el resultado. La situación específica está relacionada con factores como la configuración del hardware, el sistema operativo, la versión de MATLAB, etc., por lo que solo pueden usarse como referencia. Sin embargo, también podemos imaginar que si N=500, incluso el PC más lujoso de hoy tardará días en calcularse (y es difícil garantizar si se producirá un desbordamiento de la memoria).
A través del análisis anterior, básicamente se puede decir que este enfoque no es factible. ¿Es posible solucionar este problema optimizando el programa? El código anterior utiliza operaciones vectorizadas. Lógicamente hablando, es la forma más eficiente de escribir código en MATLAB. Si se reescribe como un método de bucle explícito, el código es el siguiente: N=5;
[i, j, k, l] = ndgrid (1: N, 1: N, 1: N, 1 : N );
syms?x
y=sym(zeros(N, N, N, N));
n=i j k l; p>
I=ceros(N, N, N, N);
para?ii=1:N^4
y(ii)=sin(n( ii) *pi*x);
I(ii)=int(y(ii), 0, 0.5);
end
Este código es para N Los resultados de ejecución de =5 y N=10 son los siguientes:
Se puede ver que el código que usa bucles lleva mucho más tiempo que el código vectorizado.
Entonces, ¿existe una solución más eficiente a este problema?
Creo que si cada elemento tiene la forma sin((i j k l)*pi*x), un enfoque más razonable debería ser tratar el coeficiente (i j k l) como una constante, escrita como n, Primero calcule la integral definida de sin(n*pi*x) para obtener la expresión general sobre n, y luego sustitúyala por los coeficientes específicos. El código es aproximadamente el siguiente: N=50;
syms. ?x?n
f=sin(n*pi*x);
I=int(f, 0, 0.5);
[i, j, k , l]=ndgrid(1:N,1:N,1:N,1:N);
I=inline(I);
I=I (i j k l);
Tenga en cuenta que las dos últimas líneas se convierten primero en funciones en línea y luego se sustituyen, en lugar de subs directamente. La diferencia de eficiencia entre las dos es enorme, puede compararla usted mismo.
Por último echa un vistazo a los resultados. Incluso si se toma N=50 aquí (si N es mayor, se requiere más memoria), el tiempo requerido es muy corto y el algoritmo anterior es básicamente imposible de calcular incluso para N=20:
El arriba El código se depuró en 2007b y puede ser diferente en otras versiones. Tenga en cuenta. Si tienes alguna duda, puedes seguir preguntando.