A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

29 Outubro 2005Funções: Zeros, Máximos e Mínimos1 Jorge Cruz DI/FCT/UNL Programação para as Ciências Experimentais 1º Semestre 2005/2006.

Apresentações semelhantes


Apresentação em tema: "29 Outubro 2005Funções: Zeros, Máximos e Mínimos1 Jorge Cruz DI/FCT/UNL Programação para as Ciências Experimentais 1º Semestre 2005/2006."— Transcrição da apresentação:

1 29 Outubro 2005Funções: Zeros, Máximos e Mínimos1 Jorge Cruz DI/FCT/UNL Programação para as Ciências Experimentais 1º Semestre 2005/2006

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

3 29 Outubro 2005 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 [x min, x max ] sempre que o seu valor nos extremos do intervalo tenha sinais contrários, isto é: –f(x min ) * f(x max ) < 0. A ideia consiste em: –dividir o intervalo no seu ponto médio x med ; –verificar se este ponto é aproximadamente um zero de f: |f( x med )| (em que é uma tolerância aceitável) –caso x med não seja zero de f, aplicar o método de pesquisa dicotómica ao subintervalo: [x min,x med ] se f(x min )*f(x med )<0 ou [x med,x max ] se f(x med )*f(x max )<0

4 29 Outubro 2005 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 [x min, x max ] onde: – f(x min ) * f(x max ) < 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.

5 29 Outubro 2005 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; endfunction;

6 29 Outubro 2005 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;

7 29 Outubro 2005 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(x min ) para determinar o subintervalo a escolher. Para isso bastará manter a condição de que f(x min ) é sempre negativo e f(x max ) 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;

8 29 Outubro 2005 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);

9 29 Outubro 2005 Funções: Zeros, Máximos e Mínimos 9 Funções: maximos e f 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). 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 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

10 29 Outubro 2005 Funções: Zeros, Máximos e Mínimos 10 Função: zerof A função zerof, que chama a função f, é alterada de modo a considerar os parâmetros adicionais y0, v0 e tet. 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

11 29 Outubro 2005 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 [x min < x inter < x max ] com: –f(x inter ) > f(x min ) e f(x inter ) > f(x max ) O seguinte método permite encontrar no intervalo anterior um máximo local (numa pequena vizinhança): –escolher o maior intervalo: [x min,x inter ] ou [x inter,x max ]; –dividir o intervalo no seu ponto médio x med ; –Se x min <x med <x inter aplicar o método de pesquisa ao subintervalo: [x min f(x inter ) ou [x med <x inter <x max ] se f(x med )<f(x inter ) –Se x inter <x med <x max aplicar o método de pesquisa ao subintervalo: [x inter f(x inter ) ou [x min <x inter <x med ] se f(x med )<f(x inter ) –O algoritmo termina quando o intervalo de pesquisa é suficientemente pequeno: x max x min (em que é uma tolerância aceitável)

12 29 Outubro 2005 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 [x min < x inter < x max ] onde: – f(x inter ) > f(x min ) e f(x inter ) > f(x max ) 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.

13 29 Outubro 2005 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; endfunction;

14 29 Outubro 2005 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;

15 29 Outubro 2005 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;

16 29 Outubro 2005 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);

17 29 Outubro 2005 Funções: Zeros, Máximos e Mínimos 17 Funções: maximos e f 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). 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 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

18 29 Outubro 2005 Funções: Zeros, Máximos e Mínimos 18 Função: maximof A função maximof, que chama a função f, é alterada de modo a considerar os parâmetros adicionais y0, v0 e tet. 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;


Carregar ppt "29 Outubro 2005Funções: Zeros, Máximos e Mínimos1 Jorge Cruz DI/FCT/UNL Programação para as Ciências Experimentais 1º Semestre 2005/2006."

Apresentações semelhantes


Anúncios Google