eqnlin

8

Click here to load reader

Upload: rubem-soares

Post on 03-Aug-2015

14 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: eqnlin

Métodos Numéricos e Estatísticos Exercícios para o Matlab

Departamento de Matemática. Universidade de Aveiro

1

Equações não Lineares em MatLab

1. Escreva em Matlab a função r=bisec(f,a,b,n,eps) que determina uma aproximação da raiz da equação não linear f(x)=0 usando o método da bissecção, tomando como intervalo inicial [a,b], n iterações e com um erro inferior a eps. Nota: o parâmetro f indica o nome da função como string, o número máximo de iterações é 10

2. Escreva em Matlab a função r=cordafalsa(f,a,b,n,eps) que determina uma aproximação da raiz da equação não linear f(x)=0 usando o método da corda falsa, tomando como intervalo inicial [a,b], n iterações e com um erro inferior a eps. Nota: o parâmetro f indica o nome da função como string, o número máximo de iterações é 5

3. Escreva um programa em Matlab que dada a equação 1 – x tg(x) =0, x ≠ 0:

a. separa graficamente as raízes no intervalo (-pi/2, pi/2) b. usa o método da bissecção para aproximar a menor raiz positiva com um erro

inferior a 0.5 x 10-1 Nota: utilizar a função bisec do ex. 1. Este exercício corresponde ao ex 1. FP4 4. Escreva um programa em Matlab que dada a equação x10-1=0 e tomando como

intervalo inicial [0, 1.3]: a. usa o método da bissecção e da corda falsa, para em 5 iterações aproximar

a única raiz real desta equação. b. usa a função do Matlab fzero para procurar uma raiz no intervalo [0,1.3]. c. calcula o erro absoluto para cada aproximação e indica qual a melhor

aproximação. Nota: utilizar a função bisec e cordafalsa do ex. 1. Este exercício corresponde ao ex 2. FP4

5. Escreva um programa em Matlab que dada a equação ln (x) - 2x + 4 = 0, x ≠ 0:

a. separa graficamente as duas raízes positivas no intervalo ]0, 4] b. usa o método da bissecção e da corda falsa para aproximar a maior raiz

positiva com um erro inferior a 0.5 x 10-2 tomando como intervalo inicial [2,3]

Nota: utilizar a função cordafalsa do ex. 1. Este exercício corresponde ao ex 3. FP4 6. Escreva um programa em Matlab que dada a equação 2 ln (1+ e –2x ) +x - 3 = 0

a. separa graficamente duas raízes no intervalo [-10,10] b. usa o método da bissecção e da corda falsa, para aproximar a raiz positiva

deste equação tomando como intervalo inicial [2,3] com um erro inferior a 0.005

c. calcula o erro absoluto para cada aproximação Nota: utilizar a função bisec e cordafalsa do ex. 1. Este exercício corresponde ao ex 5. FP4

Page 2: eqnlin

Métodos Numéricos e Estatísticos Exercícios para o Matlab

Departamento de Matemática. Universidade de Aveiro

2

Notas sobre as funções do Matlab: Integração Numérica !" função FZERO: procura um zero de uma função de uma variável.

(Esta função encontram-se no Function and ODE Solver toolbox) r=FZERO(F,X) – procura um zero de F. F indica o nome da função como string. FZERO devolve um valor próximo daquele onde a função muda de sinal ou NaN se não consegue determinar um zero. O parâmetro X pode ser um escalar ou um vector: #" se X é um vector com duas componentes, X =[a,b], X representa um intervalo

onde F(a).F(b)<0, o zero é procurado nesse intervalo #" se X é um valor, X é usado como valor inicial, então FZERO é procurado num

intervalo onde a função F muda de sinal e que contenha X

Para utilizar a função fzero a função f(x) deverá ser definida num ficheiro externo. Por exemplo, para definir a função do exercício 3 pode ser criado o seguinte ficheiro f3.m :

Para procurar um zero desta função no intervalo [-1.5,0] deverá ser introduzido o seguinte comando do Matlab:

» r1=fzero('f3',[-1.5,0]) % o nome da função é passado como string r1 = -0.8603335890193 Para procurar um zero desta função tomando como aproximação inicial o valor –1 deverá ser introduzido o seguinte comando do Matlab:

» r1=fzero('f3', -1) % o nome da função é passado como string r1 = -0.8603335890193 Para procurar um zero desta função no intervalo [0,1.5] deverá ser introduzido o seguinte comando do Matlab:

