Exàmens amb Matlab per Atenea (Moodle)

on

Aquesta és la segona versió que us teníem promesa sobre com generar exàmens multiresposta per Moodle, ara utilitzant el Matlab per generar totes les possibles respostes de forma automàtica. Tot i que es poden fer variacions, nosaltres ens centrarem en les típiques preguntes que tenen com a resultat un número que generalement el calcularem amb Matlab.

Fa prop de tres anys que varem començar a implementar les pràctiques de totes les assignatures de matemàtiques que es fan a l’ETSEIB com a guions fets amb Matlab i que podeu consultar en aquest link:

D’aquesta manera en el nostre centre els estudiants d’enginyeria tenen un comú denominador de totes les assignatures i que és la utilització del Matlab per fer càlculs numèrics associats a cada assignatura.

1. Avaluació de les Pràctiques

Un dels problemes que ens vàrem trobar va ser com avaluar aquests coneixements i fer-ho pels entre 400 i 500 alumnes que tenim a les nostres assignatures. La resposta, és clar, passava per utilitzar el nostre Moodle (Atenea) i aconseguir generar exercicis parametritzats (de màxima actualitat en aquest dies!!) per evitar que es puguin passar la resposta i copiar-la.

Generar problemes parametritzats amb solució numèrica és molt fàcil si es poden fer els càlculs amb Matlab. Ara ho explicarem, però el problema  és com fer que es puguin pujar a Atenea. Això ho vàrem resoldre fent servir el format GIFT que ofereix el Moodle conjuntament amb els scripts de Matlab que ara us explicarem.

2. Exemple: Integració Numèrica pel mètode dels trapezis

Per exemplificar el procés farem un exemple en el que integrarem la funció f(x)=(5-x^2)sin(2x) en un interval [a,b] utilitzant el mètode dels trapezis. Però en comptes de fer una divisió uniforme de l’interval com la que es veu a la figura, triarem els punts  dels trapezis de forma aleatòria per a cada estudiant i mirarem d’estalviar-nos haver d’escriure la llista de punts. La intenció prioritària aquí no és tenir una bona aproximació, sino que entenguin com aplicar el mètode siguin quines siguin les dades.

Tot problema ha de tenir certs paràmetres, que diferenciïn els exercicis. En aquest cas, els límits d’integració i els punts de l’interval els generarem de manera aleatòria. També podríem haver agafat alguna de les constants de la definició de la funció, etc.

3. Generar un fitxer GIFT de Moodle amb Matlab

Una pregunta en format GIFT és un fitxer de text, anomenat en aquest exemple  ExIntegNumBlog.txt i que té la següent aparença:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
::01:: Donada la funció \( f(x)= (5-x^2)\sin(2x) \) definida en l'interval [a,b]=[0, 3],
volem calcular la seva integral avaluant-la en punts <b>no equiespaiats</b> triats a partir de les instruccions de Matlab  
&nbsp; &nbsp; &nbsp; rng(12360);
&nbsp; &nbsp; &nbsp; h=sort(b*rand(1,10));
&nbsp; &nbsp; &nbsp; x=[a,h,b];
Calculeu la integral de f(x) utilitzant la f&oacute;rmula dels <b>trapezis</b>.Doneu l'<b>error absolut</b> com&egrave;s en comparar aquesta soluci&oacute; amb la que s'obtindria fent servir la funci&oacute; <b>integral</b> de Matlab.
{
=[moodle]<p>  2.061441e-02 </p>
~%-25%[moodle]<p>  1.461752e-02 </p>
~%-25%[moodle]<p>  2.500177e-02 </p>
~%-25%[moodle]<p>  3.635925e-02 </p>
~%0%[moodle]<p>  En blanc
}
 

::02:: Donada la funci&oacute; \( f(x)= (5-x^2)\sin(2x) \) definida en l'interval [a,b]=[0, 4],
volem calcular la seva integral avaluant-la en punts <b>no equiespaiats</b> triats a partir de les instruccions de Matlab  
&nbsp; &nbsp; &nbsp; rng(12355);
&nbsp; &nbsp; &nbsp; h=sort(b*rand(1,10));
&nbsp; &nbsp; &nbsp; x=[a,h,b];
Calculeu la integral de f(x) utilitzant la f&oacute;rmula dels <b>trapezis</b>.Doneu l'<b>error absolut</b> com&egrave;s en comparar aquesta soluci&oacute; amb la que s'obtindria fent servir la funci&oacute; <b>integral</b> de Matlab.
{
=[moodle]<p>  8.986620e-01 </p>
~%-25%[moodle]<p>  2.656770e-01 </p>
~%-25%[moodle]<p>  1.721907e+00 </p>
~%-25%[moodle]<p>  1.423993e+00 </p>
~%0%[moodle]<p>  En blanc
}

Aquest és un exemple amb dues preguntes, però en podrem generar 50 o 100 amb el mateix esforç.  Pujades a Atenea cada una de les possibles preguntes es veu així:

Ara parlarem de com generar el fitxer GIFT i com pujar-lo a Atenea. Noteu les negretes i els espais de l’enunciat, així com els accents que s’han d’escriure amb codi HTML.

Per exemple, comès s’escriu com&egrave;s  o fórmula s’escriurà f&oacute;rmula, la dièresi ($uuml;), la ‘l·l’ (l&middot;l), etc. Tot això s’ha de tenir en compte una vegada i ja serveix per la resta de preguntes del mateix tipus o categoria.

3. Codi Matlab

