Red de conocimiento informático - Aprendizaje de programación - Ejemplos de programación de Mtalab

Ejemplos de programación de Mtalab

Las respuestas dadas por las dos personas anteriores son muy reflexivas y maravillosas. Como uno.

Mi código tiene las siguientes ventajas:

(1) A utiliza almacenamiento matricial disperso para superar el problema de la memoria insuficiente (n es 1 millón y la memoria utilizada es menos de 20 M ).

(2) El dibujo muestra dinámicamente los cambios en r/R durante N simulaciones.

El código es el siguiente (subido como archivo adjunto):

n? =?1000000;

m? =?2 * N;

¿Respuesta? =?sparse(M+1,?m+1);

j? =?n? +?1;

k? =?n? +?1;

b? =?ceil(4*rand(1,N));

%?La figura muestra el proceso de cálculo (para mejorar la eficiencia, se genera un punto cada N ciclos)

n? =?500;

v? =?cero(1,arreglar(N/n)+1)? *?Sur;

h? =?Plot(1?:?fix(N/n)+1,?v,?b-',?nan,?nan,?ro');

xlabel(' N ');

y label(' R/R ');

set(gcf,?' DoubleBuffer',? on');

set(gca,? Xlim ',? [1?fix(N/N)+1]);

t = ceil(exp(1:15));

set(gca,' xtick ', t/n, ' xgrid ', ' on ', ' xticklabel ', t)

¿Para qué? ¿I? =?1:N

¿Cambiar? b(1)

¿Caso? 1,?j = j+1;? a(j,k)=a(j,k)+1;

¿Caso? 2,?k = k+1;? a(j,k)=a(j,k)+1;

¿Caso? 3,?j = j-1;? a(j,k)=a(j,k)+1;

¿Caso? 4,?k = k-1;? a(j,k)=a(j,k)+1;

Fin

%? ¿Actualizar dibujo

Si? ~rem(yo,?n)? ||?¿Yo? ==?Normal

%?Nota: ¿No se puede utilizar? suma(a(:)~=0)? cálculo, de lo contrario puede provocar que la memoria sea insuficiente.

r? =?full(suma(suma(a ~ = 0));

c?=?fix(log(I));

r?=?full(suma(suma (a = = c));

idx? =?Reparación(i/n)?+?1;

v(idx)?

p>

set(h(1),?yData',?v);

set(h(2),?'xData',?idx,?yData',?v(idx ));

Título(['N?=?'?int 2 str(I)];

drawnow

Fin

Fin

%?Resultados de salida

fprintf('R=%i, r=%i,?r/R=%.3g\n\n ',?r, ? r,? R/R);

%? Cuente el número de movimientos en cada dirección (verifique la consistencia del número aleatorio)

¿Para qué =?1?:? p>

Fprintf('El grado de dirección %i es %i\n ',?I,?sum(b = = I));

La salida del programa final es la siguiente :

R=2856, ?r/R=0.014

El grado de la dirección 2 es 250179. /p>

El grado de la dirección 3 es 250085.

El grado de la dirección 4 es 250409.

Algunos puntos simples:

1. Debido a que es una simulación aleatoria, los resultados serán diferentes cada vez que se ejecute.

2. El movimiento es un proceso relacionado con el contexto, por lo que la secuencia de números aleatorios no solo debe ser uniforme, sino también independiente (no existe correlación entre números aleatorios adyacentes).

3. La línea de puntos en la figura indica n cuando cambia int (ln (n)). El número de cuadrículas de cálculo cambia, por lo que generalmente es discontinuo.

4. A juzgar por la tendencia cambiante en la figura, no hay signos evidentes de convergencia hacia un número determinado. Los resultados de mis dos ejecuciones fueron 0,0118 y 0,014 respectivamente.

5. En mi máquina, tomando n = 10.000, el tiempo de ejecución es de aproximadamente N = 100 minutos.

6. Este programa no tiene requisitos especiales para la versión MATLAB. Se probó en 6.5, 2008a, 2012b y funciona bien.