// Zenbakizko Kalkulua Ingeniari Kimikoentzat // OCW-EHU // http://ocw.ehu.es/irakaskuntza-teknikoak/zenbakizko-kalkulua-ingeniari-kimikoentzat/Course_listing // 8. gaia: OPTIMIZAZIOA // Ariketa 8_1 // Asier Aranzabal function x=urrezkosekzioa(a,b,fun) //******************************************************************************************************** // Metodo honek funtzio baten maximoa kalkulatzen du Urrezko Sekzio metodoaren bitartez. // Sarrerako datuak: // fun=optimizatu beharreko funtzioa. Dimentsio bakarrekoa. // a= kalkulua egiten hasteko tartearen behe-muturra. // b= kalkulua egiten hasteko tartearen goi-muturra. // tol= zehaztasun minimoa // // Emaitzak // xopt= funtzioa maximo egiten duen x aldagaiaren balioa. //******************************************************************************************************* // ALGORITMOAREN PRESTAKUNTZA // tolerantzi ez bada emanten berez 1e-6 balioa hartzen du tol = 1e-6; // Iterazio kopuru maximoa ezartzeko aldagaiak itermax=1000; iter=1; R=(5^0.5-1)/2; // Algoritmoa while abs(b-a)>tol; x2=R*a+(1-R)*b; x1=R*b+(1-R)*a; f1=feval(x1,fun); f2=feval(x2,fun); if f1>f2 then; xopt=x1; // funtzioa maximo egiten duen x balioa definitzen du. fxopt=f1; a=x2; // beheko tartea baztertu eta muga aldatzen du. else xopt=x2; // funtzioa maximo egiten duen x balioa definitzen du. fxopt=f2; b=x1; // goiko tartea baztertu egiten du. end errorea=abs(b-a); // emaitzak pantallan erakutsi. //printf('iter= %2d xopt= %1.8E f(xopt)= %7.8E errorea= %1.8E \n', iter,xopt,fxopt,errorea) iter=iter+1; x=xopt; end endfunction