function SIGEM() % SIstema GEnerador de Models basat en el programa del mateix nom fet per Antonio Caselles Moncho % (adaptacio per a octave, http://www.octave.org, per Rafael Pla-Lopez; versio 1.2 - copyleft/GNU GPL) fprintf('SIstema GEnerador de Models basat en el programa del mateix nom fet per Antonio Caselles Moncho\n'); fprintf('(adaptacio per a octave, http://www.octave.org, per Rafael Pla-Lopez; versio 1.2 - copyleft/GNU GPL)\n\n'); NOM=input('Introdueix el nom del programa (solament una paraula): ','s'); % introduccio de les dimensions fprintf('Introdueix 1 si hi ha variables multidimensionals\n'); fprintf(' o 0 en cas contrari '); dim=input(' : '); % introduccio de les variables n=input('Introdueix el numero de variables: '); VARIABLE=''; fprintf(' (els noms de les variables han de tener el mateix numero de caracters\n'); fprintf(' i conve que tinguen mes de 3 i estiguen en minuscules)\n'); for i=1:n fprintf('Introdueix el nom de la variable numero %d',i); x=input(': ','s'); VARIABLE=[VARIABLE;x]; if (dim) d(i)=input(' Introdueix la dimensio d''aquesta variable : '); end end LLISTA=['L',NOM,'.txt']; llista=fopen(LLISTA,"w"); for i=1:n fputs(llista,VARIABLE(i,:)); fputs(llista,"\n"); end fclose(llista); % introduccio de les dependencies DEPENDRE=''; c=zeros(n); s=zeros(1,n); for i=1:n FILERA=[VARIABLE(i,:),'(']; fprintf('De quantes variables depen la variable %s? (0 si es d''entrada)',VARIABLE(i,:)); nv(i)=input(': '); if (nv(i)>0) fprintf('Introdueix\n 1 si %s es una variable d''estat\n 0 en cas contrari',VARIABLE(i,:)); s(i)=input(' : '); end for j=1:nv(i) cc=0; do x=input('Depen de la variable... ','s'); for k=1:n if (k~=i & strcmp(x,VARIABLE(k,:)) & c(i,k)==0) cc=c(i,k)=1; ccc(i,j)=k; end end until (cc==1) FILERA=[FILERA,x]; if (jn) if (sum(sum(c))>0) fprintf('El sistema no es jerarquic; ha de redissenyar-se per evitar els bucles de dependencia\n'); return; end CONEXION=['C',NOM,'.txt']; conexion=fopen(CONEXION,"w"); for i=1:n fputs(conexion,DEPENDRE(i,:)); fputs(conexion,"\n"); end fclose(conexion); % introduccio de les relacions funcionals FUNCIONS=''; tab=0; for i=1:n if (nv(i)>0) funcio=['F',VARIABLE(i,:),'.m']; fopen(funcio,"w"); fputs(funcio,['function ',VARIABLE(i,:),'=F',DEPENDRE(i,:),"\n"]); fprintf('En quantes linies vols escriure la dependencia funcional de la variable %s?\n',VARIABLE(i,:)); fprintf(' (introdueix 0 si la dependencia ve donada per una tabla) '); nl(i)=input(' : '); fputs(funcio,['% Programa per obtenir la variable ',VARIABLE(i,:),"\n"]); if (nl(i)) if (dim) if (d(i)>1) fprintf(' Per referirse a un component d''una variable utilitza l''index i%d i per operar amb\n',i); fprintf(' components escriu un punt (.) abans dels operadors producte (*), divisio (/) o potenciacio (^)\n'); fputs(funcio,['for i',num2str(i),'=1:',num2str(d(i)),"\n"]); end end for j=1:nl(i) fprintf('Introdueix la linia numero %d',j); x=input(': ','s'); fputs(funcio,[' ',x,";\n"]); FUNCIONS=[FUNCIONS;blanks(j),x]; end if (dim) if (d(i)>1) fputs(funcio,['end',"\n"]); end end else tab=1; % introduccio en el seu cas dels valors de la tabla fputs(funcio,['% mitjansant la tabla T',VARIABLE(i,:),'.txt',"\n"]); TVARIABLE=sprintf('T%s.txt',VARIABLE(i,:)); Tfuncio=fopen(TVARIABLE,"r"); if (Tfuncio==-1) fprintf('Per executar el programa has de crear una tabla com un fitxer de text de nom T%s.txt\n',VARIABLE(i,:)); fprintf('En cada linia has d''escriure successivament els valors de %s\n',DEPENDRE(i,:)), fprintf('en el format indicat. Els valors han de repetirse o ser creixents en les successives linies,\n'); fprintf('llevat, naturalment, dels de %s\n',VARIABLE(i,:)); fprintf('Totes les línies han de tenir la mateixa longitud: si és necessari, afegeix zeros a\n'); fprintf('l''esquerra d''un numero o en el seu cas a la dreta dels decimals\n'); fprintf('El fitxer ha de finalitzar al final de la darrera línia escrita: no afegisques una\n'); fprintf('nova linia en blanc\n'); if (dim) fprintf('Si alguna de les variables de les que depen es multidimensional, simplement escriu\n'); fprintf('els seus valors consecutivament separats tambe per comes\n'); fprintf(' (en el cas de %s, separa els seus valors per punt i coma [;]\n',VARIABLE(i,:)); fprintf(' i encercla-los entre claudators, [...])'); end else fclose(Tfuncio); end po=[findstr(DEPENDRE(i,:),"("),findstr(DEPENDRE(i,:),","),findstr(DEPENDRE(i,:),")")]; fputs(funcio,['Tfuncio=fopen(''T',VARIABLE(i,:),'.txt'',"r");',"\n"]); fputs(funcio,['K=0;',"\n"]); fputs(funcio,['do',"\n"]); fputs(funcio,[' K=K+1; clear x;',"\n"]); fputs(funcio,[' x=fgetl(Tfuncio);',"\n"]); fputs(funcio,[' if (x~=-1)',"\n"]); fputs(funcio,[' TABLA(K,:)=x;',"\n"]); fputs(funcio,[' end',"\n"]); fputs(funcio,['until (x==-1)',"\n"]); fputs(funcio,['fclose(Tfuncio);',"\n"]); fputs(funcio,['for j=1:K-1',"\n"]); fputs(funcio,[' po=[findstr(TABLA(j,:),"("),findstr(TABLA(j,:),","),findstr(TABLA(j,:),")")];',"\n"]); fputs(funcio,[' SALIDA(j,:)=str2num(TABLA(j,1:po(1)-1));',"\n"]); fputs(funcio,[' for jj=1:length(po)-1',"\n"]); fputs(funcio,[' ENTRADA(j,jj)=str2num(TABLA(j,po(jj)+1:po(jj+1)-1));',"\n"]); fputs(funcio,[' end',"\n"]); fputs(funcio,['end',"\n"]); for j=1:nv(i) if (dim) for k=1:d(ccc(i,j)) fputs(funcio,['X(',num2str(j+k-1),')=',VARIABLE(ccc(i,j),:),'(',num2str(k),');',"\n"]); end else fputs(funcio,['X(',num2str(j),')=',VARIABLE(ccc(i,j),:),';',"\n"]); end end % interpolacio a partir dels valors de la tabla fputs(funcio,['DIST=norm(ENTRADA(K-1,:)-ENTRADA(1,:),inf);',"\n"]); fputs(funcio,['for j=1:K-1',"\n"]); fputs(funcio,[' x=norm(ENTRADA(j,:)-X,inf);',"\n"]); fputs(funcio,[' if (x1) fputs(funcio,[VARIABLE(i,:),"=",VARIABLE(i,:),"';\n"]); end end end fclose(funcio); else nl(i)=0; end end RELACIONS=['F',NOM,'.txt']; relacions=fopen(RELACIONS,"w"); for j=1:sum(nl) fputs(relacions,FUNCIONS(j,:)); fputs(relacions,"\n"); end fclose(relacions); % introduccio de la dinamica del sistema if (sum(s)>0) temps=input('Quina sera la unitat de temps? ','s'); for i=1:n if (s(i)==1) ss=0; do fprintf('Introdueix el nom del valor de %s al principi del %s',VARIABLE(i,:),temps); x=input(': ','s'); for k=1:n if (niv(k)<=1 & strcmp(x,VARIABLE(k,:))) inic(i)=k; niv(k)=0; ss=1; if (dim) d(k)=d(i); end end end until (ss==1) end end fprintf('Introdueix 1 si vols obtenir grafics de l''evolucio d''algunes variables\n'); fprintf(' o 0 en cas contrari '); gra=input(' : '); end fprintf('Introdueix 1 si vols poder fer estudis estadistics en cas d''aleatorietat\n'); fprintf(' o 0 en cas contrari '); est=input(' : '); % construccio del programa per executar el model programa=fopen([NOM,'.m'],"w"); fputs(programa,'function ['); if (est & sum(s)==0) cont=0; for i=1:n if (niv(i)>=2) if (cont==1) fputs(programa,','); end fputs(programa,VARIABLE(i,:)); cont=1; end end end fputs(programa,[']=',NOM,'()']); fputs(programa,"\n"); fputs(programa,['% ',NOM,' es un model ']); if (sum(s)>0) fputs(programa,'dinamic '); if (gra) fputs(programa,'que permet representacions grafiques i '); end end if (est) fputs(programa,'que possibilita estudis estadistics '); end fputs(programa,'amb aleatorietat opcional en les entrades '); if (dim) fputs(programa,'i que utilitza variables multidimensionals'); end if (tab) fputs(programa,[' i tables',"\n"]); fputs(programa,['TABLAm=fopen("TABLA.m","w");',"\n"]); fputs(programa,['% INSTRUCCIONS PER CONFECCIONAR UNA TABLA',"\n"]); fputs(programa,['fputs(TABLAm,"% Per executar el programa has de crear una tabla com un fitxer de text de nom T seguit\n");',"\n"]); fputs(programa,['fputs(TABLAm,"% del nom de la variable amb dependencia donada per una tabla i distintiu de tipus .txt\n");',"\n"]); fputs(programa,['fputs(TABLAm,"% En cada linia has d''escriure el valor d''aquesta variable seguida entre parentesis i\n");',"\n"]); fputs(programa,['fputs(TABLAm,"% separades per comes dels valors de les variables de les quals depen\n");',"\n"]); fputs(programa,['fputs(TABLAm,"% [per exemple, 3.12(2.3,3.1,4.2)],\n");',"\n"]); fputs(programa,['fputs(TABLAm,"% els quals han de repetirse o ser creixents en les successives linies.\n");',"\n"]); fputs(programa,['fputs(TABLAm,"% Totes les línies han de tenir la mateixa longitud: si és necessari, afegeix zeros a\n");',"\n"]); fputs(programa,['fputs(TABLAm,"% l''esquerra d''un numero o en el seu cas a la dreta dels decimals\n");',"\n"]); fputs(programa,['fputs(TABLAm,"% El fitxer ha de finalitzar al final de la darrera línia escrita: no afegisques una\n");',"\n"]); fputs(programa,['fputs(TABLAm,"% nova linia en blanc\n");',"\n"]); if (dim) fputs(programa,['fputs(TABLAm,"% Si alguna de les variables de les que depen es multidimensional, simplement escriu\n");',"\n"]); fputs(programa,['fputs(TABLAm,"% els seus valors consecutivament separats tambe per comes\n");',"\n"]); fputs(programa,['fputs(TABLAm,"% (en el cas de la variable depenent, separa els seus valors per punt i coma [;]\n");',"\n"]); fputs(programa,['fputs(TABLAm,"% i encercla-los entre claudators, [...])\n");',"\n"]); fputs(programa,['fputs(TABLAm,"% Per exemple, [3;2](1,2)\n");',"\n"]); end fputs(programa,'fputs(TABLAm,''fprintf(''''Obri TABLA.m com un fitxer de text o introdueix help TABLA des d''''''''octave\n'''');'');'); fputs(programa,["\n",'fputs(TABLAm,"\n");',"\n"]); fputs(programa,['fclose(TABLAm);',"\n"]); for i=1:n if (niv(i)>=2 & nl(i)==0) fputs(programa,['TVARIABLE=sprintf(''T',VARIABLE(i,:),'.txt'');',"\n"]); fputs(programa,['do',"\n"]); fputs(programa,[' Tfuncio=fopen(TVARIABLE,"r");',"\n"]); fputs(programa,[' if (Tfuncio==-1)',"\n"]); fputs(programa,[' fprintf(''La tabla T',VARIABLE(i,:),'.txt no existeix encara; has de crear-la com un fitxer\n'');']); fputs(programa, "\n"); fputs(programa,[' fprintf(''de text segons s''''indica en TABLA.m: pots obrir-ho com a fitxer de text\n'');',"\n"]); fputs(programa,[' fprintf(''o introduir help TABLA des d''''octave\n'');',"\n"]); fputs(programa,[' fprintf(''Introdueix 1 despres d''''haver creat aquest fitxer,\n'');',"\n"]); fputs(programa,[' fprintf('' o 0 si vols sortir del programa'');',"\n"]); fputs(programa,[' cont=input('' : '');',"\n"]); fputs(programa,[' if (cont==0)',"\n"]); fputs(programa,[' fprintf(''Fins despres\n''); return;',"\n"]); fputs(programa,[' end',"\n"]); fputs(programa,[' end',"\n"]); fputs(programa,['until (Tfuncio~=-1)',"\n"]); end end end fputs(programa,"\n"); fputs(programa,['fprintf(''PROGRAMA PER L''''EXECUCIO DEL MODEL ',NOM,'\n'');']); fputs(programa,"\n"); fputs(programa,'% INTRODUCCIO DE L''ALEATORIETAT'); fputs(programa,"\n"); for i=1:n if (niv(i)<=1) fputs(programa,'xx=x=[];'); fputs(programa,"\n"); if (dim) fputs(programa,['for k=1:',num2str(d(i))]); fputs(programa,"\n"); else fputs(programa,['k=1;',"\n"]); end fputs(programa,' do'); fputs(programa,"\n"); fputs(programa,' fprintf(''Introdueix el valor inicial de'');'); fputs(programa,"\n"); if (dim) if (d(i)>1) fputs(programa,' fprintf(''l component %d de'',k);'); fputs(programa,"\n"); end end fputs(programa,[' fprintf('' la variable ',VARIABLE(i,:),'\n''); ']); fputs(programa,"\n"); fputs(programa,' fprintf(''(si es aleatoria introdueix la distribucio de probabilitats amb el format\n'');'); fputs(programa,"\n"); fputs(programa,' fprintf('' +valor/percentatge+...+valor/percentatge+\n'');'); fputs(programa,"\n"); fputs(programa,' fprintf('' o be, si te distribucio normal,\n'');'); fputs(programa,"\n"); fputs(programa,' fprintf('' #mitjana#desviacio tipica#\n'');'); fputs(programa,"\n"); fputs(programa,' x=[x;input('') : '',''s'')]; aa=1;'); fputs(programa,"\n"); fputs(programa,' if (index(x(k,:),''/''))'); fputs(programa,"\n"); fputs(programa,' pa=findstr(x(k,:),"/"); cr=findstr(x(k,:),"+");'); fputs(programa,"\n"); fputs(programa,' if (length(pa)==length(cr)-1)'); fputs(programa,"\n"); fputs(programa,[' S=0; la',num2str(i),'(k)=length(pa);']); fputs(programa,"\n"); fputs(programa,' for j=1:length(pa)'); fputs(programa,"\n"); fputs(programa,[' v',num2str(i),'(k,j)=str2num(x(k,cr(j)+1:pa(j)-1));']); fputs(programa,"\n"); fputs(programa,[' p',num2str(i),'(k,j)=str2num(x(k,pa(j)+1:cr(j+1)-1));']); fputs(programa,"\n"); fputs(programa,[' S=S+p',num2str(i),'(k,j);']); fputs(programa,"\n"); fputs(programa,' end'); fputs(programa,"\n"); fputs(programa,' if (S==100)'); fputs(programa,"\n"); fputs(programa,[' a',num2str(i),'(k)=1;']); fputs(programa,"\n"); fputs(programa,' else'); fputs(programa,"\n"); fputs(programa,' aa=0; x=xx;'); fputs(programa,"\n"); fputs(programa,' end'); fputs(programa,"\n"); fputs(programa,' else'); fputs(programa,"\n"); fputs(programa,' aa=0;'); fputs(programa,"\n"); fputs(programa,' end'); fputs(programa,"\n"); fputs(programa,' else if (index(x(k,:),"#"))'); fputs(programa,"\n"); fputs(programa,' h=findstr(x(k,:),"#");'); fputs(programa,"\n"); fputs(programa,' if (length(h)==3)'); fputs(programa,"\n"); fputs(programa,[' MU',num2str(i),'(k)=str2num(x(k,h(1)+1:h(2)-1));']); fputs(programa,"\n"); fputs(programa,[' DT',num2str(i),'(k)=str2num(x(k,h(2)+1:h(3)-1));']); fputs(programa,"\n"); fputs(programa,[' a',num2str(i),'(k)=2;']); fputs(programa,"\n"); fputs(programa,' else'); fputs(programa,"\n"); fputs(programa,' aa=0; x=xx;'); fputs(programa,"\n"); fputs(programa,' end'); fputs(programa,"\n"); fputs(programa,' else'); fputs(programa,"\n"); fputs(programa,[' v',num2str(i),'(k,1)=str2num(x(k,:));']); fputs(programa,"\n"); fputs(programa,[' a',num2str(i),'(k)=0;']); fputs(programa,"\n"); fputs(programa,' end'); fputs(programa,"\n"); fputs(programa,' end'); fputs(programa,"\n"); fputs(programa,' until (aa==1)'); fputs(programa,"\n"); if (dim) fputs(programa,' xx=x;'); fputs(programa,"\n"); fputs(programa,'end'); fputs(programa,"\n"); end end end if (est) fputs(programa,'% PREPARACIO DE L''ESTUDI ESTADISTIC'); fputs(programa,"\n"); fputs(programa,'R=input(''Introdueix el numero de repeticions per a un estudi estadistic: '');'); fputs(programa,"\n"); fputs(programa,'if (R>1)'); fputs(programa,"\n"); fputs(programa,' fprintf(''Introdueix el nivell de significacio per obtenir un interval de confianza\n'');'); fputs(programa,"\n"); fputs(programa,' fprintf('' (o 0 per obtenir la mitjana i la desviacio tipica)''); '); fputs(programa, 'ns=input('' : '');'); fputs(programa,"\n"); fputs(programa,' if (ns)'); fputs(programa,"\n"); fputs(programa,' K=tinv(1-ns/2,R-1)/sqrt(R-1);'); fputs(programa,"\n"); fputs(programa,' np=input(''Introdueix els graus de llibertat per a la prova de normalitat: '');'); fputs(programa,"\n"); fputs(programa,' z(1)=norminv(5/R); z(np)=-z(1);'); fputs(programa,"\n"); fputs(programa,' if (np>1)'); fputs(programa,"\n"); fputs(programa,' dz=(z(np)-z(1))/(np-1);'); fputs(programa,"\n"); fputs(programa,' end'); fputs(programa,"\n"); fputs(programa,' e(1)=e(np+1)=5;'); fputs(programa,"\n"); fputs(programa,' for k=2:np'); fputs(programa,"\n"); fputs(programa,' z(k)=z(1)+(k-1)*dz;'); fputs(programa,"\n"); fputs(programa,' e(k)=R*(normcdf(z(k))-normcdf(z(k-1)));'); fputs(programa,"\n"); fputs(programa,' end'); fputs(programa,"\n"); fputs(programa,' end'); fputs(programa,"\n"); fputs(programa,'else'); fputs(programa,"\n"); fputs(programa,' ns=0;'); fputs(programa,"\n"); fputs(programa,'end'); fputs(programa,"\n"); if (sum(s)==0) fputs(programa,'jt=1;'); fputs(programa,"\n"); end end if (sum(s)>0) fputs(programa,'% PREPARACIO DE LA DINAMICA DEL MODEL'); fputs(programa,"\n"); fputs(programa,['fprintf(''Introdueix el ',temps,' inicial''); t0=input('': '');']); fputs(programa,"\n"); fputs(programa,'do'); fputs(programa,"\n"); fputs(programa,[' fprintf(''Introdueix el ',temps,' final ''); T=input('': '');']); fputs(programa,"\n"); fputs(programa,'until(T>t0)'); fputs(programa,"\n"); fputs(programa,['fprintf(''Introdueix l''''increment de ',temps,'s''); dt=input('': '');']); fputs(programa,"\n"); for i=1:n if (niv(i)==1) fputs(programa,['fprintf(''Cada quants ',temps,'s ha de canviar ',VARIABLE(i,:),'?\n'');']); fputs(programa,"\n"); fputs(programa,'fprintf('' (0 si no ha de canviar, o\n'');'); fputs(programa,"\n"); fputs(programa,'fprintf('' -1 si ho ha de fer en intervals irregulars)''); '); fputs(programa, ['ca',num2str(i),'=input('' : '');']); fputs(programa,"\n"); fputs(programa,['if (ca',num2str(i),'>0)']); fputs(programa,"\n"); fputs(programa,[' t',num2str(i),'=t0; j=1;']); fputs(programa,"\n"); fputs(programa,[' while (t',num2str(i),'(j)1) fputs(programa,' fprintf(''l component %d de'',k);'); fputs(programa,"\n"); end end fputs(programa,[' fprintf('' ',VARIABLE(i,:),' en t=%f'',t',num2str(i),'(j));']); fputs(programa, [' v',num2str(i),'(k,j)=input('' : '');']); fputs(programa,"\n"); fputs(programa,' end'); fputs(programa,"\n"); if (dim) fputs(programa,' end'); fputs(programa,"\n"); end fputs(programa,' end'); fputs(programa,"\n"); fputs(programa,['else if (ca',num2str(i),'==-1)']); fputs(programa,"\n"); fputs(programa,[' t',num2str(i),'=t0; j=1;']); fputs(programa,"\n"); fputs(programa,[' while (t',num2str(i),'(j)%f per finalitzar)'',T);'); fputs(programa,"\n"); fputs(programa,[' t',num2str(i),'(j)=input('' : '');']); fputs(programa,"\n"); fputs(programa,[' until(t',num2str(i),'(j)>t',num2str(i),'(j-1))']); fputs(programa,"\n"); if (dim) fputs(programa,[' for k=1:',num2str(d(i))]); fputs(programa,"\n"); else fputs(programa,' k=1;'); fputs(programa,"\n"); end fputs(programa,[' if (t',num2str(i),'(j)<=T & a',num2str(i),'(k)==0)']); fputs(programa,"\n"); fputs(programa,' fprintf(''Introdueix el nou valor de'');'); fputs(programa,"\n"); if (dim) if(d(i)>1) fputs(programa,' fprintf(''l component %d de'',k);'); fputs(programa,"\n"); end end fputs(programa,[' fprintf('' ',VARIABLE(i,:),''');']); fputs(programa, [' v',num2str(i),'(k,j)=input('' : '');']); fputs(programa,"\n"); fputs(programa,' end'); fputs(programa,"\n"); if (dim) fputs(programa,' end'); fputs(programa,"\n"); end fputs(programa,' end'); fputs(programa,"\n"); fputs(programa,' end'); fputs(programa,"\n"); fputs(programa,'end'); fputs(programa,"\n"); end end fputs(programa,'% PREPARACIO DEL FITXER DE SORTIDA'); fputs(programa,"\n"); fputs(programa,['NOM=''',NOM,''';']); fputs(programa,"\n"); fputs(programa,'m=input(''Introdueix un numero per al fitxer de sortida: '');'); fputs(programa,"\n"); fputs(programa,'sortida=fopen([''S'',NOM,sprintf(''%d'',m),''.txt''],"w");'); fputs(programa,"\n"); fputs(programa,['fprintf(sortida,''VALORS DE LES VARIABLES DEPENDENTS DE ',NOM,':\n\n'');']); fputs(programa,"\n"); if (est) fputs(programa,'if (R>1)'); fputs(programa,"\n"); fputs(programa,' if (ns)'); fputs(programa,"\n"); fputs(programa,' fprintf(sortida,''En cada pas s''''escriuran els extrems de l'''''');'); fputs(programa,' fprintf(sortida,''interval i la valoracio de la prova de normalitat\n\n'');'); fputs(programa,"\n"); fputs(programa,' else'); fputs(programa,"\n"); fputs(programa,' fprintf(sortida,''En cada pas s''''escriuran la mitjana i la desviacio tipica\n\n'');'); fputs(programa,"\n"); fputs(programa,' end'); fputs(programa,"\n"); fputs(programa,'end'); fputs(programa,"\n"); end fputs(programa,'fprintf(sortida,''%6s'',''t'');'); fputs(programa,"\n"); for i=1:n if (niv(i)>=2) fputs(programa,['fprintf(sortida,''%12s'',''',VARIABLE(i,:),''');']); fputs(programa,"\n"); if (dim) fputs(programa,['fprintf(sortida,blanks(12*',num2str(d(i)-1),'));']); fputs(programa,"\n"); end end end fputs(programa,'fputs(sortida,"\n");'); fputs(programa,"\n"); fputs(programa,'% PREPARACIO DELS GRAFICS'); fputs(programa,"\n"); if (gra) fputs(programa,'N=input(''De quantes variables (de 0 a 6) vols representar graficament la seua evolucio? '');'); fputs(programa,"\n"); if (est) fputs(programa,'if (R>1 & N)'); fputs(programa,"\n"); fputs(programa,' fprintf(''(es representaran les mitjanes de les variables)\n'');'); fputs(programa,"\n"); fputs(programa,'end'); fputs(programa,"\n"); end fputs(programa,'for k=1:N'); fputs(programa,"\n"); fputs(programa,' g(1,k)=0; g(2,k)=1;'); fputs(programa,"\n"); fputs(programa,' do'); fputs(programa,"\n"); fputs(programa,' x=input(''Introdueix el nom d''''una variable a representar: '',''s'');'); fputs(programa,"\n"); for i=1:n fputs(programa,[' if (strcmp(x,''',VARIABLE(i,:),'''))']); fputs(programa,"\n"); fputs(programa,[' g(1,k)=',num2str(i),';']); fputs(programa,"\n"); if (dim) if (d(i)>1) fputs(programa,' do'); fputs(programa,"\n"); fputs(programa,' fprintf('' Quin component vols representar '');'); fputs(programa,[' kk=input(''(entre 1 i ',num2str(d(i)),')? '');',"\n"]); fputs(programa,[' until(kk>=1 & kk<=',num2str(d(i)),')']); fputs(programa,"\n"); fputs(programa,' g(2,k)=kk;'); fputs(programa,"\n"); end end fputs(programa,' end'); fputs(programa,"\n"); end fputs(programa,' until (g(1,k))'); fputs(programa,"\n"); fputs(programa,'end'); fputs(programa,"\n"); end end if (est) fputs(programa,['% INICIALITZACIO DE LES MITJANES I DESVIACIONS TIPIQUES',"\n"]); for i=1:n if (dim) fputs(programa,['k=',num2str(d(i)),";\n"]); else fputs(programa,"k=1;\n"); end if (sum(s)>0) fputs(programa,'jt=0;'); fputs(programa,"\n"); fputs(programa,'for t=t0:dt:T'); fputs(programa,"\n"); fputs(programa,' jt=jt+1;'); fputs(programa,"\n"); else fputs(programa,[' jt=1;',"\n"]); end fputs(programa,[' mu',num2str(i),'(:,jt)=zeros(k,1); dt',num2str(i),'(:,jt)=zeros(k,1);']); fputs(programa,"\n"); if (sum(s)>0) fputs(programa,'end'); fputs(programa,"\n"); end end fputs(programa,'for r=1:R'); fputs(programa,"\n"); end if (sum(s)>0) for i=1:n if (niv(i)==1) fputs(programa,[' j',num2str(i),'=1; ']); fputs(programa,"\n"); end end end fputs(programa,'% ASSIGNACIO DELS VALORS D''ENTRADA'); fputs(programa,"\n"); for i=1:n if (niv(i)<=1) if (dim) fputs(programa,[' for k=1:',num2str(d(i))]); fputs(programa,"\n"); else fputs(programa,[' k=1;',"\n"]); end fputs(programa,[' if (a',num2str(i),'(k)==1)']); fputs(programa,"\n"); fputs(programa,' x=100*rand(); S=0;'); fputs(programa,"\n"); fputs(programa,[' for j=1:la',num2str(i),'(k)']); fputs(programa,"\n"); fputs(programa,[' S=S+p',num2str(i),'(k,j);']); fputs(programa,"\n"); fputs(programa,' if (S>x)'); fputs(programa,"\n"); fputs(programa,[' ',VARIABLE(i,:),'(k,1)=v',num2str(i),'(k,j); break;']); fputs(programa,"\n"); fputs(programa,' end'); fputs(programa,"\n"); fputs(programa,' end'); fputs(programa,"\n"); fputs(programa,[' else if (a',num2str(i),'(k)==2)']); fputs(programa,"\n"); fputs(programa,[' v',num2str(i),'(k,1)=norminv(rand,MU',num2str(i),'(k),DT',num2str(i),'(k)); ']); fputs(programa, [VARIABLE(i,:),'(k,1)=v',num2str(i),'(k,1);']); fputs(programa,"\n"); fputs(programa,' else'); fputs(programa,"\n"); fputs(programa,[' ',VARIABLE(i,:),'(k,1)=v',num2str(i),'(k,1);']); fputs(programa,"\n"); fputs(programa,' end'); fputs(programa,"\n"); fputs(programa,' end'); fputs(programa,"\n"); if (dim) fputs(programa,' end'); fputs(programa,"\n"); end end end if (sum(s)>0) fputs(programa,'jt=0;'); fputs(programa,"\n"); fputs(programa,'for t=t0:dt:T'); fputs(programa,"\n"); fputs(programa,' jt=jt+1;'); fputs(programa,"\n"); end fputs(programa,'% EXECUCIO DEL MODEL'); fputs(programa,"\n"); if (sum(s)>0) for i=1:n if (niv(i)==1) fputs(programa,[' if (ca',num2str(i),')']); fputs(programa,"\n"); fputs(programa,[' if (t>=t',num2str(i),'(j',num2str(i),'+1))']); fputs(programa,"\n"); fputs(programa,[' j',num2str(i),'=j',num2str(i),'+1;']); fputs(programa,"\n"); if (dim) fputs(programa,[' for k=1:',num2str(d(i))]); fputs(programa,"\n"); else fputs(programa,[' k=1;',"\n"]); end fputs(programa,[' if (a',num2str(i),'(k)==0)']); fputs(programa,"\n"); fputs(programa,[' ',VARIABLE(i,:),'(k,1)=v',num2str(i),'(k,j',num2str(i),');',"\n"]); fputs(programa,[' else if (a',num2str(i),'(k)==1)']); fputs(programa,"\n"); fputs(programa,' x=100*rand(); S=0;'); fputs(programa,"\n"); fputs(programa,[' for j=1:la',num2str(i),'(k)']); fputs(programa,"\n"); fputs(programa,[' S=S+p',num2str(i),'(k,j);']); fputs(programa,"\n"); fputs(programa,' if (S>x)'); fputs(programa,"\n"); fputs(programa,[' ',VARIABLE(i,:),'(k,1)=v',num2str(i),'(k,j); break;',"\n"]); fputs(programa,' end'); fputs(programa,"\n"); fputs(programa,' end'); fputs(programa,"\n"); fputs(programa,' else'); fputs(programa,"\n"); fputs(programa,[' v',num2str(i),'(k,1)=']); fputs(programa, ['norminv(rand,MU',num2str(i),'(k),DT',num2str(i),'(k)); ']); fputs(programa, [VARIABLE(i,:),'(k,1)=v',num2str(i),'(k,1);']); fputs(programa,"\n"); fputs(programa,' end'); fputs(programa,"\n"); fputs(programa,' end'); fputs(programa,"\n"); if (dim) fputs(programa,' end'); fputs(programa,"\n"); end fputs(programa,' end'); fputs(programa,"\n"); fputs(programa,' end'); fputs(programa,"\n"); end end end for k=2:NIV-1 for i=1:n if (niv(i)==k) fputs(programa,[' ',VARIABLE(i,:),'=F',DEPENDRE(i,:),"';"]); fputs(programa,"\n"); if (est) fputs(programa,' if (ns)'); fputs(programa,"\n"); fputs(programa,[' Y',num2str(i),'(:,jt,r)=',VARIABLE(i,:),';']); fputs(programa,"\n"); fputs(programa,' end'); fputs(programa,"\n"); end end end end if (est) for i=1:n fputs(programa,[' mu',num2str(i),'(:,jt)=mu',num2str(i),'(:,jt)+',VARIABLE(i,:),';']); fputs(programa,"\n"); fputs(programa,[' dt',num2str(i),'(:,jt)=dt',num2str(i),'(:,jt)+',VARIABLE(i,:),'.^2;']); fputs(programa,"\n"); end end if (sum(s)>0) if (gra & est==0) for i=1:n fputs(programa,' for k=1:N'); fputs(programa,"\n"); fputs(programa,[' if (g(1,k)==',num2str(i),')']); fputs(programa,"\n"); fputs(programa,[' X(k,jt)=',VARIABLE(i,:),'(g(2,k)); break;']); fputs(programa,"\n"); fputs(programa,' end'); fputs(programa,"\n"); fputs(programa,' end'); fputs(programa,"\n"); end end if (est==0) fputs(programa,' fprintf(sortida,''%6d'',t);'); fputs(programa,"\n"); end for i=1:n if (niv(i)>=2 & est==0) fputs(programa,[' fprintf(sortida,''%12.4f'',',VARIABLE(i,:),');']); fputs(programa,"\n"); end if (s(i)==1) fputs(programa,[' ',VARIABLE(inic(i),:),'=',VARIABLE(i,:),';']); fputs(programa,"\n"); end end if (est==0) fputs(programa,' fputs(sortida,"\n");'); fputs(programa,"\n"); end fputs(programa,'end'); fputs(programa,"\n"); end if (est) fputs(programa,'end'); fputs(programa,"\n"); fputs(programa,'% OBTENCIO DELS RESULTATS ESTADISTICS'); fputs(programa,"\n"); if (sum(s)>0) fputs(programa,'jt=0;'); fputs(programa,"\n"); fputs(programa,'for t=t0:dt:T'); fputs(programa,"\n"); fputs(programa,' jt=jt+1;'); fputs(programa,"\n"); fputs(programa,' fprintf(sortida,''%6d'',t);'); fputs(programa,"\n"); end for i=1:n fputs(programa,[' mu',num2str(i),'(:,jt)=mu',num2str(i),'(:,jt)./R;']); fputs(programa,"\n"); fputs(programa,[' dt',num2str(i),'(:,jt)=dt',num2str(i),'(:,jt)./R;']); fputs(programa,"\n"); fputs(programa,[' dt',num2str(i),'(:,jt)=dt',num2str(i),'(:,jt)-mu',num2str(i),'(:,jt).^2;',"\n"]); if (dim) fputs(programa,[' for k=1:',num2str(d(i)),"\n"]); else fputs(programa,[' k=1;',"\n"]); end fputs(programa,[' if (dt',num2str(i),'(k,jt)<0)',"\n"]); fputs(programa,[' dt',num2str(i),'(k,jt)=0;',"\n"]); fputs(programa,[' end',"\n"]); if (dim) fputs(programa,[' end',"\n"]); end fputs(programa,[' dt',num2str(i),'(:,jt)=sqrt(dt',num2str(i),'(:,jt));']); fputs(programa,"\n"); if (niv(i)>=2) fputs(programa,' if(R>1 & ns)'); fputs(programa,"\n"); fputs(programa,' for k=1:np+1'); fputs(programa,"\n"); if (dim) fputs(programa,[' clear o; o(k,:)=zeros(1,',num2str(d(i)),");\n"]); else fputs(programa,' kk=1; o(k,kk)=0;'); fputs(programa,"\n"); end fputs(programa,' end'); fputs(programa,"\n"); fputs(programa,' for r=1:R'); fputs(programa,"\n"); fputs(programa,[' x=Y',num2str(i),'(:,jt,r);']); fputs(programa,"\n"); fputs(programa,[' x=(x-mu',num2str(i),'(:,jt))./dt',num2str(i),'(:,jt);']); fputs(programa,"\n"); if (dim) fputs(programa,[' for kk=1:',num2str(d(i)),"\n"]); end fputs(programa,' if(x(kk)=z(np))'); fputs(programa,"\n"); fputs(programa,' o(np+1,kk)=o(np+1,kk)+1;'); fputs(programa,"\n"); fputs(programa,' end'); fputs(programa,"\n"); fputs(programa,' for k=2:np'); fputs(programa,"\n"); fputs(programa,' if (z(k-1)<=x(kk) & x(kk)0) if (gra) fputs(programa,' for k=1:N'); fputs(programa,"\n"); fputs(programa,[' if (g(1,k)==',num2str(i),')']); fputs(programa,"\n"); fputs(programa,[' X(k,jt)=mu',num2str(i),'(g(2,k),jt);']); fputs(programa,"\n"); fputs(programa,' end'); fputs(programa,"\n"); fputs(programa,' end'); fputs(programa,"\n"); end end end fputs(programa,'% PRESENTACIO DELS RESULTATS ESTADISTICS'); fputs(programa,"\n"); if (sum(s)>0) for i=1:n if (niv(i)>=2) fputs(programa,' if (ns)'); fputs(programa,"\n"); fputs(programa,[' fprintf(sortida,''%12.4f'',mu',num2str(i),'(:,jt)-K.*dt',num2str(i),'(:,jt));',"\n"]); fputs(programa,' else'); fputs(programa,"\n"); fputs(programa,[' fprintf(sortida,''%12.4f'',mu',num2str(i),'(:,jt));']); fputs(programa,"\n"); fputs(programa,' end'); fputs(programa,"\n"); if (dim) fputs(programa,' fprintf(sortida,'' '');'); fputs(programa,"\n"); end end end fputs(programa,' fputs(sortida,"\n");'); fputs(programa,"\n"); fputs(programa,' if (R>1)'); fputs(programa,"\n"); fputs(programa,' fprintf(sortida,'' '');'); fputs(programa,"\n"); fputs(programa,' end'); fputs(programa,"\n"); for i=1:n if (niv(i)>=2) fputs(programa,' if (R>1)'); fputs(programa,"\n"); fputs(programa,' if (ns)'); fputs(programa,"\n"); fputs(programa,[' fprintf(sortida,''%12.4f'',mu',num2str(i),'(:,jt)+K.*dt',num2str(i),'(:,jt));',"\n"]); fputs(programa,' else'); fputs(programa,"\n"); fputs(programa,[' fprintf(sortida,''%12.4f'',dt',num2str(i),'(:,jt));']); fputs(programa,"\n"); fputs(programa,' end'); fputs(programa,"\n"); if (dim) fputs(programa,' fprintf(sortida,'' '');'); fputs(programa,"\n"); end fputs(programa,' end'); fputs(programa,"\n"); end end fputs(programa,' if (R>1)'); fputs(programa,"\n"); fputs(programa,' if (ns)'); fputs(programa,"\n"); fputs(programa,' fputs(sortida,"\n");'); fputs(programa,"\n"); fputs(programa,' fprintf(sortida,'' '');'); fputs(programa,"\n"); fputs(programa,' end'); fputs(programa,"\n"); fputs(programa,' end'); fputs(programa,"\n"); for i=1:n if (niv(i)>=2) fputs(programa,' if (R>1)'); fputs(programa,"\n"); fputs(programa,' if (ns)'); fputs(programa,"\n"); if (dim) fputs(programa,[' for k=1:',num2str(d(i)),"\n"]); else fputs(programa,' k=1;'); fputs(programa,"\n"); end fputs(programa,[' if (NS',num2str(i),'(jt,k)<0.5)']); fputs(programa,"\n"); fputs(programa,[' fprintf(sortida,''OK a %5.3f '',NS',num2str(i),'(jt,k));']); fputs(programa,"\n"); fputs(programa,' else'); fputs(programa,"\n"); fputs(programa,[' fprintf(sortida,''KO a %5.3f '',1-NS',num2str(i),'(jt,k));',"\n"]); fputs(programa,' end'); fputs(programa,"\n"); if (dim) fputs(programa,[' end',"\n"]); fputs(programa,' fprintf(sortida,'' '');'); fputs(programa,"\n"); end fputs(programa,' end'); fputs(programa,"\n"); fputs(programa,' end'); fputs(programa,"\n"); end end fputs(programa,' if (R>1)'); fputs(programa,"\n"); fputs(programa,' fputs(sortida,"\n\n");'); fputs(programa,"\n"); fputs(programa,' end'); fputs(programa,"\n"); fputs(programa,'end'); fputs(programa,"\n"); end end if (sum(s)>0) fputs(programa,'fclose(sortida);'); fputs(programa,"\n"); if (gra) fputs(programa,'% GENERANT GRAFICS'); fputs(programa,"\n"); fputs(programa,'if (N)'); fputs(programa,"\n"); fputs(programa,' newplot; hold on'); fputs(programa,"\n"); fputs(programa,'end'); fputs(programa,"\n"); for i=1:n fputs(programa,'for k=1:N'); fputs(programa,"\n"); fputs(programa,[' if (g(1,k)==',num2str(i),')']); fputs(programa,"\n"); fputs(programa,[' s=sprintf("%d;',VARIABLE(i,:),'(%d);",k-1,g(2,k));']); fputs(programa,"\n"); fputs(programa,' plot(t0:dt:T,X(k,:),s);'); fputs(programa,"\n"); fputs(programa,' end'); fputs(programa,"\n"); fputs(programa,'end'); fputs(programa,"\n"); end fputs(programa,'hold off'); fputs(programa,"\n"); end end if (est & sum(s)==0) for i=1:n if (niv(i)>=2) fputs(programa,['fprintf(''',VARIABLE(i,:),': '');']); fputs(programa,"\n"); fputs(programa,'if (ns)'); fputs(programa,"\n"); fputs(programa,'else'); fputs(programa,"\n"); fputs(programa,[' fprintf('' mitjana=%10.4f desviacio tipica=%10.4f \n'',mu',num2str(i),',dt',num2str(i),');']); fputs(programa,"\n"); fputs(programa,'end'); fputs(programa,"\n"); end end end if (est==0 & sum(s)==0) for i=1:n if (niv(i)>=2) fputs(programa,['fprintf(''',VARIABLE(i,:),'='');',"\n"]); fputs(programa,['fprintf('' %f'',',VARIABLE(i,:),');',"\n"]); fputs(programa,['fprintf(''\n'');',"\n"]); end end end fclose(programa);