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ó en un interval
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 rng(12360); h=sort(b*rand(1,10)); x=[a,h,b]; Calculeu la integral de f(x) utilitzant la fórmula dels <b>trapezis</b>.Doneu l'<b>error absolut</b> comès en comparar aquesta solució amb la que s'obtindria fent servir la funció <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ó \( 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 rng(12355); h=sort(b*rand(1,10)); x=[a,h,b]; Calculeu la integral de f(x) utilitzant la fórmula dels <b>trapezis</b>.Doneu l'<b>error absolut</b> comès en comparar aquesta solució amb la que s'obtindria fent servir la funció <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ès o fórmula s’escriurà fórmula, la dièresi ($uuml;), la ‘l·l’ (l·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ó \\( 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,' rng(%d); \n',seed); fprintf(fout,' h=sort(b*rand(1,10)); \n'); fprintf(fout,' x=[a,h,b]; \n'); fprintf(fout,'Calculeu la integral de f(x) utilitzant la fórmula dels <b>trapezis</b>.'); fprintf(fout,'Doneu l''<b>error absolut</b> comès en comparar aquesta solució amb la que s''obtindria fent servir la funció <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
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!
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?