El codi Matlab per generar aquest exemple és el que podeu trobar aquí sota. Estem assumint que ja tenim un nivell de Matlab suficient per entendre el codi que segueix:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
clear;
fout=fopen('ExIntegNumBlog.txt','w'); %escirure el nom dle fitxer de sortida
for npreg=1:2 %canviar aquí el numero de preguntes que es vulguin generar.
    %
    % Generem els paràmetres aleatoris
    %
        a=0;
        b=ceil(5*rand()); %limit superior entre 1 i 5
        rr=round(50*rand()); %numero enter entre 0 i 50.
        seed=12340+rr; %llavor del genrador de numeros aleatoris
        rng(seed); %fixem la llavor per poder repetir la successió de números
        h=sort(b*rand(1,10)); %generem 10 valors ordenats en [0,b]
    %
    % Càlcul amb Matlab del problema
    %
        f=@(x) (5-x.^2).*sin(2*x);
        x=[a,h,b];
        y=f(x);
        % implementació simple
        AreaTrap=0;
        for i=1:size(x,2)-1
            AreaTrap=AreaTrap+0.5*(x(i+1)-x(i))*(y(i)+y(i+1)); %area del trapezi
        end
        % Integral amb Matlab
        AreaInt = integral(f,a,b);

        % solució bona
        solucio = abs(AreaTrap - AreaInt)
    %
    % Escribim el fitxer GIFT
    %
    % Enumciat del problema
        fprintf(fout,'\n');
        fprintf(fout,'::0%d:: Donada la funci&oacute; \\( f(x)= (5-x^2)\\sin(2x) \\) definida en l''interval [a,b]=[%d, %d], \n',npreg,a,b);
        fprintf(fout,'volem calcular la seva integral avaluant-la en punts <b>no equiespaiats</b> triats a partir de les instruccions de Matlab  \n');
        fprintf(fout,'&nbsp; &nbsp; &nbsp; rng(%d); \n',seed);
        fprintf(fout,'&nbsp; &nbsp; &nbsp; h=sort(b*rand(1,10)); \n');
        fprintf(fout,'&nbsp; &nbsp; &nbsp; x=[a,h,b]; \n');
        fprintf(fout,'Calculeu la integral de f(x) utilitzant la f&oacute;rmula dels <b>trapezis</b>.');
        fprintf(fout,'Doneu l''<b>error absolut</b> com&egrave;s en comparar aquesta soluci&oacute; amb la que s''obtindria fent servir la funci&oacute; <b>integral</b> de Matlab.\n');
    %
    % Escribim les respostes
    %
        fprintf(fout,'{ \n');
        fprintf(fout,'=[moodle]<p> %10.6e </p> \n', solucio);  %resposta correcte  
        %
        % solucions falses
        %
        for ndolen=1:3
            fprintf(fout,'~%%-25%%[moodle]<p> %10.6e </p> \n',solucio*2*rand());  %<- BAIXEM 0.25 DE LA PUNTUACIÓ DE LA PREGUNTA
        end
        % En Blanc amb això diem que la tria d'aquesta resposta no afecta la puntuació
        fprintf(fout,'~%%0%%[moodle]<p> En Blanc </p> \n');
        fprintf(fout,'} \n');
        fprintf(fout,' \n');
end
fclose(fout);

L’esquema general és fer un bucle for que executarem per a cada pregunta en el que es generen els paràmetres aleatoris de la pregunta, el càlcul correcte de la solució (això tindrà una complexitat o una altra en funció del problema) i també escriurem un fitxer de sortida amb totes les preguntes, que obrim al principi  i tanquem en acabar el programa. També generarem les respostes incorrectes de manera aleatòria. Per escriure en el fitxer de sortida s’utilitza la funció fprintf de Matlab que és equivalent a la del llenguatge C.

El fitxer generat s’anomena, en aquest cas, ExIntegNumBlog.txt i conté totes les preguntes que hem posat en el for.  La resposta correcte es marca amb un =, mentre que les dolentes amb una tilde ~ (es poden escriure amb l’ordre que sigui. Si decidim que cada pregunta incorrecta resti, ho farem utilitzant el tant per cent (en aquest exemple un 25%) i la resposta En Blanc no resta (veure l’entrada sobre Latex i Moodle d’aquest Blog per més detalls).

4. Pujar el fitxer txt a Atenea

Finalment quan ja tenim un fitxer txt generat amb format GIFT, cal pujar les preguntes a Atenea. Suggerim que mireu el post anterior del Numerical Factory sobre Latex i Moodle  i els passos són els mateixos, però ara a l’hora de carregar el fitxer amb les preguntes a la categoria que haurem definit previament en el banc de preguntes, hem de marcar el format GIFT com la opció a l’hora d’importar preguntes. Només caldrà arrossegar el fitxer ExIntegNumBlog.txt sobre la pàgina d’Atenea i ja tindrem totes les preguntes pujades.

Enjoy!!

Impactes: 1127

2 Comments Add yours

  1. Joan Saldaña ha dit:

    Una entrada molt interessant i útil en aquests moments crítics!

    Per cert, com hem de fer perquè amb el fitxer GIFT generat puguem escollir que no surtin numerades les opcions?

    Moltes gràcies!

  2. numfact ha dit:

    Hola Joan, no se si et refereixes a la numeració per pregunta. Aquest és opcional, però li has de posar in identificador a cada pregunta (podria ser un nom diferent a cada pregunta). De totes maneres, el Moodle s’encarrega de triar la pregunta de forma aleatòria dins una categoria (si tu ho vols) de cara a confeccionar diferents exàmens.
    No tinc clar si això és el que volies saber?

Respon a Joan Saldaña Cancel·la les respostes

L'adreça electrònica no es publicarà. Els camps necessaris estan marcats amb *