1 / 18

Funções: Zeros, Máximos e Mínimos

Funções: Zeros, Máximos e Mínimos. Jorge Cruz DI/FCT/UNL Introdução aos Computadores e à Programação 1º Semestre 2005/2006. y. v 0. f ( a ). h max. . y 0. d max. (0,0). x. a. Generalização do Problema.

lise
Download Presentation

Funções: Zeros, Máximos e Mínimos

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Funções: Zeros, Máximos e Mínimos Jorge Cruz DI/FCT/UNL Introdução aos Computadores e à Programação 1º Semestre 2005/2006 Funções: Zeros, Máximos e Mínimos

  2. y v0 f(a) hmax  y0 dmax (0,0) x a Generalização do Problema • Um projéctil é lançado de uma altura de y0 metros, com um ângulo inicial de lançamento de  radianos e com uma velocidade inicial de v0 metros por segundo. • A trajectória do projéctil em coordenadas (x,y) modelada por: • Problema:determinar a distância máxima (dmax) e a altura máxima (hmax) atingidas pelo projéctil. • Equivalente: determinar o zero e o máximo de f(x) para x>0 Funções: Zeros, Máximos e Mínimos

  3. Zero de uma Função • O método de pesquisa dicotómica é um método simples para determinar um zero de uma função f num intervalo [xmin, xmax] sempre que o seu valor nos extremos do intervalo tenha sinais contrários, isto é: • f(xmin) * f(xmax) < 0. • A ideia consiste em: • dividir o intervalo no seu ponto médio xmed; • verificar se este ponto é aproximadamente um zero de f: |f(xmed)| (em que  é uma tolerância aceitável) • caso xmed não seja zero de f, aplicar o método de pesquisa dicotómica ao subintervalo: [xmin,xmed] se f(xmin)*f(xmed)<0 ou [xmed,xmax] se f(xmed)*f(xmax)<0 Funções: Zeros, Máximos e Mínimos

  4. Zero de uma Função • O método de pesquisa dicotómica assume que se conhece inicialmente o intervalo [xmin, xmax] onde: • f(xmin) * f(xmax) < 0. • Se f tiver mais que um zero nesse intervalo, o método apenas calcula um dos zeros. • Por cada iteração o intervalo de pesquisa é reduzido a metade. • É necessário indicar um valor de tolerância  para garantir que o algoritmo termina. • É possível definir como critério de paragem alternativo/complementar um valor mínimo para o tamanho do intervalo de pesquisa. Funções: Zeros, Máximos e Mínimos

  5. Zero de uma Função • A pesquisa dicotómica pode ser definida recursivamente em Octave pela função seguinte onde xmin e xmax representam os extremos do intervalo de pesquisa inicial e epsilon a tolerância: • Assume-se que a função f está definida no ficheiro f.m function z=zerof(xmin,xmax,epsilon) xmed=(xmin+xmax)/2; ymed=f(xmed); if abs(ymed)<=epsilon % cláusula base z=xmed; else % definição recursiva if f(xmin)*ymed<0 z=zerof(xmin,xmed,epsilon); else z=zerof(xmed,xmax,epsilon); endif; endif; endfunction; Funções: Zeros, Máximos e Mínimos

  6. Zero de uma Função • Para obter uma versão iterativa teria que se substituir a chamada recursiva por um ciclo while que apenas termine quando a aproximação estiver dentro da tolerância epsilon. function z=zerof(xmin,xmax,epsilon) xmed=(xmin+xmax)/2; ymed=f(xmed); while abs(ymed)>epsilon if f(xmin)*ymed<0 xmax=xmed; else xmin=xmed; endif; xmed=(xmin+xmax)/2; ymed=f(xmed); endwhile; z=xmed; endfunction; Funções: Zeros, Máximos e Mínimos

  7. Zero de uma Função • Uma versão um pouco mais optimizada evitaria calcular repetidamente f(xmin) para determinar o subintervalo a escolher. • Para isso bastará manter a condição de que f(xmin) é sempre negativo e f(xmax) sempre positivo. Assume-se que a condição é satisfeita inicialmente. function z=zerof(xmin,xmax,epsilon) xmed=(xmin+xmax)/2; ymed=f(xmed); while abs(ymed)>epsilon if ymed>0 xmax=xmed; else xmin=xmed; endif; xmed=(xmin+xmax)/2; ymed=f(xmed); endwhile; z=xmed; endfunction; Funções: Zeros, Máximos e Mínimos

  8. Aplicação ao Programa: trajectoria O programa principal, guardado no ficheiro “trajectoria.m”, chama a função maximos para calcular a distância e a altura máxima da trajectória. A distância máxima da trajectória corresponde ao zero de f. % Inicialização de Variáveis y0 = input(" Qual a altura inicial (m)? "); v0 = input(" Qual a velocidade inicial (m/s)? "); tet = input(" Qual o angulo inicial (rad)? "); dx = input(" Qual a precisao (m)? "); % Cálculo dos máximos [dmax, hmax]=maximos(y0,v0,tet,dx); % Apresentação de Resultados disp("Distância maxima da trajectoria (m):"); disp(dmax); disp("Altura maxima da trajectoria (m):"); disp(hmax); Funções: Zeros, Máximos e Mínimos

  9. A função f , guardada no ficheiro “f.m”, fica igual. function y=f(x,y0,v0,tet); g = 9.8; y = x*tan(tet)-(g*x^2)/(2*v0^2*cos(tet)^2)+y0; endfunction Funções: maximos e f function [dmax, hmax]=maximos(y0,v0,tet,dx); X = [0]; Y = [y0]; i = 1; while Y(i) > 0 i = i+1; X(i) =X(i-1) + dx; Y(i) = f(X(i),y0,v0,tet); endwhile hmax = max(Y); dmax = zerof(X(i),X(i-1),0.0001,y0,v0,tet); plot(X,Y); endfunction A função maximos detecta que o zero de f está entre os dois últimos pontos da trajectória testados e usa a função zerof para calcular o seu valor exacto (com uma tolerância de 0.0001). Funções: Zeros, Máximos e Mínimos

  10. Função: zerof function z=zerof(xmin,xmax,epsilon,y0,v0,tet) xmed=(xmin+xmax)/2; ymed=f(xmed,y0,v0,tet); while abs(ymed)>epsilon if ymed>0 xmax=xmed; else xmin=xmed; endif; xmed=(xmin+xmax)/2; ymed=f(xmed,y0,v0,tet); endwhile; z=xmed; endfunction A função zerof, que chama a função f, é alterada de modo a considerar os parâmetros adicionais y0, v0 e tet. Funções: Zeros, Máximos e Mínimos

  11. Máximo de uma Função • Uma variante do método de pesquisa dicotómica também pode ser usada para procurar o máximo de uma função f num determinado intervalo. • Considere o intervalo [xmin< xinter< xmax] com: • f(xinter) > f(xmin) e f(xinter) > f(xmax) • O seguinte método permite encontrar no intervalo anterior um máximo local (numa pequena vizinhança): • escolher o maior intervalo: [xmin,xinter] ou [xinter,xmax]; • dividir o intervalo no seu ponto médio xmed; • Se xmin<xmed<xinter aplicar o método de pesquisa ao subintervalo: [xmin<xmed<xinter] se f(xmed)>f(xinter) ou [xmed<xinter<xmax] se f(xmed)<f(xinter) • Se xinter<xmed<xmax aplicar o método de pesquisa ao subintervalo: [xinter<xmed<xmax] se f(xmed)>f(xinter) ou [xmin<xinter<xmed] se f(xmed)<f(xinter) • O algoritmo termina quando o intervalo de pesquisa é suficientemente pequeno: xmax  xmin (em que  é uma tolerância aceitável) Funções: Zeros, Máximos e Mínimos

  12. Máximo de uma Função • O método de pesquisa dicotómica assume que se conhece inicialmente o intervalo [xmin< xinter< xmax] onde: • f(xinter) > f(xmin) e f(xinter) > f(xmax) • Se f tiver mais que um máximo local nesse intervalo, o método apenas calcula um deles. • Não há garantias que o máximo local seja um máximo absoluto, mesmo que este exista no intervalo inicial. • Se os três pontos forem equidistantes, por cada 2 iterações o intervalo de pesquisa é reduzido pelo menos a metade. • É necessário indicar um valor de tolerância  para garantir que o algoritmo termina. • Um método semelhante pode ser usado para calcular um mínimo local de f. Funções: Zeros, Máximos e Mínimos

  13. Máximo de uma Função • A pesquisa dicotómica pode ser definida recursivamente em Octave pela função seguinte onde xmin e xmax representam os extremos do intervalo de pesquisa inicial, xinter o valor intermédio e epsilon a tolerância: • Assume-se que a função f está definida no ficheiro f.m function y=maximof(xmin,xinter,xmax,epsilon) if (xmax-xmin)<=epsilon % cláusula base y=f(xinter); else % definição recursiva if (xinter-xmin)>(xmax-xinter) x1=(xmin+xmax)/2; x2=xinter; else x1=xinter; x2=(xmin+xmax)/2; endif if f(x1)>f(x2) y=maximof(xmin,x1,x2,epsilon); else y=maximof(x1,x2,xmax,epsilon); endif; endif; endfunction; Funções: Zeros, Máximos e Mínimos

  14. Máximo de uma Função • Para obter uma versão iterativa teria que se substituir a chamada recursiva por um ciclo while que apenas termine quando a aproximação estiver dentro da tolerância epsilon. function y=maximof(xmin,xinter,xmax,epsilon) while (xmax-xmin)>epsilon if (xinter-xmin)>(xmax-xinter) x1=(xmin+xmax)/2; x2=xinter; else x1=xinter; x2=(xmin+xmax)/2; endif if f(x1)>f(x2) xinter=x1; xmax=x2; else xmin=x1; xinter=x2; endif; endwhile; y=f(xinter); endfunction; Funções: Zeros, Máximos e Mínimos

  15. Máximo de uma Função • Uma versão um pouco mais optimizada evitaria calcular repetidamente o valor de f nos pontos intermédios. • Para isso bastará acrescentar um parâmetro com o valor de f no ponto intermédio. Assume-se que o valor desse parâmetro é passado inicialmente. function y=maximof(xmin,xinter,xmax,finter,epsilon) while (xmax-xmin)>epsilon if (xinter-xmin)>(xmax-xinter) x1=(xmin+xmax)/2; x2=xinter; f1=f(x1); f2=finter; else x1=xinter; x2=(xmin+xmax)/2; f1=finter; f2=f(x2); endif if f1>f2 xinter=x1; xmax=x2; else xmin=x1; xinter=x2; endif; endwhile; y=finter; endfunction; Funções: Zeros, Máximos e Mínimos

  16. Aplicação ao Programa: trajectoria O programa principal, guardado no ficheiro “trajectoria.m”, chama a função maximos para calcular a distância e a altura máxima da trajectória. A altura máxima da trajectória corresponde ao máximo de f. % Inicialização de Variáveis y0 = input(" Qual a altura inicial (m)? "); v0 = input(" Qual a velocidade inicial (m/s)? "); tet = input(" Qual o angulo inicial (rad)? "); dx = input(" Qual a precisao (m)? "); % Cálculo dos máximos [dmax, hmax]=maximos(y0,v0,tet,dx); % Apresentação de Resultados disp("Distância maxima da trajectoria (m):"); disp(dmax); disp("Altura maxima da trajectoria (m):"); disp(hmax); Funções: Zeros, Máximos e Mínimos

  17. A função f , guardada no ficheiro “f.m”, fica igual. function y=f(x,y0,v0,tet); g = 9.8; y = x*tan(tet)-(g*x^2)/(2*v0^2*cos(tet)^2)+y0; endfunction Funções: maximos e f function [dmax, hmax]=maximos(y0,v0,tet,dx); X = [0]; Y = [y0]; i = 1; while Y(i) > 0 i = i+1; X(i) =X(i-1) + dx; Y(i) = f(X(i),y0,v0,tet); endwhile hmax = maximof(X(1),X(2),X(i),Y(2),0.0001,y0,v0,tet); dmax = zerof(X(i-1),X(i),0.0001,y0,v0,tet); plot(X,Y); endfunction A função maximos detecta que o máximo de f está entre o primeiro e o último ponto da trajectória (sendo o 2º ponto maior que ambos) e usa a função maximof para calcular o seu valor exacto (com uma tolerância de 0.0001). Funções: Zeros, Máximos e Mínimos

  18. Função: maximof function y=maximof(xmin,xinter,xmax,finter,epsilon,y0,v0,tet) while (xmax-xmin)>epsilon if (xinter-xmin)>(xmax-xinter) x1=(xmin+xmax)/2; x2=xinter; f1=f(x1,y0,v0,tet); f2=finter; else x1=xinter; x2=(xmin+xmax)/2; f1=finter; f2=f(x2,y0,v0,tet); endif if f1>f2 xinter=x1; xmax=x2; else xmin=x1; xinter=x2; endif; endwhile; y=finter; endfunction; A função maximof, que chama a função f, é alterada de modo a considerar os parâmetros adicionais y0, v0 e tet. Funções: Zeros, Máximos e Mínimos

More Related