» r2=fzero('f3',[0,1.5]) % o nome da função é passado como string r2 = 0.8603335890193

function y=f3(x) y=1-(x.*tan(x));

Page 3: eqnlin

Métodos Numéricos e Estatísticos Exercícios para o Matlab

Departamento de Matemática. Universidade de Aveiro

3

Resoluções dos exercícios: 1.

function r=bisec(fun,a,b,n,eps) %--------------------------------------------------------------------- % Esta função implementa o método da bissecção para determinar um valor % aproximado da raiz da equação não linear fun(x)=0 num intervalo dado % Para executar chamar: % r = bisec(fun,a,b,n,e) % Parâmetros de entrada % f - o nome da função como string % a,b - intervalo [a,b], f(a).f(b)<0 % n - numero máximo de iterações % eps - continuar o processo até que e(k)=abs(b(k)-a(k))/2 <= eps % Parâmetros de saída % r - valor aproximado da raiz %--------------------------------------------------------------------- echo off; a(1)=a; % os intervalos [a(k),b(k)] são armazenados nos vectores a,b b(1)=b; fa(1)= feval(fun,a(1)); % os vectores fa,fb armazenam os valores % fa(k)=f(a(k)),fb(k)=f(b(k)) fb(1)= feval(fun,b(1)); if fa(1)*fb(1) > 0; error('f(a) e f(b) tem o mesmo sinal. O método de bissecção requer f(a)*f(b)<0'); end; for k=1:n; x(k)=(a(k)+ b(k))/2; % os pontos médios são armazenados em x(k) y(k)=feval(fun,x(k)); % o vector y armazena os valores f(x(k)) if y(k)==0; r=x(k); % a raiz foi encontrada e(k)=0; break; end; e(k)=abs(b(k)-a(k))/2; % calcula o erro if e(k)<= eps; % se e(k) <= eps parar o processo r=x(k); % uma aproximação da raiz foi encontrada break; end; if fa(k)*y(k)<0; % se f(ak).f(bk)<0 então novo intervalo [a(k+1),b(k+1)]=[a(k),x(k)] a(k+1)=a(k); b(k+1)=x(k); fa(k+1)=fa(k); fb(k+1)=y(k); else % caso contrário então novo intervalo: [a(k+1),b(k+1)]=[x(k),b(k)] a(k+1)=x(k); b(k+1)=b(k); fa(k+1)=y(k); fb(k+1)=fb(k); end; end; if k>n and r=~0; disp (['Não foi possível encontrar um zero com erro <=,num2str(eps)]); else echo off; m=length(x); k=1:m; % # de iterações r=x(m); % o valor aproximado da raiz encontra-se em x(m) a=a(1:m); b=b(1:m); continua na página seguinte......

Page 4: eqnlin

Métodos Numéricos e Estatísticos Exercícios para o Matlab

Departamento de Matemática. Universidade de Aveiro

4

(continuação) 2.

function r=cordafalsa(fun,a,b,n,eps) %-------------------------------------------------------------------------- % Esta função implementa o método da corda falsa para determinar um valor % aproximado da raiz da equação não linear fun(x)=0 num intervalo dado % Para executar chamar: % r = cordafalsa(fun,a,b,n,e) % Parâmetros de entrada % f - o nome da função como string % a,b - intervalo [a,b] que contêm o zero % n - numero máximo de iterações % eps - continuar o processo até que e(k)=|b(k)-a(k)|/2 <= eps % Parâmetros de saída % r - valor aproximado da raiz %-------------------------------------------------------------------------- echo off; format long; a(1)=a; % os intervalos [a(k),b(k)] são armazenados nos vectores a,b b(1)=b; fa(1)= feval(fun,a(1)); fb(1)= feval(fun,b(1)); if fa(1)*fb(1) > 0; error('f(a) e f(b) tem o mesmo sinal. O método da corda false requer f(a)*f(b)<0'); end; for k=1:n; % determino o ponto que intersecta a secante com o eixo x x(k)= b(k) - (fb(k)* (b(k)-a(k))/(fb(k)-fa(k))); y(k)=feval(fun,x(k)); % o vector y armazena os valores f(x(k)) if y(k)==0; r=x(k); % a raiz foi encontrada e(k)=0; break; end; e(k)=abs(b(k)-a(k))/2; % calcula o erro if e(k)<= eps; % se e(k) <= eps parar o processo r=x(k); % uma aproximação da raiz foi encontrada break; end; if fa(k)*y(k)<0; % se f(ak).f(bk)<0 então novo intervalo [a(k+1),b(k+1)]=[a(k),x(k)] a(k+1)=a(k); b(k+1)=x(k); fa(k+1)=fa(k); fb(k+1)=y(k); else % caso contrário então novo intervalo: [a(k+1),b(k+1)]=[x(k),b(k)] a(k+1)=x(k); b(k+1)=b(k); fa(k+1)=y(k); fb(k+1)=fb(k); end; end;

continua na página seguinte...

% construir a tabela disp(''); disp('---------------------Método da bisecção --------------------'); disp(' Iteração a(k) b(k) x(k) y(k) Erro '); disp('--------------------------------------------------------------'); disp([k',a',b',x',y',e']) % os vectores transpostos disp('--------------------------------------------------------------'); format long; end

Page 5: eqnlin

Métodos Numéricos e Estatísticos Exercícios para o Matlab

Departamento de Matemática. Universidade de Aveiro

5

(continuação)

3.

% -------------------------------------------------------------------- % Este programa dada a equação 1-xtg(x)=0, x <>0 % 1. separa graficamente as raízes no intervalo (-pi/2, pi/2) % 2. usa o método da bissecção para aproximar a menor raiz positiva % % com um erro inferior a 0.5 x 10-1 % --------------------------------------------------------------------% 1. separa graficamente as raízes no intervalo (-pi/2, pi/2) echo off; format long; disp('Determinar as raízes de 1-x.tg(x)=0 é equivalente a determinar os pontos que intersectam'); disp('tg(x) e 1/x. Prima uma tecla para mostrar o gráfico das funções e os seus pontos de intersecção') disp('no intervalo (-pi/2, pi/2)'); pause; % determina os pontos (x,y1), (x,y2) para construir as funções x=-1.5:0.025:1.5; y1= feval('f1',x); % avalia a função definida em f1.m, f1(x)=tg(x) y2 =feval('f2',x); % avalia a função definida em f2.m, f2(x)=1/x % determina os zeros da função 1-x.tg(x)=0 r1=fzero('f3',[-1.5,0]);% determina uma raiz no intervalo [-1.5,0] r2=fzero('f3',[0,1.5]); % determina outra raiz no intervalo [0,1.5] fr1=feval('f2',r1); % avalia f1(x)=tg(x) na raiz r1 fr2=feval('f2',r2); % avalia f1(x)=tg(x) na raiz r2 X=[r1 r2]; % as abcissas das raízes Y=[fr1 fr2]; % as ordenadas das raízes % constrói o gráfico das funções f1=tg(x) e f2=1/x e os seus pontos de % intersecção (r1,fr1) e (r2,fr2), onde r1 e r2 correspondem aos zeros % da função 1-x tg(x) no intervalo (-pi/2, pi/2) % inicia gráfico figure(1); clf; % limpa a figura 1 hold on; whitebg('w'); title('Raízes da equação 1- xtg(x)no intervalo (-pi/2,pi/2)'); xlabel('x'); ylabel('y'); grid; a=-pi/2; % define os eixos de coordenadas b=pi/2;

continua na página seguinte...

if k>n and r=~0; disp (['Não foi possível encontrar um zero no intervalo dado com erro <= ',num2str(eps)]); else echo off; m=length(x); k=1:m; % # de iterações r=x(m); % a raiz está na ultima componente de x a=a(1:m); b=b(1:m); format short; disp('------------------Método da corda falsa-----------------------'); disp(' Iteração a(k) b(k) x(k) y(k) Erro '); disp('--------------------------------------------------------------'); disp([k',a',b',x',y',e']) % os vectores transpostos disp('--------------------------------------------------------------'); format long end

Page 6: eqnlin

Métodos Numéricos e Estatísticos Exercícios para o Matlab

Departamento de Matemática. Universidade de Aveiro

6

(continuação) 4.

% ----------------------------------------------------------------------- % Este programa dada a equação x10-1=0 e o intervalo inicial [0,1.3]: % 1.usa o método da bissecção e da corda falsa, para em 5 iterações % aproximar a única raiz real deste equação % 2.usa a função do Matlab fzero para procurar uma raiz no intervalo dado % 3.calcula o erro absoluto para cada aproximação % ------------------------------------------------------------------------- % 1.usa o método da bissecção e da corda falsa para, em 5 iterações, % aproximar a única raiz real deste equação rb= bisec('f4',0,1.3,5,0.0000005); rcf= cordafalsa('f4',0,1.3,5,0.00000005); format long; disp('A aproximação da raiz no intervalo [2,3]'); disp([' pelo método da bissecção: ',num2str(rb,8)]); disp([' pelo método da corda falsa: ',num2str(rcf,8)]); % 2.usa a função do Matlab fzero para procurar uma raiz no intervalo % [0,1.3] r=fzero('f4',[0,1.3]); disp(['A raiz no intervalo [0,1.3] é ',num2str(r,8)]); % 3.calcula o erro absoluto para cada aproximação eab=abs(r-rb); eacf=abs(r-rcf); disp('O erro absoluto da aproximação da raiz:'); disp([' pelo método da bissecção: erro=',num2str(eab,8)]); disp([' pelo método da corda falsa: erro=',num2str(eacf,8)]);

c=min(y1); d=max(y1); axis([a b c d]); % define os eixos de coordenadas % desenha os eixos de coordenadas plot([a b],[0 0],'b',[0 0],[c d],'b' ); % desenha as funções e os pontos onde se intersectam plot(X,Y,'or',x,y1,'r',x,y2,'g'); hold off; % fim do gráfico % 2. usa o método da bissecção para aproximar a menor raiz positiva % com um erro inferior a 0.5 x 10-1. O intervalo inicial é [0.5,1] disp(' '); disp('Prima uma tecla para determinar a aproximação da menor raiz ') disp(' positiva usando o método da bisecção no intervalo (0.5,1) com disp('um erro inferior a 0.05'); pause; r= bisec('f3',0.5,1,10,0.05); % o número máximo de iterações é 10 disp(['A raiz no intervalo (-1.5,0): r1= ',num2str(r1,8)]); %num2str(r1,8) - converte r1 a um string com 8 dígitos disp(['A raiz no intervalo (0,1.5) : r2= ',num2str(r2,8)]); disp(['Uma aproximação de r2 no intervalo (0.5,1) com um erro inferior a 0.05 é:',num2str(r,8)]);

Page 7: eqnlin

Métodos Numéricos e Estatísticos Exercícios para o Matlab

Departamento de Matemática. Universidade de Aveiro

7

5.

% --------------------------------------------------------------------------- % Este programa dada a equação ln(x)-2x+4=0 % 1. separa graficamente as duas raízes positivas no intervalo (0, 4] % 2. usa o método da corda falsa para aproximar a maior raiz positiva com % um erro inferior a 0.5 x 10-2, tomando como intervalo inicial [2,3] % ----------------------------------------------------------------------------- echo off; format long; disp('Determinar as raízes de ln(x)-2x+4=0 é equivalente a determinar os pontos que intersectam'); disp('y=ln(x) e a recta y=2x-4.'); disp('Prima uma tecla para mostrar o gráfico das funções e os seus pontos de interescção') disp('no intervalo (0, 4]'); pause; % determina os pontos (x,y1), (x,y2) para construir as funções x=0.01:0.025:4; y1= eval('log(x)'); % a função eval avalia uma função definida como string em x y2 = eval('2*x-4'); % determina os zeros da função ln(x)-2x+4=0 no intervalo (0,4] r1=fzero('f5',[0.001,1]);% determina uma raiz no intervalo [0.001,1] r2=fzero('f5',[2,3]);% determina uma raiz no intervalo [2,3] fr1=feval('log',r1); % avalia f1(x)=log(x) na raiz r1, a função log é definida pelo Matlab, fr2=feval('log',r2); % avalia f1(x)=log(x) na raiz r2 X=[r1 r2]; % as abcissas das raízes Y=[fr1 fr2]; % as ordenadas das raízes % constrói o gráfico das funções f1=log(x) e f2=2x-4 e os seus pontos de % intersecção (r1,fr1) e (r2,fr2), onde r1 e r2 correspondem aos zeros da % função ln(x)-2x +4 no intervalo (0, 4) figure(1); % visualiza a janela de gráficos que corresponde à figura 1 clf; % limpa a figura 1 hold on; whitebg('w'); title('Raízes da equação ln(x)-2x +4=0 no intervalo (0,4)'); xlabel('x'); ylabel('y'); grid; a=-1; % define os eixos de coordenadas b=4; c=min(y2); d=max(y2); axis([a b c d]); % define os eixos de coordenadas plot([a b],[0 0],'b',[0 0],[c d],'b' ); % desenha os eixos de coordenadas % desenha as funções e os pontos onde se intersectam plot(X,Y,'or',x,y1,'r',x,y2,'g'); hold off; % fim do desenho do gráfico % 2. usa o método da corda falsa para aproximar a maior raiz positiva com um % erro inferior a 0.005 disp(' '); disp('Prima uma tecla para determinar a aproximação da maior raiz positiva usando o método') disp('da corda falsa no intervalo (0,4) com um erro inferior a 0.005'); pause; rcf= cordafalsa('f5',2,3,10,0.005); format long; disp(['A raiz no intervalo (0,1): r1= ',num2str(r1,8)]); %num2str(r1,8) -converte r1 a um string com 8 dígitos disp(['A raiz no intervalo (2,3) : r2= ',num2str(r2,8)]); disp(['Uma aproximação de r2 no intervalo (2,3) com um erro inferior a 0.005 é:',num2str(rcf,8)]);

Page 8: eqnlin

Métodos Numéricos e Estatísticos Exercícios para o Matlab

Departamento de Matemática. Universidade de Aveiro

8

6.

% --------------------------------------------------------------------------- % Este programa dada a equação 2ln(1+ exp(-2x))+x-3 = 0 % 1. separa graficamente duas raízes no intervalo [-10,10] % 2. usa o método da bissecção e da corda falsa, para aproximar a raiz positiva % desta equação tomando como intervalo inicial [2,3] com um erro < 0.005 % 3. calcula o erro absoluto para cada aproximação da raiz % ----------------------------------------------------------------------------- echo off; format long; disp('Prima uma tecla para mostrar o gráfico da função y=2ln(1+ exp(-2x))+x-3 e as suas raízes') disp('no intervalo (-10, 10]'); pause; % determinar os pontos (x,y) para construir a função x=-10:0.025:10; y= feval('f6',x); % determinar os zeros da função y=2ln(1+ exp(-2x))+x-3 no intervalo (0,4] r1=fzero('f6',[-10,0]);% determina uma raiz no intervalo [-10,0] r2=fzero('f6',[0,10]); % determina uma raiz no intervalo [0,10] X=[r1 r2]; % as abcissas das raízes Y=[0 0]; % são zeros da função % construir o gráfico da funções f(x)=2ln(1+ exp(-2x))+x-3 indicando os seus % zeros no intervalo (-10, 10) figure(1); clf; % limpa a figura 1 hold on; whitebg('w'); title('Raízes da equação 2ln(1+ exp(-2x))+x-3 no intervalo (-10,10)'); a=-10; b=10; c=min(y); d=max(y); plot([a b],[0 0],'b',[0 0],[c d],'b' ); % desenha os eixos de coordenadas axis([a b c d]); % define os eixos de coordenadas xlabel('x'); ylabel('y'); grid; plot(X,Y,'or',x,y,'r'); % desenha a função e os seus zeros hold off; % fim do desenho do gráfico % 2. usa o método da bisecção e da corda falsa, para aproximar a raiz positiva % desta equação tomando como intervalo inicial [2,3] com erro < 0.005 disp(' '); disp('Prima uma tecla para determinar a aproximação da raiz positiva usando o) disp(' método da bissecção e da corda falsa no intervalo (2,3) com um erro inferior a 0.005'); pause; rb= bisec('f6',2,3,10,0.005); rcf= cordafalsa('f6',2,3,10,0.005); disp(['A menor raiz positiva no intervalo [0,10], r1= ',num2str(r1,8)]); disp(['A maior raiz positiva no intervalo [0,10], r2= ',num2str(r2,8)]); disp('A aproximação da raiz r2 no intervalo [2,3]'); disp([' pelo método da bisecção é: ',num2str(rb,8)]); disp([' pelo método da corda falsa é: ',num2str(rcf,8)]); % 3.calcula o erro absoluto para cada aproximação eab=abs(r2-rb); eacf=abs(r2-rcf); disp('O erro absoluto da aproximação da raiz r2:'); disp([' pelo método da bissecção: erroabs=',num2str(eab,8)]); disp([' pelo método da corda falsa: erroabs=',num2str(eacf,8)]);