Baixe o app para aproveitar ainda mais
Prévia do material em texto
Universidade Federal do Maranhão Bacharelado em Ciência e Tecnologia Curso de Cálculo Numérico 1º Trabalho Prático Prof. Dr. Kenio Alexsom de Almeida Silva Discente: Adriano Mitsuo Goto Trabalho completar para a nota da primeira avaliação da disciplina de Cálculo Numérico. Número de matrícula: 2013046440 São Luís / Maranhão 2015 Resolução da questão utilizando o programa Matlab Um modelo simplificado para a suspensão de um autom´ovel consiste em uma massa m, uma mola com constante el´astica k e um amortecedor com constante de amortecimento c, conforme mostrado na figura 7. Uma estrada esburacada pode ser modelada assumindo-se que a roda se mova para cima e para baixo de acordo com a equacão y = Ysin(ωt). A partir da solucão dessa equacão, o movimento do carro (massa-mola) para cima e para baixo é dado por x = Xsin(ωt−φ). A razão entre as amplitudes X e Y é dada por: Figura 01: Representação do veículo. Pode-se mostrar que o ângulo máximo que pode ser transposto por um veículo quando é o ângulo máximo para o qual a falha de suspensão não ocorre, satisfaz a equação: Asin(α)cos(α)+Bsin²(α)−Ccos(α)−Esin(α) = 0, Onde: A = l sin(β1), B = l cos(β1), C = (h+.5D)sin(β1)−.5D tan(β1), e E = (h+.5D)cos(β1)−.5D. Afirma-se que quando l = 89pol, h = 49pol, D = 55pol, e β1 = 11◦, o ângulo α é de aproximadamente de 33º. Verifique esse resultado. Cálculo dos termos A, B, C e E. A= l sin() A = 89 pol * sin(11°) A = 16.98200059 pol Arredondando, temos: A = 16.982 pol O erro cometido ao aplicarmos o arredondarmos foi de: Erro = | 16.98200056 – 16.982| = 0.00000059 = 5.9*10-7 B = l cos() B = 89 pol * cos(11°) B = 87.36481933 pol Arredondando, temos: B = 87.36482 pol O erro cometido ao aplicarmos o arredondarmos foi de: Erro = |87.36481933 – 87.36482| = 0.000000673 = 6.73 * 10-7 C = (h + .5D)sin() – .5D tan() C = (49 pol +0.5*55 pol) sin(11°) – 0.5*55 pol * tan(11°) C = 76.5 pol * sin(11°) – 27.5 pol * tan(11°) C = 14.59688815 pol – 5.345458501 pol C = 9.251429649 pol Arredondando, temos: C = 9.25143 pol O erro cometido ao aplicarmos o arredondamento foi de: Erro = |9.251429646 – 9.25143| = 0.000000351 = 3.51*10-7 E = (h +.5D)cos() - .5D E = (49 pol + 0.5*55 pol)cos(11°) – 0.5*55 pol E = 76.5 pol * cos(11°) – 27.5 pol E = 75.09447953 – 27.5 pol E = 47.59447953 pol Arredondando, temos: E = 47.59448 pol O erro cometido ao aplicar o arredondamento foi de : Erro = |47.59447953 – 47.59448| = 0.000000466 = 4.66*10-7 Assim, a equação fica na forma: 16.982pol*sin()cos() + 87.36482pol*sin²() – 9.25143pol*cos() – 47.59448pol *sin() = 0 Aproximação da raiz utilizando o método da bissecção. Seja , o método da bissecção, onde: a = 32.5° b = 33.5° O critério de parada será com base no tamanho do intervalo onde se encontra a raiz, que deverá ser menor que . Para k = 0 Verificando os valores na função: A raiz real está, então, entre e b. O erro relativo à é: Para k =1 Testando os valores na função: A raiz real está entre e . O erro relativo à é: Para k = 2 Testando os valores na função: A raiz real está entre e . O erro relativo à é: Para K = 3 Testando os valores na função: A raiz está entre e . O erro relativo à é: Para k = 4 Testando os valores na função: A raiz está entre e . O erro relativo à é: Para k = 5 Testando os valores: A raiz está entre e . O erro relativo à é: Para k = 6 Testando os valores: A raiz está entre e . O erro relativo à é: Para k = 7 Testando os valores: A raiz está entre e . O erro relativo à é: Para K = 8 Testando os valores: O erro relativo à é: Portanto, podemos tomar como a raiz real , com erro inferior à . Para a utilização do algoritmo no Matlab, algumas considerações devem ser feitas: O programa calcula o valor dos ângulos em radianos e não em graus. O critério de parada do algoritmo é mais sofisticado que comparado ao cálculo acima. Nele são levados em conta o erro absoluto das aproximações e o valor da função no ponto calculado. Portanto, o algoritmo apresentará um numero maior de interações. Fazendo a conversão dos dados iniciais, pela seguinte fórmula: Assim; Colocando os valores no programa, temos: Figura 02: Resultados obtidos utilizando o método da Bissecção. Fonte: Matlab O resultado apresentado pelo algoritmo é Fazendo a conversão para graus: Percebe-se, portanto, que há coerência no resultado obtido no cálculo anterior. Aproximação da raiz utilizando o método da posição falsa. Seja: O método da posição falsa para descobrir uma raiz real, tomando como dados iniciais: Para k = 0, temos: Fazendo o cálculo do erro relativo à : Portanto, há a necessidade se fazer uma nova iteração. Para k = 1, temos: Como , a raiz real está entre e . Assim: Fazendo o cálculo do erro relativo à : Portanto, podemos tomar a raiz real =33.0095°, com um erro menor que . Comparando com o algoritmo no Matlab, temos: Fazendo a conversão dos valores: Colocando os dados iniciais e o critério do erro inferior a , temos: Figura 03: Resultados obtidos pelo método da Posição Falsa. Fonte: Matlab O resultado fornecido pelo programa foi , convertendo para graus, temos: Percebe-se, portanto, que há coerência no resultado obtido no cálculo anterior. Aproximação da raiz real utilizando o método da Secante. Para o método de Newton, precisamos saber se no intervalo da raiz real a primeira derivada assuma o valor zero, isto é, se nesse mesmo intervalo tenha também uma raiz da derivada. Seja: E Plotando o gráfico da primeira derivada de : Figura 04: Gráfico da primeira derivada. Fonte: GeoGebra Ampliando para o intervalo [31,34], próximo da raiz real da função . Figura 05: Gráfico da deriva ampliado no intervalo [31,34] Fonte: GeoGebra Pelo gráfico, percebe-se que no intervalo da raiz real da função, há também raízes da derivada, o que torna o processo de convergência pelo o método lento ou ate mesmo indeterminado. Uma boa saída é utilizar o método das secantes, na qual substitui a derivada por um quociente da diferença, retirando, assim, o problema do ponto zero na derivada. Seja O método da secante e tomando como e . Para k = 0 Como o valor de está bem próximo da média de e , então não tem necessidade testar o erro relativo aos dois extremos, pois os valores serão bem próximos. Testaremos em , com relação à . Para k = 2 Calculando o erro relativo em : Portanto, podemos tomar como raiz real o valor , com um erro inferior à Verificando o comportamento do algoritmo no Matlab, com os mesmos dados iniciais que os métodos passados, temos: Figura 06: Resultado obtido utilizando o método da secante. Fonte: Matlab Percebe-se que o algoritmo precisou apenas de duas iterações para satisfazer os critérios pedidos, retornando um valor que tem as quatros primeiras casas decimais nulas na função. Convertendo para graus, temos: 33.0095139 ° Portanto, mostra-se que se obteve um valor bem aproximado com um número de iterações satisfatoriamente menor que comparado aos demais métodos. Quadro comparativo Abaixo, segue o quadro comparativo entre os métodos utilizados: Método Bissecção Posição Falsa Secante Número de iterações 12 7 2 33.00952° 33.00953° 33.00951°Determine α para a situação em que l, h e β1 tenham os valores indicados na parte (a), mas D = 30pol. Como apenas os valores de dos termos C e E irão mudar, o processo de convergência e até mesmo as contas necessária utilizando cada um dos métodos utilizados apresentarão comportamento similar ao item anterior, retirando, assim, a necessidade se fazer os cálculos braçais novamente. Ao invés disso, visto a eficiência dos algoritmos utilizados, serão feitos os cálculos apenas computacionalmente. Determinação dos coeficientes C e E. C = (h + .5D)sin() – .5D tan() C = (49pol + 0.5*30pol)*sin(11°) – 0.5*30pol*tan(11°) C = 64pol*sin(11°) – 15pol*tan(11°) C = 9.296071067 pol Arredondando, temos: C = 9.296071 pol Com um erro de arredondamento de: E = (h +.5D)cos() - .5D E = (49pol + 0.5*30pol)cos(11°) – 0.5*30pol E = 64pol*cos(11°) – 15pol E = 47.82413974 Arredondando, temos: E = 47.82414 Com um erro de arredondamento de: Assim, equação fica na forma: 16.982pol*sin()cos() + 87.36482pol*sin²() – 9.296071pol*cos() – 47.82414pol * sin() = 0 Aproximação da raiz utilizando o método da Bissecção. Como a equação mudou pouco em relação a anterior, esperamos, então, que a raiz esteja em um intervalo próximo à raiz anterior. Estimando então que a raiz esteja no intervalo [32, 34]. Verificando a existência de raiz nesse intervalo: Como , então há uma raiz no intervalo. Seja: O resultado obtido pelo algoritmo é: Figura 07: Resultado obtido pelo método da Bissecção. Fonte: Matlab Percebe- se foram necessárias quatorze iterações para se atingir a precisão desejada. O valor apresentado pelo programa é: Convertendo, temos: O que apresenta um ângulo levemente maior para evitar a falha dianteira quando se reduz o diâmetro da roda do veículo. O que era esperado geometricamente, a partir da figura 01. Aproximação da raiz real utilizando o método da Posição Falsa. Utilizando os mesmos dados iniciais que o método anterior, temos: Figura 08: Resultados obtidos utilizando o método da Posição Falsa. Fonte: Matlab Pelo resultado obtido, temos . O que, em graus, é . Aproximação utilizando o método da Secante. Sendo os mesmo dados iniciais, Figura 09: Resultados obtidos utilizando o método da Secante. Fonte: Matlab O resultado apresentando pelo algoritmo é , que em graus, é Quadro comparativo A tabela abaixo mostra a diferenças entre os métodos utilizados: Método Bissecção Posição Falsa Secante Número de iterações 14 9 3 33.18933° 33.18932° 33.18932° Percebe-se, independentemente da mudança da equação, que o método da Secante se mostrou mais eficaz que comparado aos demais métodos utilizados. O erro máximo pedido em todos os cálculos foi de . Estudos dos algoritmos empregados Método da Bissecação funcao = input(' Digite a funcao desejada:'); syms x fun = inline(funcao); a = input('Informe o intervalo inferior:'); b = input('Informe o intervalo superior:'); erro = input('Informe o erro maximo:'); ite = input('Informe o numero de iteracoes maxima: '); mostra = 1; k = 0; x = a; fa = eval(funcao); x = b; fb = eval(funcao); if ( sign(fa) * sign(fb) > 0) fprintf('O intervalo fornecido nao contem uma raiz real.Por favor, forneca um outro intervalo.\n'), return end fprintf('Calculo da raiz real usando o metodo da bisseccao.\n') fprintf(' ite a b x fx \n') while 1 k = k +1; x = (a + b) / 2; fx = eval(funcao); if mostra ~= 0 fprintf( '%2i %11.5f %11.5f %14.9e %1.9e\n', k, a, b, x, fx) end if ((abs(b - a) < erro && abs(fx)< erro) || k >= ite), fprintf('Podemos tomar a raiz real como x = %1.9f\n',x) break, end if sign(subs(funcao,x)) * sign(subs(funcao,a)) > 0 a = x; else b = x; end end Como visto no algoritmo acima, nas linhas 1 até 7 são comando de interface com o usuário, onde são informadas todos os dados necessários para o cálculo. Nas linhas 10 e 11 são feitas as avaliações dos valores da função no ponto a e b, verificando se há uma raiz real no intervalo fornecido. Caso haja uma raiz, o processo iterativo se inicia através do comando while que tem como condição o valor 1, isto é, enquanto houver o valor 1, o processo continuará executando. Dentro desse comando o contador k é incrementado e o valor da primeira aproximação x recebe a media aritmética dos extremos do intervalo e o seu valor é avaliado na função. Todos esses dados são impressos na tela nas linhas 19 e 20. O comando if da linha 19 apenas testa se o valor retornado ainda é 1. A parte mais importante do código está na linha 23, onde é verificada se o valor de x está no intervalo onde a função muda de sinal, isto é, se a condição do método é satisfeita. Caso o produto entre o f(a) e o f(x) for maior que zero, isso significa que os dois pontos possuem imagens com sinais iguais, portanto, não há raiz nesse intervalo. Logo, o novo extremo a esquerda do intervalo conterá o valor de x, ou seja, o x será o novo a. Caso contrario, isso significa que o intervalo possuem a raiz e pode ser restringido pela direita fazendo o x ser o novo b. A condição de parada do comando while é se a distancia entre a aproximação atual e a anterior seja menor que o erro fornecido e o valor na função seja também menor que o erro ou, então, a função chegue no zero absoluto ou se o numero de iterações máxima fornecida pelo usuário seja alcançada. Método da Posição Falsa funcao = input(' Digite a funcao desejada:'); syms x fun = inline(funcao); a = input('Informe o intervalo inferior:'); b = input('Informe o intervalo superior:'); erro = input('Informe o erro maximo:'); ite = input('Informe o numero de iteracoes maxima: '); mostra = 1; k = 0; x = a; fa = eval(funcao); x = b; fb = eval(funcao); if ( sign(fa) * sign(fb) > 0) fprintf('O intervalo fornecido nao contem uma raiz real.Por favor, forneca um outro intervalo.\n'), return end fprintf('Calculo da raiz usando o metodo da posicao falsa.\n') fprintf(' ite a b x fx \n') k = 0; while 1 k = k + 1; x = (a * fb - b * fa)/(fb - fa); fx = eval(funcao); if mostra ~= 0 fprintf('%2i %11.5f %11.5f %14.9e %1.9e\n', k, a, b, x, fx) end if ( (abs(b - a)< erro && abs(fx)<erro)||fx== 0||k >= ite) fprintf('\n\n') fprintf('Podemos tomar a raiz real como x = %1.9f\n',x), break, end if sign(fx) * sign(fa) > 0 a = x ; fa = eval(funcao); else b = x ; fb = eval(funcao); end end As primeiras quinze linhas do códigos são semelhantes ao código anterior. A parte essencial do código esta no dentro do comando while, especificamente na linha 28 onde é feita a condição do método, verificando de forma similar a do método da Bissecção. Caso o valor da aproximação de x na função contenha o mesmo sinal do valor do ponto a aplicado na função, então quer dizer que a raiz não está entre a e x, portanto, podemos restringir o intervalo pela esquerda fazendo a receber o valor de x, isto é, o x ser o novo a. Caso contrário, a raiz não está entre x e b, portanto o intervalo pode ser restringido pela direita fazendo x ser o novo b. Método da Secante funcao = input(' Digite a funcao desejada:'); syms x fun = inline(funcao); a = input('Informe o intervalo inferior:'); b = input('Informe o intervalo superior:'); erro = input('Informe o erro maximo:'); ite = input('Informe o numero de iteracoes maxima: '); mostra = 1; k = 0; x = a; fa = eval(funcao); x = b; fb = eval(funcao); if ( sign(fa) * sign(fb) > 0) fprintf('O intervalo fornecido nao contem uma raiz real.Por favor, forneca umoutro intervalo.\n'), return end disp('n a b x f(x)\n') while 1 k = k+1; x = a; fa = eval(funcao); x = b; fb = eval(funcao); z = (fb*(b -a))/(fb -fa); x = b - z; fx = eval(funcao); if mostra ~= 0 fprintf('%2i %11.5f %11.5f %14.9e %1.9e\n', k, a, b, x, fx) end a = b; b = x; if ( (abs(x-a)<erro && abs(fx)< erro)||fx == 0 ||k >= ite), fprintf('Podemos tomar a raiz real como x = %1.9f\n',x) break, end end As principais diferenças deste código para os demais já apresentados estão na forma de se obter a aproximação x nas linhas 21 e 22, opta-se pela forma ao invés de , por apresentar um menor número de operações, por conseguinte, um menor número de erros envolvidos. E na forma de restrição do intervalo que, diferentemente da Bissecção e da Posição Falsa, não há o critério de verificação de sinais da função nos pontos envolvidos nas linhas 27 e 28. Simplesmente se faz o b ser o novo a e o x ser o novo b. O que apesar de ser simples, o código demonstrou sua eficiência computacional em comparação aos outros dois métodos. Referências bibliográficas [1] - RUGGIERO, M. A. G. e LOPES, V. L. R. “Cálculo Numérico: Aspectos Teóricos e Computacionais”, 2ª Ed., Makron Books, 1996. [2] – FRANCO, N.B. “Cálculo Numérico”, 2ª ED., Pearson, 2007.
Compartilhar