1. 1
Exercício:
Escreva um código em Matlab para aplicar os métodos de Newton e da Bissecção no polinômio
de Bessel:
E compare as soluções.
Utilizamos os seguintes códigos para gerar os gráficos das soluções 1 e 2:
%%% Metodo de Newton-Raphson para derminacao de uma raiz de um polinomio %%%
function newton(f,x0,e,n)
tic;
clc;
clear all;
close all;
%%%Entradas%%%
syms x
X = zeros; %% Vetores utilizados para %%
Y = zeros; %% plotar a solucao %%
j = 1;
m = 600; %% m maximo %%
f = 0;
mf = 1;
if nargin < 1;
for j = 1 : m
mf = mf*j; %% m!
g = ((-3)^(j) * x ^ (2*j)) / (2^(2*j) * mf * (3*j - 1)) ; %% Construcao do Polinomio
f = g + f; %% de Bessel J -1/3(x)
end
f = f + 1; %% finalizando a construcao do poloinomio
x0 = 1.5; %% tentativa inicial
e = 10^-16; %% erro
n = 100000; %% numero maximo de iteracoes
end
df = diff(f); %% inicio do metodo de Newton %%
i = 1;
while i < n
p = x0 - subs(f,x0)/subs(df,x0);
fprintf('x%d = %f, f(x%d)= %fn', i,double(x0),i,double(subs(f,x0)))
X(i) = x0;
Y(i) = subs(f,x0);
if abs(p-x0) < e
break
2. 2
else
x0 = double(p);
i = i + 1;
end
end
toc;
if i == n && abs(p-x0) > e
fprintf('Necessita de mais iteracoes, por favor ajuste')
end %% Fim do metodo de Newton %%
plot(X,Y) %% Plotando solucao %%
3. 3
%%% Metodo da Bisseccao para derminacao de uma raiz de um polinomio
function bissecao(f,intinf,intsup,erro,max)
tic;
clc;
clear all;
close all;
%%%Entradas%%%
j = 1;
X = zeros; %% Vetores utilizados para %%
Y = zeros; %% plotar a solucao %%
m = 600; %% m maximo %%
mf = 1;
f = 0;
syms x
if nargin < 1;
for j = 1 : m
mf = mf*j; %% m!
g = ((-3)^(j) * x ^ (2*j)) / (2^(2*j) * mf * (3*j - 1)) ; %% Construcao do Polinomio
f = g + f; %% de Bessel J -1/3(x)
end
f = f + 1; %% finalizando a construcao do poloinomio
intinf = 1; %% cota inferior do intervalo
intsup = 7; %% cota superior do intervalo
erro = 0.0001; %% erro
max = 100000; %% numero maxiomo de iteracoes
end
aux = 1; %% comeco do metodo da bisseccao %%
while (aux < max)
x = (intinf+intsup)/2;
X(aux) = x;
Y(aux) = abs(subs(f,x));
if ( subs(f,x) == 0 || intsup - intinf < erro )
fprintf('A raiz é: %dn', x);
break
end
if sign(subs(f,x)) == sign (subs(f,intinf))
intinf = x;
else
intsup = x;
end
fprintf('[cota inferior]%d = %f, [cota superior]%d= %f, f(x%d)=
%fn',aux,double(intinf),aux,double(intsup), aux, double(subs(f,x))')
aux = aux + 1;
end %% Fim do metodo da Bisseccao %%
toc;
plot(X,Y) %% Plotando a solucao %
4. 4
Utilizando os dois códigos foi possível obter os seguintes gráficos de solução:
A primeira observação que podemos fazer quanto às soluções é o comportamento dos gráficos,
o método de Newton se comporta de forma linear em toda a solução já o método da Bissecção
se comporta de forma linear até ponto (2.5,0.3) o que nos mostra que o método da bissecção se
comporta de forma instável próximo a raiz o que acaba gerando uma perda de tempo na
conversão do método.
5. 5
Segue abaixo uma tabela com algumas informações sobre os métodos:
Newton Bissecção
Tempo(s) 12.29 7.09
Nº de Iterações 5 16
Erro 10^-16 0.00001
Observando o tabela podemos concluir que o método da bissecção embora tenha necessitado de
mais iterações foi mais eficaz para achar a raiz do polinômio em questão, porém para que
método convirja seu erro é muito mais elevado do que o do método de Newton.
Além das informações que constam na tabela também foi possível observar ao testar os códigos
que realmente o método de Newton se mostrou muito mais limitado do que o da Bissecção para
achar as raízes do polinômio de Bessel, pois para que o método convirja é necessário escolher
um x0 inicial que esteja de -7.4 até 7.4 o que acaba restringindo muito o método , já o método
da Bissecção se mostrou muito mais eficiente pois convergiu para qualquer intervalo com
distancia entre os pontos maior do que 2, assim podemos concluir que embora o erro utilizado
no método da Bissecção seja menor que o utilizado no método de Newton, ele é bem satisfatório
logo, o método da bissecção é mais indicado para a determinação das raízes do polinômio de
Bessel.