• Sábado 4 de Mayo de 2024, 00:35

Autor Tema:  valor de maximo  (Leído 1862 veces)

yochule

  • Nuevo Miembro
  • *
  • Mensajes: 8
    • Ver Perfil
valor de maximo
« en: Miércoles 4 de Noviembre de 2009, 15:19 »
0
primero perdón por el titulo, no se como describir mejor la duda.
es así: tengo q encontrar, dentro de un proceso iterativo, el valor maximo de G, q es funcion de a. ok, eso lo puedo hacer. sin embargo después tengo q usar ese valor de 'a' q hizo máximo G para seguir otro loop. como hago para identificar o apartar ese valor de la variable 'a' q me hizo maximo a G?

for a=0.002:0.002:0.5;
omega=rpm*pi/30;
tangfi=(-1+sqrt(1+4*(v1/(omega*r))^2*a*(1-a)))/(2*a*v1/(omega*r));
fi=atan(tangfi);
aprima=v1*(1-a)/(omega*r*tangfi)+1;
f=N*(R-r)/(2*R*sin(fi));
F=2/pi*acos(exp(-f));
G=F*(1-a)*aprima

yo tomo 'a' como variable y la hago ir creciendo desde 0.002 hasta 0.5. de todas las varibles q se definen despues de 'a' (tangfi, fi, aprima, etc) tengo q quedarme con las q hacen a G maximo. como hago eso? despues de encontrar eso tengo q usar todas esas variables para otros calculos, por lo tanto no me interesa el valor maximo de G, sino los valores de 'a', tangfi, fi, etc.. q hicieron maximo a G.
gracias anticipadas!

Richi254

  • Miembro activo
  • **
  • Mensajes: 56
  • Nacionalidad: es
    • Ver Perfil
Re: valor de maximo
« Respuesta #1 en: Jueves 5 de Noviembre de 2009, 20:15 »
0
Ok, te he entendido :P
veamos, tu script es este:
for a=0.002:0.002:0.5;
omega=rpm*pi/30;
tangfi=(-1+sqrt(1+4*(v1/(omega*r))^2*a*(1-a)))/(2*a*v1/(omega*r));
fi=atan(tangfi);
aprima=v1*(1-a)/(omega*r*tangfi)+1;
f=N*(R-r)/(2*R*sin(fi));
F=2/pi*acos(exp(-f));
G=F*(1-a)*aprima,

Voy a hacerle un pequeño cambio, de modo que G sea un vector con todos los valores que ha ido tomando en función de 'a', ok? es haciendo esto sólo --> G(i)=F*(1-a)*aprima y descomponiendo antes del bucle 'a', así:

a=0.002:0.002:0.5;
for i=1:length(a)
omega=rpm*pi/30;
tangfi=(-1+sqrt(1+4*(v1/(omega*r))^2*a*(1-a)))/(2*a*v1/(omega*r));
fi=atan(tangfi);
aprima=v1*(1-a)/(omega*r*tangfi)+1;
f=N*(R-r)/(2*R*sin(fi));
F=2/pi*acos(exp(-f));
G(i)=F*(1-a)*aprima,
en  
   Ahora tenemos un vector G con todos los valores que ha ido tomando, ya sólo queda ver cual es el máximo, esto se hace así:

Gmax=max(G);

Bien ya tenemos el valor máximo de G, ahora hay que ver cual es el valor de 'a' que ha hecho que G sea máximo, para ello hacemos:
b=find(G,Gmax); % Esta función lo que hace es encontrar la posición de Gmax en G y como el vector 'a' está ordenado igual pues sólo tenemos que ver que valor se esconde en esa posición. así:
a_que_hace_maximo_G=a(b);

Y LISTO. ESPERO QUE TE SIRVA   :hola:

yochule

  • Nuevo Miembro
  • *
  • Mensajes: 8
    • Ver Perfil
Re: valor de maximo
« Respuesta #2 en: Jueves 5 de Noviembre de 2009, 20:35 »
0
encontre una manera de solucionarlo. se q no es la mas elegante y no me gusta mucho porq estoy calculando todo todo y despues de tener todo calculado busco el maximo. a mi me hubiera gustado encontrar la manera de deter el proceso de iteraciones una vez llegado al maximo. en este caso no es muy problematico porq solo son 250 iteraciones, pero si hubieran sido muchas mas seria problematico.

for i=1:250;
a(i,1)=0.002*i;
tangfi(i,1)=(-1+sqrt(1+4*(v1/(omega*r))^2*a(i,1)*(1-a(i,1))))/(2*a(i,1)*v1/(omega*r));
fi(i,1)=atan(tangfi(i,1));
aprima(i,1)=v1*(1-a(i,1))/(omega*r*tangfi(i,1))+1;
f(i,1)=N*(R-r)/(2*R*sin(fi(i,1)));
F(i,1)=2/pi*acos(exp(-f(i,1)));
G(i,1)=F(i,1)*(1-a(i,1))*aprima(i,1);
end

for j=5:245;
if G(j+1,1)>G(j,1)
max=j+1;
end
end

resultados=[a(max,1) tangfi(max,1) fi(max,1) aprima(max,1) f(max,1) F(max,1) G(max,1)]

el vector de resultados me identifica los elementos de las matrices q coinciden con el elemento q maximizo a G.
tu manera de escribir el codigo me parece q esta bastante mejor q la mia, (no conocia esa funcion b=find(G,Gmax)), asiq muchas gracias por el aporte!
sabes como deberia armar el codigo si no quiero q me calcule todos los puntos, solo q calcule hasta q encuentre el maximo? (ya se q es medio al pedo, puede pasar q el maximo sea uno de los ultimos valores, con lo cual estaria calculando casi todo otra vez) pero me ahorraria algunas cuentas si en vez de ser solo 250 iteraciones fueran 5000...no?
un abrazo y gracia otra vez

Richi254

  • Miembro activo
  • **
  • Mensajes: 56
  • Nacionalidad: es
    • Ver Perfil
Re: valor de maximo
« Respuesta #3 en: Jueves 5 de Noviembre de 2009, 21:01 »
0
ok, para lo nuevo que me preguntas basta con incluir dentro del if la sentencia break, esto es para salir del bucle sin llegar hasta el final: podría ser así:

for j=5:245;
if G(j+1,1)>G(j,1)
max=j+1;
break;
end

Ten cuidado y ponlo al final porque como llegues antes al break que al max=j+1; se sale y no guardas nada. El break es como un salto directo a la siguiente línea después del end que corresponde al for. De todos modos ¿te sale bien lo de max=j+1? porque piensa que lo que estás guardando en max es el valor de la posición donde se encuentra el máximo y no el máximo, yo creo que es mejor así:
max=G(j+1)   % Este es el valor máximo de G.

Richi254

  • Miembro activo
  • **
  • Mensajes: 56
  • Nacionalidad: es
    • Ver Perfil
Re: valor de maximo
« Respuesta #4 en: Jueves 5 de Noviembre de 2009, 21:07 »
0
ok, perdón, no habia visto lo de resultados,No tengas en cuenta el último comentario, así como lo tienes está perfecto porque lo que utilizas es la posición para ver el maximo de todas las demás variables. UN SALUDO.