Esta é uma pré-visualização de arquivo. Entre para ver o arquivo original
C�lculo Num�rico/apostilamatlab.pdf APOSTILA MATLAB 1 INTRODUÇÃO 1 2 EXEMPLOS SIMPLES 1 3 CARACTERÍSTICAS BÁSICAS 4 3.1 Área de Trabalho do MATLAB 4 3.2 Formato dos Números 5 3.3 Variáveis 5 3.4 Comentários e Pontuações 6 3.5 Operadores Relacionais 8 4 NÚMEROS COMPLEXOS 8 5 FUNÇÕES MATEMÁTICAS 9 6 GERENCIAMENTO DE ARQUIVOS 13 6.1 Arquivos Script (M-files) 13 7 CONSTRUÇÃO DE VETORES 17 7.1 ENDEREÇAMENTO DE VETORES 19 8 CONTROLES DE FLUXO NO MATLAB 21 8.1 Loops for 21 8.2 Loops while 22 8.3 Estruturas if-else-end 23 9 MATRIZES 25 9.1 Operações Escalares com Matrizes no MatLab 25 9.2 Operações entre Matrizes no MatLab 26 10 MANIPULAÇÃO DE GRÁFICOS 28 10.1 Estilo de Linhas e Cores: 33 11 EXEMPLOS DE APLICAÇÃO DE VETORES NA VISUALIZAÇÃO DE SINAIS REPRESENTADOS NO DOMÍNIO DO TEMPO 34 i 1 INTRODUÇÃO O MATLAB é uma ferramenta software que pode funcionar como uma simples calculadora ou até como uma linguagem de programação científica (fortran, C, etc.) para soluções de complicadas expressões algébricas. Entretanto, o MATLAB apresenta diversas vantagens em relação as calculadoras e linguagens de programação: simplicidade e uma interface gráfica bastante completa para visualização e análise dos resultados. 2 EXEMPLOS SIMPLES Os exemplos aqui apresentados tem o objetivo de demonstrar alguns tipos de problemas que podem ser resolvidos utilizando o Matlab. Como primeiro exemplo tem-se a utilização do Matlab como uma calculadora. Os comandos apresentados abaixo devem ser digitados diretamente no prompt (>>) do Matlab. O símbolo Í significa apertar a tecla Enter. >> 3+5+2 Í ans = 10 Neste exemplo foram digitados três números intercalados pelo símbolo +. Esta expressão para o Matlab significa a soma destes três números. Ao apertar a tecla Enter (Í) é apresentado o resultado desta operação que é 10. As letras ans significa answer, ou seja, resposta. O próximo exemplo mostra a capacidade de atribuir um valor a uma variável e realizar operações com estas variáveis. >> a = 5 Í a = 5 >> b = 33.50 Í b = 33.5000 >> a + b Í 1 ans 38.5000 Observe que neste exemplo foram atribuídos valores para as variáveis a e b e em seguida é feita uma operação somando os dois valores. Um comando interessante de apresentar neste momento é o who. Ao digitar este comando no prompt do Matlab e pressionar o Enter são apresentadas as variáveis utilizadas até o momento. O próximo exemplo fará a visualização da função ( )y A sin x= +. φ A seguir estão os comandos para apresentar o gráfico desta função com A=1 e φ =phi=0 . Estes comandos devem ser digitados diretamente no prompt do Matlab. >>A=1; Í >>phi = 0; Í >> x = 0:360; Í >> y = A*sin(2*pi*x/360+phi); Í >> plot(y,'k');grid on Í >>xlabel(‘Valores de x em graus’) Í >>ylabel(‘y’) Í >>title(‘Figura 1 : sin(2*pi*x/360)’) Í O resultado destes comandos é a plotagem de um ciclo do seno como mostrado na figura 1. Observe a necessidade da divisão por 360 para que seja possivel o aparecimento de um ciclo completo. Exercício : Plote um ciclo do seno como mostrado na figura 1.1 quando : i) A = 2 e φ = phi = 0. Use os comandos : >>A=2; Í >>phi = 0; Í >> x = 0:360; Í >> z = A*sin(2*pi*x/360+phi); Í >> plot(z,'k-');grid on Í 2 ii) A=2 e φ=phi=2*pi* 45/360. Use os comandos : >>A=2; Í >>phi = 2*pi*45/360; >> x = 0:360; Í >> v = A*sin(2*pi*x/360+phi); Í >> plot(v,'k');grid on Í iii) Finalmente use o comando : >> plot(x,y,‘k-.’,x, z,‘b-o’,x, v,‘r+’); grid on Í O MATLAB oferece as seguintes operações aritméticas básicas : Tabela 1 : Operações Aritméticas Básicas Operação Símbolo Exemplos adição, a + b + 8+3 subtração, a − b − 28−15 multiplicação, a.b ∗ 4.15∗8.10 divisão, a÷b / ou \ 64/5 ; 67\9 power, ab ^ 5^2 As expressões são executadas da esquerda para a direita com a seguinte ordem de precedência: operação de potência, seguida das operações de multiplicação e divisão, que por sua vez são seguidas pelas operações de adição e subtração. Parênteses podem ser usados para alterar esta ordem de precedências, onde as operações são executadas dos parênteses mais internos para os mais externos. 3 Figura 1 - Plotagem de um seno 3 CARACTERÍSTICAS BÁSICAS O MATLAB é uma ferramenta software que tem por característica básica a simplicidade de utilização e uma poderosa interface gráfica. Como qualquer software ou linguagem de programação é necessário haver uma adaptação à ferramenta. 3.1 Área de Trabalho do MATLAB A área de trabalho do MATLAB é onde ficam residentes os diversos comandos e valores de quaisquer variáveis que foram digitados na janela de comandos. Como aqueles comandos e variáveis estão residentes na área de trabalho do MATLAB, podem ser invocados sempre que for preciso ou desejado. Por exemplo, se quiser verificar o valor da variável a basta que se entre com o nome desta variável no prompt. >> a Í a = 5 Como já foi visto, se você não consegue lembrar das variáveis, pode-se obter uma lista de todas as variáveis usando-se o comando who 4 >>who Í Your variables are : a b x A phi ans y z v 3.2 Formato dos Números Como default, se um resultado é inteiro, o MATLAB mostra o número como inteiro. Igualmente, quando o resultado é real, o MATLAB mostra o número com 4 dígitos a direita do ponto decimal. Se os dígitos do resultado estiverem fora desta faixa, o MATLAB mostra o resultado usando a notação científica como numa calculadora científica. Este default pode, entretanto, ser modificado usando-se o Numeric Format da pasta general na linha Preferences do ítem Files na barra de menus. Exercício : Usando-se a variável b usado anteriormente, verifique a tabela de formatos numéricos abaixo : Tabela 2 : Formatos Numéricos Comando MATLAB b Comentários format long 33.50000000000000 16 dígitos format short e 33.500e+01 5 dígitos mais expoente format long e 33.50000000000000 e +01 16 dígitos mais expoente format hex 4040c00000000000 hexadecimal format bank 33.50 2 dígitos decimais format + + positivo, negativo ou zero format rat 67/2 racional format short 33.5000 4 dígitos decimais (formato default) 3.3 Variáveis Os nomes das variáveis devem consistir de uma única palavra, conforme as três regras abaixo : 5 Tabela 3 : Regras de Construção de Variáveis Regras de Construção das Variáveis Comentários/Exemplos Variáveis em letras minúsculas e maísculas são diferentes mesmo que consistam das mesmas letras Items, items, itEms e ITEMS são variáveis diferentes entre si no MATLAB As variáveis podem consistir de até 19 letras holnmbjkitkklwenohu As variáveis devem começar com alguma letra, podendo ser seguido por quaisquer letras, dígitos ou subescrito. Caracteres de pontuação não podem ser utilizados. how_about x512 a_b_c_d Em adição às regras acima para formação das variáveis, as seguintes variáveis são especiais no MATLAB : ans, pi, eps, flops, inf, NaN, i, j, nargin, nargout, realmin e realmax Tabela 4 : Variáveis Especiais Variáveis Especiais Significado ans Nome “default” da variável usado para resultados pi Constante igual à razão da circunferência de um círculo para o seu diâmetro eps O menor número tal que quando adicionado com um outro resulta em um número diferente flops Conta o número de operações em ponto- flutuante inf Indica um número infinito, p.e., 1/0 NaN Indica que não é um número, p. e., 0/0 i (e) j i=j= -1 nargin Número de argumentos de entrada usados em uma função nargout Número de argumentos de saída usados em uma função realmin O menor número real positivo utilizável realmax O maior número real positivo utilizável 3.4 Comentários e Pontuações 6 Todo e qualquer texto depois do símbolo de porcentagem (%), é tomado como sendo um comentário : >>n_macacos=10 % Número de macacos que vivem no bosque Í n_macacos= 10 Vários comandos podem ser colocados em uma linha se os mesmos forem separados por virgula ou ponto e vírgula : >>n_macacos=10, n_laranjas=20, n_uvas=1000; n_bananas=100 Í n_macacos= 10 n_laranjas= 20 n_bananas= 100 Observe que quando é utilizado ponto e vírgula o MATLAB não mostra o resultado. No exemplo acima, o valor atribuído à variável n_uvas não foi mostrado por causa do ponto e vírgula que foi utilizado. Observe agora o efeito dos três pontos (...) : >>clientes=10; Í >>n_uvas_por_cliente=n_uvas/... Í clientes Í 7 >>n_uvas_por_cliente= 100 Assim, os três pontos (...) indica ao MATLAB continuação da expressão matemática na próxima linha. 3.5 Operadores Relacionais Os operadores relacionais do Matlab incluem todas as comparações comuns e são apresentados na tabela 5. Tabela 5: Operadores relacionais Operador Descrição < Menor que <= Menor ou igual a > Maior que >= Maior ou igual a == Igual a ~= Diferente de 4 Números Complexos Os números complexos podem ser representados no MATLAB de diversas maneiras. Alguns exemplos são mostrados a seguir : >>x=1-4i % a letra “i” significa ou indica a parte imaginária Í x= 1.000 - 4.000i >>x=1-4j % a letra “j” também pode ser usada para indicar a parte imaginária Í x= 1.000 - 4.000i Identidade de Euler : relaciona a forma polar de um número complexo com a sua forma retangular 8 M M e a + M = a b = theta = tan b / a) a = M cos b = M sin j 2 2 -1 ∠ ≡ ⋅ = + ⋅ ⋅ θ θ θ θ θ ( bi No MATLAB, a conversão entre as formas polar e retangular de um número complexo utiliza as seguintes funções : real, imag, abs e angle. >>x Í x= 1.000 - 4.000i >>M=abs(x) Í M= 4.1231 >>theta=angle(x)*180/pi Í theta=-14.0362 >>a=real(x) Í a= 1 >>b=imag(x) Í b= -4 5 Funções Matemáticas Na tabela abaixo tem-se uma lista parcial das funções comuns que o MATLAB suporta. Tabela 6 : Funções Comuns abs(x) acos(x) acosh(x) angle(x) Valor absoluto ou magnitude de um número complexo Inverso do coseno Inverso do coseno hiperbólico Ângulo de um número complexo 9 asin(x) asinh(x) atan(x) atanh(x) conj(x) cos(x) cosh(x) exp(x) fix(x) floor(x) gcd(x,y) imag(x) lcm(x) log(x) log10(x) real(x) rem(x,y) round(x) sign(x) sin(x) sinh(x) sqrt(x) tan(x) tanh(x) Inverso do seno Inverso do seno hiperbólico Inverso da tangente Inverso da tangente hiperbólico Conjugado complexo Coseno Coseno hiperbólico Exponencial : ex Arredondamento em direção ao zero Arredondamento em direção ao menos infinito Máximo divisor comum dos inteiros x e y Parte imaginária de um número complexo Mínimo múltiplo comum dos inteiros x e y Logarítmo natural Logarítmo comum Parte real de um número complexo Resto da divisão de x/y Arredondamento para o inteiro mais próximo Função signum Seno Seno hiperbólico Raíz quadrada Tangente Tangente hiperbólico Uma função muito útil no estudo de princípios de comunicações, é a função retangular definida abaixo : ⎩⎨ ⎧ ≤− ≤= ) 2 t < ( 1 ) t < (0 1 f(t) ππ π No MATLAB, pode-se visualizar esta função a partir da função sign(x). Para um melhor entendimento, inicialmente é visualizado a função -sign(t) no intervalo -π ≤ t ≤ π . >>t=-pi:2*pi/100:pi; % Cria-se o vetor t com 100 elementos em Í >> % incrementos de 2*pi/100 Í >>y=-sign(t); >>plot(t,y,‘g+’); grid on Í >>title(‘Figura 2 : Função -sign(t)’) Í >>xlabel(‘t’) Í >>ylabel(‘-sign(t)’) Í A figura 2 mostra a plotagem da função –sign(t), no intervalo -π ≤ t ≤ π. 10 Figura 2 – Função –sign(t), no intervalo -π ≤ t ≤ π. Comparando-se a curva obtida da função -sign(t) com a definição da função retangular f(t), conclui-se que f(t) é a função -sign(t) deslocada de π, i.e. : f(t) = -sign(t - ), para 0 < t < 2π π Portanto, os seguintes comandos são suficientes para reproduzir a função retangular, f(t): >>t=0:2*pi/100:2pi; % Cria-se o vetor t com 100 elementos em Í >> % incrementos de 2*pi/100 Í >>y=-sign(t-pi); Í >>plot(t,y,‘g+’); grid on Í >>title(‘Figura 3 : Função retangular f(t)’) Í >>xlabel(‘t’) Í >>ylabel(‘f(t)’) Í Obtém-se o resultado mostrado abaixo (figura 3). 11 Figura 3 - Função retangular deslocada 12 6 Gerenciamento de Arquivos O MATLAB possui uma série de comandos para gerenciamento de arquivos, tais como listar os nomes de arquivos, vizualizar, deletar, etc. Na tabela abaixo tem-se um resumo dos principais comandos : Tabela 7 : Comandos para Gerenciamento de Arquivos cd p=cd cd temp cd .. chdir chdir path delete test dir ls matlabroot path pwd type test what which test Mostra o diretório de trabalho atual ou corrente Retorna para a variável p o diretório de trabalho corrente Muda para o diretório temp Muda para o diretório um nível acima O mesmo que cd O mesmo que cd temp deleta o arquivo test.m Lista todos os arquivos do diretório de trabalho presente Faz o mesmo que o comando dir Retorna o caminho do diretório onde se encontra o programa MATLAB executável Visualiza todos os caminhos de diretório do MATLAB O mesmo que o comando cd Visualiza o arquivo M-file test.m na janela de comandos Retorna uma lista de todos os M-files do diretório corrente Visualiza o caminho do diretório do arquivo test.m 6.1 Arquivos Script (M-files) Para resolver problemas simples, é cômodo e eficiente utilizar o MATLAB como se fosse uma calculadora, entrando-se com os comandos diretamente no prompt. Entretanto, a medida que o número de comandos aumenta, ou quando se deseja mudar o valor de uma ou mais variáveis e executar novamente os comandos, o uso do MATLAB simplesmente como calculadora torna-se ineficiente e tedioso. Nestes casos, o melhor é utilizar o MATLAB como uma linguagem de programação de alto nível, isto é, escrever um arquivo “script” ou M-files. Os M-files são os programas fontes do MATLAB e levam a extensão .m , por exemplo, exemplo1.m. Para escrever um programa no MATLAB, escolha File na barra de menu. Dentro do menu File escolha New e selecione M-file, como mostrado na figura 4. Abre-se, então, um editor de textos, onde pode-se escrever os comandos do MATLAB. Escreva, por exemplo, o programa abaixo : %===================================================== 13 % Exemplo de programação no MATLAB % Este exemplo plota uma função seno nas sequintes % condições: % sen(x) % 2*sen(x) % 2*sen(x+45) % 2*sen(x-90) % 2*sen(2*x) %============================================== % x=0:360; % % Seno com amplitude A=1 e defasagem phi=0 graus A=1; phi=0; y=A*sin(2*pi*x/360+2*pi*phi/360); % Seno com amplitude A=2 e defasagem phi=0 graus A=2; phi=0; z=A*sin(2*pi*x/360+2*pi*phi/360); % Seno com amplitude A=2 e defasagem phi=45 graus A=2; phi=45; v=A*sin(2*pi*x/360+2*pi*phi/360); % Seno com amplitude A= 2 e defasagem phi=-90 graus A=2; phi=-90; w=A*sin(2*pi*x/360+2*pi*phi/360); % Seno com amplitude A= 2 e defasagem phi=0 graus A=2; phi=0; u=A*sin(2*pi*2*x/360+2*pi*phi/360); % Plotagem do resultado plot(x,y,'k-',x,z,'k--',x,v,'k-.',x,w,'k.',x,u, 'ko') grid xlabel('Valores de x em graus') ylabel('y,z,v,w e u') title('Estudo de defasagem e amplitude de um seno') legend('sen(x)','2*sen(x)','2*sen(x+45)','2*sen(x-90)', '2*sen(2*x)') Uma vez escrito o programa, entre no menu File da janela do editor de textos e escollha a opção Save as... Nesta opção do menu, salve o programa como prog1.m 14 no seu diretório de trabalho. Em seguida, feche a janela do editor de textos, o que faz com que volte à janela de comandos do MATLAB. Na janela de comandos, use o comando cd para ir ao diretório onde o programa prog1.m foi salvo. Em seguida, digite : >>prog1 Í O gráfico mostrado na figura 5 é obtido. Figura 4. Procedimento para começar um novo M-file 15 Figura 5 - Senos deslocados Funções M-files : Por causa da grande utilidade dos M-files, o MATLAB possui diversas funções que tornam os M-files ainda mais interessantes. Estas funções estão listadas na tabela 8 : Tabela 8 : Funções M-files echo input pause pause(n) disp(ans) waitforbottonpress keyboard Ecoa cada um dos comandos do M-file na janela de comandos. Permite entrada de dados durante a execução do programa via teclado. Faz uma pausa na execução do programa até que uma tecla qualquer seja pressionada. Faz uma pausa de n segundos na execução do programa Visualiza os resultados sem mostrar os nomes das variáveis Faz uma pausa até que uma tecla do “mouse” ou do teclado seja pressionada. Passa o controle temporariamente para o teclado (“Type return to quit”) Como exemplo, escreva o seguinte programa (M-file) : % Exemplo de utilização da função M-file “input” %========================================= % Programa para traçar a curva : % % y=A.sin(x+phi), % % sendo que os valores de x [rad] ; A e phi [graus] devem ser % entrados via teclado durante a execução do programa % x=input(‘Entre com o vetor x [rad]> ’); A=input(‘Entre com o valor de A> ’); phi=input(‘Entre com o valor de phi [graus]> ’); % y=A*sin(x+2*pi*phi/360); plot(x,y,‘r’); grid on title(‘Exemplo de utilização da função “input”’) xlabel(‘x em rad/s’) ylabel(‘y=A.sin(x+phi)’) 16 7 CONSTRUÇÃO DE VETORES Nas construções das funções implementadas até agora, utilizou-se da construção de vetores. Agora, mostrar-se-á algumas outras formas de manipular vetores no MATLAB. Na tabela 8, tem-se um resumo das diversas formas de se construir um vetor no MatLab. Tabela 9. Construção de Vetores x=[2 2*pi sqrt(2) 2-3j] Cria um vetor x contendo os elementos especificados x=primero : último Cria um vetor x começando com o valor primeiro, incrementando-se de 1(um) em 1(um) até atingir o valor último ou o valor mais próximo possível de último x=primeiro:incremento:último Cria um vetor x começando com o valor primeiro, incrementando-se do valor incremento até atingir o valor último ou o valor mais próximo possível de último x=linspace(primeiro, último, n) Cria um vetor x começando com o valor primeiro e terminado-se no valor último, contendo n elementos x=logspace(primeiro, último, n) Cria um vetor com os elementos espaçado logaritmicamente, começando-se com o valor 10primeiro e terminando-se no valor 10último, contendo n elementos Exemplos : i) Uso da construção de vetor : x=[2 2*pi sqrt(2) 2-3j] >> x=[8 6 8.10 5-6j] Í x= 8.0000 6.0000 8.1000 5.0000-6.0000i ii) Uso da construção de vetor : x=primero : último >> x=1:10.5 Í 17 x= 1 2 3 4 5 6 7 8 9 10 iii) Uso da construção de vetor : x=primeiro:incremento:último >> x=1:0.5:10.5 Í x = Columns 1 through 7 1.000 1.5000 2.0000 2.5000 3.0000 3.5000 4.0000 Columns 8 through 14 4.5000 5.0000 5.5000 6.0000 6.5000 7.0000 7.5000 Columns 15 through 20 8.0000 8.5000 9.0000 9.5000 10.0000 10.5000 iv) Uso da construção de vetor : x=linspace(primeiro, último, n) >> x=linspace(1,10.5,5) Í x= 1.0000 3.3750 5.7500 8.1250 10.5000 v) Uso da construção de vetor : x=logspace(primeiro, último, n) >> x=logspace(0,2,5) Í x= 18 1.0000 3.1623 10.0000 31.6228 100.00 7.1 ENDEREÇAMENTO DE VETORES Seja : >> x=linspace(0,360,10) Í x= 0 40 80 120 160 200 240 280 320 360 >> y=sin(2*pi*x/360) Í y= Columns 1 through 7 0 0.6428 0.9848 0.8660 0.3420 -0.3420 -0.8660 Columns 1 through 10 -0.9848 -0.6428 0.0000 No exemplo acima, os vetores de entrada x e de saída y possuem 11 elementos cada um. No MatLab, cada um dos elementos de um vetor podem ser acessados através de seu índice que identifica cada uma das colunas. Por exemplo : >> x(3) % Acessa o terceiro elemento de x Í ans = 80 >> x(5) % Acessa o quinto elemento de x Í ans = 160 19 O MatLab também permite o acesso em blocos dos elementos de um vetor, como ilustrado nos exemplos a seguir : >> x(1:5) Í ans = 0 40 80 120 160 Neste exemplo, a expressão entre parêntesis “ 1:5 ” , diz para acessar os elementos de 1 a 5 do vetor x. >> x(2:2:8) Í ans = 40 120 200 280 A expressão entre parêntesis no comando acima, “ 2:2:8” , diz para que acesse os elementos do vetor x, começando-se do 2o. elemento e, a partir deste, contando-se de 2 em 2 até atingir o 8o. elemento. >> x(2:2:7) Í ans = 40 120 200 Este exemplo é igual ao anterior, mas como depois do 6o. elemento vem o 8o. elemento (pois a contagem é feita de 2 em 2), o 7o. elemento não é acessado. >> y(10:-2:1) Í 20 ans = 0.0000 -0.9848 -0.3420 0.8660 0.6428 A expressão entre parêntesis no comando, “ 10:-2:1” , diz para que acesse os elementos do vetor y, começando-se do 10o. elemento e, a partir deste, contando-se de 2 em 2 no sentido decrescente até atingir o 1o. elemento. >> y([8 5 10 1]) Í ans = -0.9848 0.3420 0.0000 0 Os elementos do vetor y são acessados na ordem indicada pelo vetor de índices [8 5 10 1], isto é : y(8), y(5), y(10) e y(1). 8 Controles de Fluxo no MatLab 8.1 Loops for Os loops for permitem que um conjunto de comandos seja repetido por um número de vezes fixo e pré-definido. A forma geral do loop for é : for x=n1:n2 comandos end Exemplo 1 : O vetor x=[0 36 72 108 144 180 216 252 288 324] pode ser construído com as seguintes instruções : >> x(1)=0; Í >> for n=2:10 Í x(n)=x(n-1)+36; Í 21 end Í >> x Í x = 0 36 72 108 144 180 216 252 288 324 Isto é, a primeira instrução diz : para n igual a 2 até 10, execute todas os comandos até a instrução de end. No primeiro ciclo do for, n=2, no segundo n=3 a assim por diante, até n=10. Depois do ciclo para n=10, o loop for termina e os comandos após a instrução end são executados, como é o caso da apresentação dos resultados em x. Exemplo 2 : Plote 360 pontos de um período da função y=sen(2*π*x/360) mostrado na figura 1 usando o loop for. >>for x=1:360 Í y(x)=sin(2*pi*x/360); Í end Í >>plot(y) Í 8.2 Loops while Ao contrário do loop for, que executa um conjunto de comandos um número fixo de vezes, o loop while executa um conjunto de comandos um número indefinido de vezes. A forma geral do loop while é : while expressão Comandos end Os comandos entre as instruções while e end são executadas enquanto todos os elementos na expressão forem verdadeiras. Exemplo : Construa o vetor y = [64 32 16 4 2 1] , usando o loop while 22 >>eps=128; Í >>n=0; Í >>while eps>1 Í eps=eps/2; Í n=n+1; Í y(n)=eps; Í end Í >>y Í 8.3 Estruturas if-else-end Em diversas situações, as seqüências de comandos tem de ser executadas condicionalmente, com base em um teste relacional. Isto pode ser resolvido por meio de alguma variação da estrutura if-else-end. A estrutura if-else-end mais simples é : if expressão Comandos end Os comandos entre as instruções if e end são executados se todos os elementos na expressão forem Verdadeiros (diferentes de zero). Exemplo 1 : » custo=5; » bananas=10; » if bananas>5 custo=0.1*custo; end » custo custo = 0.5000 No exemplo acima, a expressão bananas > 5 é verdadeira, assim o comando : 23 custo=0.1* custo foi executado, de modo que o novo valor de custo é igual a 0.5. Exemplo 2 : custo=5; » bananas=5; » if bananas>5 custo=0.1*custo; end » custo custo = 5 Neste exemplo, a expressão bananas > 5 é falsa, assim o comando : custo=0.1* custo não foi executado. Assim o custo continua igual a 5. Exemplo 3 : Plote a função retangular da figura 3 utilizando-se a estrutura if-else-end. % x=linspace(0,2*pi,100); % Criou-se 100 amostras entre 0 e 2*pi % for n=1:100 if x(n)<=pi f(n)=1; %Faz f(t)=1 para 0<t<=pi,i.e., %as primeiras 50 amostras de %f(t) são iguais a 1 else f(n)= -1; % Faz f(t)=-1 para pi<t<=2*pi, % i.e., as últimas 50 amostras de % f(t) são iguais a 1 end end plot(x,f, 'ko'); grid on 24 title('Figura II.3: Função retangular') xlabel('t em radianos') ylabel('f(t)') 9 MATRIZES Os vetores vistos até agora tratam-se de vetores linha, pois, possuem apenas 1(uma) linha com várias colunas. Também pode-se obter vetores coluna, isto é, vetores com apenas 1(uma) coluna e várias linhas : >> c=[1; 5; 6; 8; 10] Í c = 1 5 6 8 10 Se um vetor passa a consistir de várias linhas e colunas, denominamo-lo de Matrizes : >> m=[1 4 5 6; 5 10 3 20] % Este comando cria uma matriz 2×4 Í m= 1 4 5 6 5 10 3 20 Portanto, um vetor linha é um caso particular de uma matriz 1× N , e um vetor coluna é um caso particular de matriz N × 1. 9.1 Operações Escalares com Matrizes no MatLab Uma operação de adição, subtração, multiplicação e divisão de uma matriz com um valor escalar, é obtida simplesmente aplicado-se a respectiva operação em cada um dos elementos da matriz : 25 >> m=[1 4 5 6; 5 10 3 20] % Matriz 2×4 Í m= 1 4 5 6 5 10 3 20 >> m-2 Í ans= -1 2 3 4 3 8 1 18 No exemplo acima, de cada elemento da matriz m subtraiu-se o valor 2. Outro exemplo : >> 2*m-2 Í ans= 0 6 8 10 8 18 4 38 Cada elemento da matriz foi multiplicado por 2 e, posteriormente, subtraiu-se 2. y=(1:5)*0 % Cria um vetor linha com todos os elementos iguais a 0(zero) Í y= 0 0 0 0 0 9.2 Operações entre Matrizes no MatLab As operações entre matrizes requer que as mesmas tenham as mesmas dimensões, e as operações de adição, subtração, multiplicação e divisão são aplicados elemento-por- elemento : 26 >> g=[1 2 3 4; 5 6 7 8; 9 10 11 12] % g é uma matriz 3×4 Í g= 1 2 3 4 5 6 7 8 9 10 11 12 >> h=[1 1 1 1; 2 2 2 2; 3 3 3 3] % h é uma outra matriz 3×4 Í h= 1 1 1 1 2 2 2 2 3 3 3 3 >> g+h % adiciona a matriz g com a matriz h Í ans = 2 3 4 5 7 8 9 10 12 13 14 15 >> 2*g-h % Multiplica a matriz g por 2 e subtrai a matriz h do resultado Í ans= 1 3 5 7 8 10 12 14 15 17 19 21 >> g.*h % Multiplica a matriz g pela matriz matriz h elemento por elemento Í ans= 1 2 3 4 10 12 14 16 27 30 33 36 27 >> g./h % Divide a matriz g pela matriz matriz h elemento por elemento Í ans= 1.0000 2.0000 3.0000 4.0000 2.5000 3.0000 3.5000 4.0000 3.0000 3.3333 3.6667 4.0000 >> g % Chama a matriz g novamente Í g = 1 2 3 4 5 6 7 8 9 10 11 12 >> w=[1 2; 3 4; 5 6; 7 8] % Cria uma matriz 4×2 Í w= 1 2 3 4 5 6 7 8 >> g*w % Multiplicação da matriz g pela matriz w Í ans = 50 60 114 140 178 220 Observe que a operação g.*h é diferente da operação g*h. Enquanto que a primeira executa uma mutiplicação elemento-por-elemento de duas matrizes, a segunda executa uma multiplicação entre duas matrizes. 10 Manipulação de Gráficos Nesta secção mostrar-se-ão alguns comandos úteis para manipulação de gráficos. Pode-se adicionar curvas a um gráfico já plotado usando o comando hold. % Exemplo de utilização do comando hold %========================================= 28 % Geração da curva sin(x) : % % x=linspace(0,2*pi,30); y= sin(x); plot(x,y,‘r’); grid on title(‘Exemplo de utilização do comando hold’) xlabel(‘x em rad/s’) ylabel(‘y=sin(x)’) %Agora mantém-se acurva e acrescenta-se a curva do cosseno z= cos(x); hold on plot(x,z,’g’); ylabel(‘y1=sin(x); y2=cos(x)’) hold off O resultado é apresentado na figura 6. Figura 6: Exemplo do comando hold. Pode-se utilizar o comando subplot(m,n,p) para subdividir a janela de figura em uma matriz m-por-n de áreas de plotagem e escolher a p-ésima área para ser ativa. O exemplo seguinte ilustra a utilização deste comando. 29 % Exemplo de utilização do comando subplot(m,n,p) %========================================= % Geração das curvas % x=linspace(0,2*pi,30); y= sin(x); z=cos(x); a=2*sin(x).*cos(x); b=sin(x)./(cos(x)+eps); %o eps é uma variável especial do MatLab utilizada para %se evitar divisão por zero subplot(2,2,1); %ativa o subplot à esquerda superior dentre os 4 subplots plot(x,y); grid on title(‘sin(x)’) ylabel(‘y=sin(x)’) % subplot(2,2,2); %ativa o subplot à direita superior dentre os 4 subplots plot(x,z); grid on title(‘cos(x)’) ylabel(‘y=cos(x)’) % subplot(2,2,3); %ativa o subplot à esquerda inferior dentre os 4 subplots plot(x,a); grid on title(‘2sin(x)cos(x)’) xlabel(‘x em rad/s’) ylabel(‘y=2*cos(x)*sin(x)’) % subplot(2,2,4); %ativa o subplot à direita inferior dentre os 4 subplots plot(x,b); grid on title(‘sin(x)/cos(x)’) xlabel(‘x em rad/s’) ylabel(‘y=sin(x)/cos(x)’) O resultado é apresentado na figura 7. 30 Figura 7: Utilização do comando subplot. O uso do comando subplot(1,1,1) retorna ao modo default de utilização da janela de figura. Duas outras formas úteis de se construir gráficos são utilizando-se os comandos hist e stem. O Comando hist(y) desenha um histograma com 10 bins para os dados de um vetor y. hist(y,n) cria um histograma com n bins. hist(y,x), onde x é um vetor cria um histograma usando os bins especificados no vetor x. O exemplo seguinte ilustra o uso do hist. % Exemplo de gráficos usando hist %========================================= x=-2.9:0.2:2.9; %gera um vetor com os bins a serem usados em um dos gráficos y= randn(5000,1); %gera 5000 números aleatórios subplot(3,1,1); hist(y); %gera um histograma com 10 bins title(‘Histograma com 10 bins’) subplot(3,1,2); hist(y,20); %gera um histograma com 20 bins title(‘Histograma com 20 bins’) subplot(3,1,3); hist(y,x) %gera um histograma com os bins dados por x title(‘Histograma com bins dados por x’) 31 O resultado é dado pela figura 8. Figura 8: Exemplo de Histogramas. Para a representação de seqüências discretas, é útil a plotagem de gráficos com stem. stem(y) plota os dados do vetor y. stem(x,y) plota os valores do vetor y dados por x. O exemplo seguinte ilustra o uso do stem. % Exemplo de gráficos usando stem %========================================= x=1:50; %gera um vetor com os pontos do vetor y y= randn(50,1); %gera 50 números aleatórios subplot(1,2,1); stem(y); %gera um gráfico com os 50 pontos do vetor y title(‘stem(y)’) subplot(1,2,2); stem(x,y,’:‘); %gera um gráficos com os pontos do vetor y dados por x title(‘stem(x,y)’) O resultado é dado pela figura 9. 32 Figura 9: Exemplo de construção de gráficos com stem. 10.1 Estilo de Linhas e Cores: Nos exemplos anteriores, utilizamos diferentes estilos de linhas e cores. Os estilos de linhas e as cores podem ser especificados nos comandos de plotagem como um argumento do tipo caracter string (entre apóstrofes – por exemplo, ´c´), consistindo de 1,2 ou 3 caracteres. A tabela 11 apresenta estes caracteres. Tabela 11: Estilos de linhas e cores Símbolo Cor Símbolo Estilo de Linha y amarelo . pontos m magenta o círculos c cian x marcas x r vermelho + marcas mais g verde * marcas asterístico b azul - linha sólida w branco : linha pontilhada k preto -. linha com traço e ponto -- linha com segmentos de traço 33 11 EXEMPLOS DE APLICAÇÃO DE VETORES NA VISUALIZAÇÃO DE SINAIS REPRESENTADOS NO DOMÍNIO DO TEMPO Exemplo 1 : Escreva um M-file que visualize o sinal f(t) representada no domínio do tempo por : f(t) 1 (0 < t ( < t 2 = ≤− ≤ ⎧⎨⎩ π π π ) 1 Resolução : Na seção I.3.6, esta mesma função foi visualizada através da utilização da função sign(x). Neste exemplo, será utilizado somente o conceito de vetores : % x=linspace(0,2*pi,100) % Criou-se 100 amostras entre 0 e 2*pi % f=(1:50)*0+1 % Faz f(t) = 1 para 0 < t <= pi , i.e., as % primeiras 50 amostras de f(t) são % iguais a 0 f(51:100)=(1:50)*0 - 1 % Faz f(t) = -1 para pi < t <=2*pi, i.e., as % últimas 50 amostras de f(t) são % iguais a 1 plot(x,f, ‘ko’); grid on title(‘Figura II.3: Função retangular’) xlabel(‘t em radianos’) ylabel(‘f(t)’) Obter-se-á o resultado mostrado na figura II.3 Exemplo 2 : Escreva um M-file que visualize o sinal f(t) representada no domínio do tempo por : f(t) t 0 t 0 < t 1 -t / 2 + 3 / 2 1 < t 3 0 t > 3 = ≤ ≤ ≤ ⎧ ⎨ ⎪⎪ ⎩ ⎪⎪ 0 Resolução : % t=linspace(0,5,51); % Cria 51 amostras entre 0 e 5 % espaçados de 0.1 34 f(1:11)=t(1:11); % f(t) = t para 0<t<=1 f(12:31)=-t(12:31)/2 + 3/2; % f(t)=-t/2 + 3/2 para 1<t<=3 f(32:51)=(32:51)*0; f(t)=0 para t>3 % plot(t,f, ‘ko’); grid on title(‘Figura II.4 : Função Triangular’) xlabel (‘Tempo’) ylabel(‘f(t)’) Figura 2.3 - Função retangular Exercício : Faça as modificações necessárias no M-file do exemplo 2 de modo a visualizar 101 amostras da função f(t) no intervalo de 0 a 5. 35 Figura 2.4 - Função triangular 36 3 1 INTRODUÇÃO 2 EXEMPLOS SIMPLES 3 CARACTERÍSTICAS BÁSICAS 3.1 Área de Trabalho do MATLAB 3.2 Formato dos Números 3.3 Variáveis 3.4 Comentários e Pontuações 3.5 Operadores Relacionais 4 Números Complexos 5 Funções Matemáticas 6 Gerenciamento de Arquivos 6.1 Arquivos Script (M-files) 7 CONSTRUÇÃO DE VETORES 7.1 ENDEREÇAMENTO DE VETORES 8 Controles de Fluxo no MatLab 8.1 Loops for 8.2 Loops while 8.3 Estruturas if-else-end 9 MATRIZES 9.1 Operações Escalares com Matrizes no MatLab 9.2 Operações entre Matrizes no MatLab 10 Manipulação de Gráficos 10.1 Estilo de Linhas e Cores: 11 EXEMPLOS DE APLICAÇÃO DE VETORES NA VISUALIZAÇÃO DE SINAIS REPRESENTADOS NO DOMÍNIO DO TEMPO C�lculo Num�rico/CalcNumerico-Aula2.zip aula2.rtf CÁLCULO NUMÉRICO – AULA 2 1º SEMESTRE 1- Introdução C�lculo Num�rico/CalcNumerico-Aula3.zip aula 3.doc CÁLCULO NUMÉRICO – AULA 3 1º SEMESTRE 3 – Inversão de Matrizes Seja A uma matriz quadrada. A inversa de A, pode ser obtida por: Onde COF(A) é a matriz cofatora de A cujos elementos Cij são obtidos por: Cij = (-1) i+j . det (Âij) sendo a matriz Âij aquela resultante da eliminação da i-ésima linha e j-ésima coluna da matriz A . Exemplo: Seja a seguinte matriz os elementos Cij da cofatora de A são: C11 = (-1)1+1 det (l22) C11 = l22 C12 = (-1)1+2 det (l21) C12 = -l21 C21 = (-1)2+1 det (l12) C21 = -l12 C22 = (-1)2+2 det (l11) C22 = l11 Assim: a transposta é: e a inversa de A é: Podemos mostrar que a matriz obtida é de fato a inversa de A, lembrando que, por definição, a inversa de uma matriz multiplicada pela sua inversa resulta na matriz identidade, ou seja: A-1 . A = 1 Vamos então realizar este cálculo: 0 0 = Usando o resultado do exemplo anterior, temos que a inversa de: é : Assim, podemos encontrar a matriz D definida na aula anterior: D = A-1 . B ou seja: e: Exemplo: Ajuste uma reta aos seguintes valores: x f(x) 0 3,1 0,2 1 4,9 0,2 2 6,8 0,2 3 9,2 0,2 4 11,1 0,2 Partindo de: e calculando as somatórias: temos: então: e: Os erros nos parâmetros a e b são obtidos a partir da raiz quadrada dos elementos da diagonal principal da matriz de covariância. Assim: O resultado do ajuste é: P = (2,96 0,15)+ (2,03 0,06)x Exercícios: Ajuste uma reta aos seguintes conjuntos de valores: 1) x 1 3 5 7 9 C�lculo Num�rico/C�lculo Num�rico - Conceitos B�sicos.ppt Clique para editar o estilo do título mestre Clique para editar o estilo do subtítulo mestre * * * Cálculo Numérico Profs.: Bruno C. N. Queiroz J. Antão B. Moura Ulrich Schiel Maria Izabel C. Cabral Conceitos Básicos DSC/CCT/UFCG * * * Princípios usados em CN Comuns à análise matemática, C&T 1. Iteração ou aproximação sucessiva Partindo-se de solução aproximada, inicial, repetem-se mesmas ações/processos para refinar solução inicial OBS: para evitar trabalho sem fim (e de graça), deve-se determinar se a iteração converge (nem sempre é o caso...) e condições de parada * * * Princípios usados em CN 2. Discretização Na resolução de problemas contínuos (aqueles definidos matematicamente com uma passagem ao limite), inverte-se a passagem ao limite, discretizando o problema Ex: ~ Σ... * * * Princípios usados em CN 3. Aproximação Substituir uma função ou modelo por outro que ofereça comportamento (de interesse) semelhante, mais simples de manipular f(x) g(x) Ex: assíntotas ilustram comportamento “no limite” de uma função (complexa) de interesse * * * Princípios usados em CN 4. Transformação Dado um problema P, desmembra-se P em dois problemas mais simples de resolver, P1 e P2 Área de um trapézio por retângulo (P1) e triângulos (P2) * * * Princípios usados em CN 5. Divisão e Conquista Resolver um problema P, por partes ou etapas Exemplo anterior (área do trapézio) Aulas nesta disciplina de CN * * * Sistemas de numeração Representação não posicional romanos MDCCCXLIX e MMCXXIV Como seria MDCCCXLIX + MMCXXIV ? Representação semi-posicional hebraicos 1= א (aleph), 2= ב (beth), 10= י (yod), 100= ק(kuph), 11= י, 101= ק 15=טו (9+6) * * * Sistemas de numeração alemão Vinte e um = ein-und-zwanzig francês Noventa = quatre-vingt-dix deux * * * Sistemas de numeração Representação posicional Base decimal (10) 10 dígitos disponíveis [0,1,2, ... ,9] “Posição” indica potência positiva de 10 5432 = 5x103 + 4x102 + 3x101 + 2x100 * * * Sistemas de numeração Representação de inteiros Base binária (2) 2 “bits” disponíveis [0,1] “Posição” indica potência positiva de 2 1011 na base 2 = 1x23 + 0x22 + 1x21 + 1x20 = 8+0+2+1 = 11 na base decimal Ou, melhor 1x23 + 0x22 + 1x21 + 1x20 = 1 + 2(1+2(0+2(1))) = 11 * * * Sistemas de numeração Representação de números fracionários Base decimal (10) “Posição” da parte inteira indica potência positiva de 10 Potência negativa de 10 para parte fracionária 54,32 = 5x101 + 4x100 + 3x10-1 + 2x10-2 * * * Sistemas de numeração Representação de números fracionários Base binária (2) “Posição” da parte inteira indica potência positiva de 2 Potência negativa de 2 para parte fracionária 10,11 na base 2 = 1x21 + 0x20 + 1x2-1 + 1x2-2 = 2+0+1/2+1/4 = 2,75 na base decimal * * * Outros sistemas de numeração Maior interesse em decimal (10) Nossa anatomia e cultura e binário (2) Uso nos computadores Outros sistemas Octal (8), {0,1,2, ... , 7} Hexadecimal (16), {0,1,2, ... , 9, A,B,C,D,E,F} Dodecimal (relógio, calendário) * * * Alguns sistemas numéricos Decimal Binário Octal Hexadecimal 0 0 0 0 1 1 1 1 2 10 2 2 3 11 3 3 4 100 4 4 5 101 5 5 6 110 6 6 7 111 7 7 8 1000 10 8 9 1001 11 9 10 1010 12 A 11 1011 13 B 12 1100 14 C 13 1101 15 D 14 1110 16 E 15 1111 17 F . . . . . . . . . . . . * * * Conversão de sistema ou base Uma caixa alienígena com o número 25 gravado na tampa foi entregue a um grupo de cientistas. Ao abrirem a caixa, encontraram 17 objetos. Considerando que o alienígena tem um formato humanóide, quantos dedos ele tem nas duas mãos? * * * Conversão de base 1710 = 25b 17 = 2xb1 + 5xb0 17 = 2b + 5 b = (17-5)/2 = 6 * * * Conversão de base Um sistema ternário tem 3 "trits", cada trit assumindo o valor 0,1 ou 2. Quantos "trits" são necessários para representar um número de seis bits? * * * bits para trits 26 = 3y 64 = 3y y = maior inteiro {6xlog22/log23} y = 4 (33=27 < 64 < 34=81) * * * Conversão de Inteiro Binário para decimal Já visto Inteiro decimal para binário Divisão inteira (do quociente) sucessiva por 2, até que resto seja = 0 ou 1 Binário = composição do último quociente (Bit Mais Significativo – BMS) com restos (primeiro resto é bit menos significativo – bms) Em inglês, Most Significant Bit – MSB e least significat bit – lsb, respectivamente. * * * Conversão de inteiro Exemplo: Converter 25 decimal para binário 25 / 2 = 12 (quociente) e resto 1=bms 12 / 2 = 6 (quociente) e resto 0 6 / 2 = 3 (quociente) e resto 0 3 / 2 = 1 (último quociente=BMS) e resto 1 Binário = BMS ... bms = 1 1 0 0 1 = 1x24 + 1x24 + 0x22 + 0x21 + 1x20 = 16 + 8 + 0 + 0 + 1 = 25 decimal * * * Conversão de Inteiros entre Sistemas Procedimentos básicos: - divisão - polinômio - agrupamento de bits * * * Conversão (Inteiros) entre sistemas * * * Conversão (Inteiros) entre sistemas * * * Conversão (Inteiros) entre sistemas Conversão octal hexadecimal Não é realizada diretamente não há relação de potências entre as bases oito e dezesseis. Semelhante à conversão entre duas bases quaisquer base intermediária (base binária) Conversão em duas etapas: 1 - número: base octal (hexadecimal) binária. 2 - resultado intermediário: binária hexadecimal (octal). Joseana M. Fechine * * * Conversão de fração Operação inversa: multiplicar parte fracionária por 2 até que parte fracionária do resultado seja 0 (zero) Bits da parte fracionária derivados das partes inteiras das multiplicações Bit imediatamente à direita da vírgula = Parte inteira da primeira multiplicação * * * Conversão de fração Exemplo: converter 0,625 decimal para binário 0,625 x 2 = 1,25 logo a primeira casa fracionária é 1 ; nova fração (resto) é 0,25 (1,25-1=0,25) 0,25 x 2 = 0,5 segunda casa é 0 ; resto é 0,5 0,5 x 2 = 1,0 terceira casa é 1 ; resto é zero. Resultado: 0,62510 = 0,1012 * * * Conversão partes inteira,fracionária juntas Para converter um número com parte inteira e parte fracionária, fazer a conversão de cada parte, separadamente. * * * Conversão partes inteira,fracionária juntas (8,375)10 = ( ? )2 * * * Exercícios Mostre que: 5,8 = 101,11001100... , uma dízima. 11,6 = 1011,10011001100... a vírgula foi deslocada uma casa para a direita, pois 11,6 = 2 x 5,8 . * * * Representação em ponto (vírgula) flutuante - float Representação pode variar (“flutuar”) a posição da vírgula, ajustando potência da base. 54,32 = 54,32 x 100 = 5,432 x 101 = 0,5432 x 102 = 5432,0 x 10-2 Forma normalizada usa um único dígito antes da vírgula, diferente de zero Exemplo: 5,432 x 101 * * * Representação em ponto (vírgula) flutuante - float No sistema binário: 110101 = 110,101x23 = 1,10101x25 = 0,0110101x27 No caso dos números serem armazenados em um computador, os expoentes serão também gravados na base dois Como 310 = 112 e 7=1112 110,101 x (10)11 = 1,10101x(10)101 = 0,0110101x(10)111 Na representação normalizada, há apenas um “1” antes da vírgula Exemplo: 1,10101x(10)101 * * * Representação em ponto (vírgula) flutuante - float Algumas definições No número 1,10101x(10)101 , tomado como referência: 1,10101 = significando (ou “mantissa”) 101 = expoente OBS: a base binária não precisa ser explicitada (o computador usa sempre esta) O “1” antes da vírgula, na representação normalizada – se esta for adotada, também pode ficar implícito, economizando um bit (“bit escondido”). * * * Representação em ponto (vírgula) flutuante - float Representação genérica ±d0,d1d2...dtx(b)exp , t é o número de dígitos da mantissa d1d2...dt = mantissa, com 0 di (b-1) exp = expoente (inteiro com sinal) OBS: a base não precisa ser explicitada * * * Armazenamento de floats Na organização/arquitetura do computador, definir: Número de bits da mantissa (precisão, p) Número de bits do expoente Um bit de sinal (“0” para + e “1” para -) para o número (geralmente o primeiro, da esquerda) * * * Armazenamento de floats Ilustração Sinal do número: 0 = + e 1 = - Expoentes: 8 combinações possíveis 000 e 111 – especiais (ver adiante) 011 (310) = expoente zero 001 e 010 = expoente –2 e –1 (abaixo de zero) 100, 101 e 110 = expoentes 1, 2 e 3 (acima zero) OBS: Não podem seguir aritmética normal! Expoente (+/-) Significando Sinal * * * Armazenamento de floats 000 (especial) 001 (2-2) 010 (2-1) 011 (2 0) 100 (2 1) 101 (2 2) 110 (2 3) 111 (especial) Expoente (+/-) Sinal 0 = + 1 = - 1,0000 1,0001 .... .... 1,1111 1 = bit escondido Significando * * * Armazenamento de floats Ainda os expoentes na ilustração... Maior número positivo é (lembre do bit escondido) 0 110 1111 = + 23 x 1,1111 = 23 x (2- 2-4 ) = 1111,1 = 15,5 decimal Menor número positivo é (lembre do bit escondido) 0 001 0000 = + 2-2 x 1,0000 = 2-2 x 20 = 0,01 ou 0,25 decimal * * * Armazenamento de floats Combinações especiais dos expoentes na ilustração... 000 – representação NÃO normalizada Significando passa a ser 0,_ _ _ ... Expoente (000) = -2 Menor número positivo passa a ser 0 000 0001 = 2-2 x 0,0001 = 2-2 x 2-4 = 2-6 = 0,015625 * * * Armazenamento de floats Ainda as combinações especiais... Normalização não permite representar zero! 000 – representação NÃO normalizada 00000000 = + 0 decimal 10000000 = - 0 decimal São iguais em comparações * * * Armazenamento de floats Ainda as combinações especiais... 111 – representações de infinito 01110000 = + infinito 11110000 = - infinito 11111000 = indeterminação Outras combinações 11111_ _ _ = Not A Number (NANs) * * * Padrão IEEE para floats O padrão IEEE 754 para ponto (vírgula) flutuante é a representação mais comum para números reais em computadores de hoje, incluindo PC's compatíveis com Intel, Macintosh, e a maioria das plataformas Unix/Linux. OBS: Padrão 854 (base = 10 ou 2, nem especifica layout dos bits) * * * Padrão IEEE para floats O padrão (ou norma) IEEE 754 define dois formatos básicos para os números em ponto flutuante: o formato ou precisão simples, com 32 bits; e, o duplo com 64 bits. * * * Padrão IEEE 754 para floats Sinal: 0 = + e 1 = - Combinações Sinal + Expoente + Significando * * * IEEE 754 com precisão simples Expoentes na precisão simples c/256 combinações 1111 1111 sinal=1 e significando = 0...0 : -infinito sinal=0 e significando = 0...0 : +infinito sinal=1 e significando =10...0: indeterminado c/outras combinações: NAN * * * IEEE 754 com precisão simples Expoentes na precisão simples c/256 combinações 0111 1111 (12710) = expoente zero (bias = polarização) 0000 0001 = menor expoente = –126 (abaixo de um) 1111 1110 = maior expoente = +127 (acima de um) OBS: Expoente vale ( Número em binário MENOS 127) 0000 0000 sinal=1 e significando = 0...0 : -zero sinal=0 e significando = 0...0 : +zero * * * IEEE 754 com precisão simples Expoentes na precisão simples c/256 combinações (0) 0000 0000 (especial) (1) 0000 0001 (2-126) menor expoente .............. 0111 1100 (125) 0111 1101 (2-2) (126) 0111 1110 (2-1) (127) 0111 1111 (20) (128) 1000 0000 (21) (129) 1000 0001 (22) 1000 0010 ............. (254) 1111 1110 (2127) maior expoente (255) 1111 1111 (especial) * * * IEEE 754 com precisão simples Menor número positivo (lembre do bit escondido e não normalizada) 0 00000000 00….01 = 2-126 x 2-23 = 2-149 Maior número positivo (lembre do bit escondido) 0 1111110 11...11 = 2127 x (2-2-23) A faixa de números negativos é: de –(2-2-23) x 2127 a –2-149 * * * IEEE 754 com precisão dupla No formato (precisão) duplo, o menor expoente é representado por 00000000001, valendo -1022, e o maior expoente é representado por 11111111110, valendo +1023. Em ambos os casos, o expoente vale o número representado em binário menos 1023 (este é o valor da bias = zero). * * * IEEE 754 com precisão dupla Verifique: Menor número positivo (lembre do bit escondido e não normalizada) 0 00000000000 00….01 = 2-1022 x 2-52 = 2-1074 Maior número positivo (lembre do bit escondido) 0 1111110 11...11 = 21023 x (2-2-52) A faixa de números negativos é: de –(2-2-52) x 21023 a –2-1074 * * * IEEE 754 com precisão simples Expoentes na precisão dupla c/2048 combinações (0) 00000000000 (especial) (1) 00000000001 (2-1022) menor expoente .............. 01111111100 01111111101 (2-2) (1022) 01111111110 (2-1) (1023) 01111111111 (20) (1024 10000000000 (21) 10000000001 (22) 10000000010 ............. (2046) 11111111110 (21023) maior expoente (2047) 11111111111 (especial) * * * Quadro resumo IEEE 754 * * * Erro na representação de floats Número finito de bits na representação (número é apenas “maior” na precisão dupla), implica em “truncamento” (ou arredondamento) do número real a ser representado. Truncamento introduz erro na representação. Casos especiais: Overflow: número a representar é maior que maior número possível de ser representado Underflow: número a representar é menor que menor número possível de ser representado * * * Limite no erro na representação de um float A forma normalizada do número N é 1,n x 2e Supõe-se que e esteja dentro dos limites dessa representação (ou ocorreria overflow). Se n não couber no número de bits da representação (precisão) do significando, p, haverá truncamento, introduzindo erro. * * * Limite no erro na representação de um float A forma normalizada do número N é 1,n x 2e Ex: N = 1,101011110100101… x 2e e que p número de bits (precisão) do significando seja 4. A representação de N seria 1,1010 x 2e gerando um ErroN = 0,11110100101… x 2c-4 O erro relativo é definido como EN = ErroN / N , ou: 0,11110100101… x 2c-4 / 1,101011110100101… x 2e = 0,11110100101… x 2-4 / 1,101011110100101… * * * Limite no erro na representação de um float Note que EN será máximo quando o numerador for máximo e o denominador for mínimo, ou seja: EN (max) = 0,1111111….. x 2-4 / 1,0000000… Lembrando que 0,11111…. < 1 , tem-se: EN (max) < 2-4 , onde 4 está representando p, número de bits (precisão) do significando. Portanto, EN (max) < 2 –p, para representações normalizadas. * * * Aritmética com floats Conhecidos os erros em dois números, é possível determinar o erro de uma operação entre eles, como adição, subtração, multiplicação e divisão. Erro depende de método / procedimentos empregados * * * Aritmética com floats Padrão IEEE 754 define algoritmo para adição, subtração, multiplicação, divisão e raiz quadrada e exige que implementações produzam o(s) mesmo(s) resultado(s). Igualdade dos bits (resultados) em várias processadores Transportabilidade de software Vide próximo módulo * * * Exercício Nr. 1 Seja a seguinte representação de números positivos em ponto flutuante: Bit 7. Bit 6. Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 Sinal do expoente EXPOENTE MANTISSA Sendo que o expoente é representado diretamente pelo respectivo número binário e os números são normalizados pela primeira casa decimal, ou seja 4.5 é representado como 0.45 101 ou, em binário, 100.1 é representado por 0.1001 211 o que daria 00111001 na representação acima. 1) Qual o maior e o menor número positivo que podem ser representados neste formato? Mostre o resultado em decimal, binário e na representação interna. 2) Com fica a situação do número 0? Sugira uma solução. 3) Represente, neste formato os números (decimais) 13, 0.12 e 3.501. Em quais números ocorreram erros de representação? 4) Seja a representação 00101000. Ela representa qual número? Se eu subtrair 0.12 deste número, como seria representado o número resultante? * * * Exercício Nr. 2 Repita os itens 3 e 4 do exercício anterior, agora usando a representação em ponto flutuante de 8 bits vista anteriormente neste documento. Determine, para ambas as representações, a densidade dos números maiores que 1, ou seja, a distância entre dois números subseqüentes. SUGESTÃO: tome a representação de um número qualquer some 0.0001 à mantissa e calcule a diferença entre estes dois números. C�lculo Num�rico/C�lculo Num�rico - Erros.ppt Clique para editar o estilo do título mestre Clique para editar o estilo do subtítulo mestre * * * Cálculo Numérico Módulo II Profs.: Bruno Correia da N. Queiroz Maria Izabel C. Cabral Ulrich Schiel Erros DSC/CCT/UFCG * * * Erros Existência Tipos Propagação * * * Erros Existência * * * Erros - Existência Erros estão sempre presentes nas soluções numéricas Dados representados por intervalo: imprecisão na medição ou incerteza sobre o valor verdadeiro. (Exemplo: 50,3 ± 0,2 cm) Erro Inerente * * * Erros - Existência Erros estão sempre presente nas soluções numéricas os métodos numéricos geralmente são aproximados, iterativos, buscando minimizar o erro erro de truncamento * * * Erros - Existência Erros estão sempre presente nas soluções numéricas a representação dos números reais, com um número finito de dígitos, dependem da máquina utilizada podendo exigir aproximações (lembremos que um número, pode ter representação finita em uma base e não finita em outra) erro de representação. * * * Erros - Existência Erros estão sempre presente nas soluções numéricas A conversão de bases pode acarretar erros erro de conversão Operações com dados imprecisos/incertos acarretam propagação do erro. * * * Erros - Existência Ex. 01: Calcular a área de uma circunferência de raio 100 m Resultados: (1) A = 31400 m2 (2) A = 31416 m2 (3) A = 31414,92654 m2 * * * Erros - Existência (1) A = 31400 m2 (2) A = 31416 m2 (3) A = 31414,92654 m2 Como justificar as diferentes áreas calculadas? Os resultados dos cálculos realizados dependem da representação dos números nas máquinas utilizadas. não tem representação finita, sempre será representado de forma aproximada: 3,14, 3,1416 e 3,141592654, para os cálculos 1,2 e 3, respectivamente. * * * Erros - Existência Ex. 02: Calcular usando uma calculadora e um computador: , para xi = 0,5 e xi = 0,1 Resultados: para xi=0,5 calculadora: S= 1500 computador: S= 1500 para xi =0,1 calculadora: S= 300 computador: S=300.00909424 (precisão simples) S=299.999999999999720 (dupla) * * * Erros - Existência Resultados: para xi=0,5 calculadora: S= 15000 computador: S=15000 para xi =0,11 calculadora: S= 3300 computador: S= 3299.99691 Os resultados dos cálculos realizados dependem da representação dos números nas máquinas utilizadas. (0,11)10 = (0,000111 )2 = (0,109375 )10 (0,11)10 não tem representação finita na base 2. * * * Erros - Existência Ex.03: Fazer a conversão de O,1 de base 10 para a base 2 (O,1)10 = (0,00011001100110011...)2 (O,1)10 não tem representação exata na base 2. A representação de um número depende da base em uso e do número máximo de dígitos usados na sua representação. Por outro lado 0,000112 = 0,093810 * * * Erros Tipos * * * Erros - Tipos Absoluto Relativo Quanto menor for o erro, mais preciso será o resultado da operação Truncamento Arredondamento * * * Erros - Tipos Erro Absoluto = Valor Exato – Valor Aproximado EAx = x – Erro Relativo = Erro Absoluto / Valor Aproximado ERx = (x – ) / Obs.: Erro Porcentualx = ERx x 100 * * * Erros – Absolutos Em geral, não é possível obter EAx, pois não se conhece x. A solução é obter um limitante superior ou uma estimativa do erro absoluto. |EAx| = |x - | < limitante superior EX. 01: Para (3.14 ,3.15) |EA | = | | < 0.01 * * * Erros – Absolutos Ex. 04: Para = 2112,9 com |EAx| < 0.1 temos x (2112,8, 2113), Para = 5.3 com |EAx| < 0.1 temos y (5.2,5.4) Temos mesmos limitantes superiores. Pode-se afirmar que x e y são representados com a mesma precisão? É preciso comparar a ordem de grandeza de x e y. * * * Erros – Relativos Dependendo da ordem de grandeza o erro absoluto não é suficiente para descrever a precisão de um cálculo. Erro Relativo * * * Erros – Relativos Ainda, no Ex. 04: Para = 2112,9 com |EAx| < 0.1 |EAx| = |x - | / | | = 0.1/2112.9 4.7 x 10-5 Para = 5.3 com |EAx| < 0.1 |EAy| = |y - | / | | = 0.1/5.3 0.02 Mostramos que X é representado com maior precisão que y * * * Erros – Arredondamento Ex. 05: Seja: calcular em uma máquina digital Não existe uma forma de representar um número irrracional com um número finito de algarismos. Portanto, o número apresentado pela calculadora é uma aproximação do valor real de = 1,4142136 (ao invés de 1,41421356....). O erro introduzido é chamado erro de arredondamento * * * Erros –Truncamento Ex. 06: Seja: calcular o valor de . Sabemos que a exponencial é uma função que pode ser representada por uma série infinita, * * * Erros –Truncamento na prática, é impossível calcular seu valor exato. Tem que se fazer uma aproximação, que levará a um erro no resultado final de ex. O erro introduzido é chamado erro de truncamento. * * * Erros – Arred. e Truncamento Em um sistema que opera em ponto flutuante de t dígitos, na base 10. Erro de truncamento (e=dígitos inteiros): e Erro de arredondamento: e * * * Erros – Arred. e Truncamento Demonstração: Erros de Arredondamento e de truncamento Em um sistema que opera em ponto flutuante de t dígitos, na base 10, Seja: x = fx x10e + gx x10e-t onde 0.1fx 1 e 0.1gx1 Ex.:Para t = 4 e x = 234.57, então x = 0.2345 x 103 + 0.7 x 10-1, temos fx = 0.2345 e gx = 0.7 * * * Erros –Truncamento No truncamento gx x10e-t é desprezado e Temos: visto que gx<1 , pois 0.1 é o menor valor possível para fx * * * Erros – Arredondamento No arredondamento tipo simétrico (forma mais utilizada): se, (gx é desprezado) se, (soma “1” ao último dígito de fx) * * * Erros –Arredondamento Se , teremos * * * Erros – Arredondamento Se e * * * Erros – Arred/Truncamento Cenário: sistema de aritmética de ponto flutuante de 4 dígitos, precisão dupla. Ex. 07: Seja x = 0.937 x 104 e y = 0.1272 x 102 . Calcular x + y. Geralmente, o resultado exato de uma operação (OP) é normalizado e arredondado ou truncado para t dígitos - (OP)ª * * * Erros – Arred/Truncamento Alinhar os pontos decimais antes da soma (A adição aritmética de PF requer o alinhamento dos pontos decimais dos dois números) x = 0.937 x 104 e y = 0.001272 x 104, x+y = 0.938272 x 104 Resultado com 4 dígitos Arredondamento : (X+Y)a = 0.9383 x 104 Truncamento: (X+Y)a = 0.9382 x 104 * * * Erros – Arrred./Truncamento Arredondamento : (X.Y)a = 0.1192 x106 Truncamento: (X.Y)a = 0.1191 x106 Mesmo que as parcelas ou fatores de uma operação possam ser representados exatamente no sistema, não se pode esperar que o resultado armazenado seja exato. No exemplo, x e y tinham representação exata, mas o resultado x+y teve representação aproximada * * * Erros Propagação * * * Erros – Propagação Ex. 08: Seja: calcular o valor de - e3 (erro de arredondamento) e3 (erro de truncamento) Os erros nos valores de e e3 se propagam para o resultado de - e3 * * * Erros – Propagação Ao se resolver um problema numericamente, a cada etapa e a cada operação realizada, devem surgir diferentes tipos de erros gerados das mais variadas maneiras, e estes erros se propagam e determinam o erro no resultado final obtido. Conhecer os efeitos da propagação de erros é muito importante pois, além de determinar o erro final de uma operação numérica, pode-se conhecer a sensibilidade de um determinado problema ou método numérico. * * * Erros – Propagação Ex.09: Dados a = 50 ± 3 e b = 21 ± 1 , Calcular: a + b, a – b e a x b a pode variar de 47 a 53 b pode variar de 20 a 22. O menor valor da soma seria 47 + 20 = 67 e o maior valor seria 53 + 22 = 75. Logo, a + b = (50 + 21) ± 4 = 71 ± 4, variando de 67 a 75. * * * Erros – Propagação Ex.09: Dados a = 50 ± 3 e b = 21 ± 1 , a pode variar de 47 a 53 b pode variar de 20 a 22. O menor valor da subtração seria 47 – 22 = 25 e o maior valor da subtração seria 53 – 20 = 33. Logo, a – b = (50 – 21) ± 4 = 29 ± 4 , variando de 25 a 33. Observe que na subtração, os erros absolutos se somam, pois sempre se admite o pior caso; nunca se subtraem erros, contando com a sorte; prevê-se, sempre, o caso mais desfavorável * * * Erros – Propagação Ex.09: Dados a = 50 ± 3 e b = 21 ± 1 , a pode variar de 47 a 53 b pode variar de 20 a 22. O menor valor do produto seria 47 x 20 = 940 e o maior valor do produto seria 53 x 22 = 1166. Logo, a x b = (50 ± 3) x (21 ± 1) 1050 ± (3 x 21 + 50 x 1) 1050 ± 113. Despreza-se o produto 3 x 1, por ser muito pequeno diante de (3 x 21 + 50 x 1 ) = 113. Assim, o produto ficaria entre 937 e 1163, ligeiramente diferente do verdadeiro intervalo, exatamente pelo abandono do produto 1 x 3, considerado desprezível * * * Erros – Propagação Análise de Erros nas Operações Aritméticas de Ponto Flutuante O erro total em uma operação aritmética é composto pelo erro das parcelas ou fatores e pelo erro no resultado da operação. * * * Erros – Propagação Operações Aritméticas em PF – Erros Absolutos * * * Erros – Propagação Operações Aritméticas em PF – Erros Absolutos muito pequeno * * * Erros – Propagação Operações Aritméticas em PF – Erros Absolutos (despreza-s os termos de potência >1) Simplificação: * * * Erros – Propagação Operações Aritméticas em PF – Erros Relativos Soma: Subtração: * * * Erros – Propagação Operações Aritméticas em PF – Erros Relativos Multiplicação: Divisão: * * * Erros – Análise Cenário: sistema de aritmética de ponto flutuante de 4 dígitos, precisão dupla. Ex.10: Seja x = 0.937 x 104 e y = 0.1272 x 102 Calcular x + y e ER(x+y)sabendo que x, y estão exatamente representados. * * * Erros – Análise Solução: Alinhar os pontos decimais antes da soma x = 0.937 x 104 e y = 0.001272 x 104, x+y = 0.938272 x 104 Resultado com 4 dígitos Arredondamento : = 0.9383 x 104 * * * Erros – Análise Cálculo de ER(x+y) Temos: Como x e y são representados exatamente, ERx+y se resume ao Erro Relativo de Arredondamento (RA) no resultado da soma. EAx=EAy= 0, Eay+y=0 * * * Erros – Análise Exercício – Fazer em sala de aula Seja x = 0.937 x 104 e y = 0.1272 x 102 Calcular x - y e ER(x-y)sabendo que x, y e estão exatamente representados. * * * Erros – Análise Ex.11: Seja x = 0.937 x 104 e y = 0.1272 x 102 Calcular x . y e ER(x+y)sabendo que x, y e estão exatamente representados. * * * Erros – Análise Solução: x.y = (0,937 x 104 )x(0,1272 x 102 ) = 0,1191864 x 106 Temos: (arredondamento) * * * Erros – Análise Exercício – Fazer em sala de aula Seja x = 0.937 x 104 e y = 0.1272 x 102 Calcular x / y e ER(x/y)sabendo que x, y e estão exatamente representados. * * * Erros – Análise Ex.12: Seja x = 0,937x104 y = 0,1272x102 e z = 0,231x101 Calcular x + y+z e ER(x+y+z)sabendo que x, y e z estão exatamente representados. Solução: Alinhando as vírgulas decimais x = 0.937x104 y = 0.001272x104 e z=0,000231 A soma é feita por partes: (X+Y)+Z * * * Erros – Análise No Ex 10 encontramos: x+y = 0.9383 x 104 e Calcular w = x + y+ z? e ER(x+y+z)? Seja s= x+y s+z= 0,9383 x 104 + 0,000231 x 104 = 0,938531x 104 s+z= 0,9385x 104 (arredondamento) x+y+z= 0,9385x 104 * * * Erros – Análise Temos: EAz=0, ERz=0 * * * Erros – Análise * * * Erros – Análise Ex.12: Supondo que x é representado num computador por , que é obtido por arredondamento. Obtenha os limites superiores para os erros relativos de e * * * Erros – Análise Solução: Temos: a) * * * Erros – Análise b) Então: * * * Erros – Análise Série de Exercícios II.1- Seja um sistema de aritmética de ponto flutuante de quatro dígitos, base decimal e com acumulador de precisão dupla. Dados os números: X=0,7237x104 y=0,2145x10-3 e z=0,2585x101 Efetue as seguintes operações e obtenha o erro relativo no resultado, supondo que x, u, e z estão exatamente representados. a)x+y+z b)x-y-z c)x/y d)(x.y)/z e)x.(y/z) f) (x+y).z * * * Erros – Análise II.02- Supondo que x é representado num computador por , onde é obtido por arredondamento, obtenha os limites superiores para os erros relativos de II.03- Idem para e e * * * Erros – Análise II-04: Sejam e as representações de x e y obtidas por arredondamento em um computador. Deduza expressões de limitante de erro para mostrar que o limitante de erro relativo de é menor do que o de * * * Erros – Análise Fim do Modulo III C�lculo Num�rico/C�lculo Num�rico - Ferramentas de Suporte.ppt Clique para editar o estilo do título mestre Clique para editar o estilo do subtítulo mestre * * * Cálculo Numérico Profs.: Bruno C N Queiroz J. Antão B. Moura José Eustáquio R. de Queiroz Joseana Macêdo Fechine Maria Izabel C. Cabral Ferramentas de Suporte DSC/CCT/UFCG * * * Como estudar métodos numéricos? Ferramentas de Suporte * * * Verificar validade dos resultados obtidos Ferramentas de Suporte Desenvolver Utilizar Programa Computador Uso do método numérico * * * Programas de computação numérica (software numérico) Programa Individual Pacote Biblioteca Sistema de Software Ferramentas de Suporte * * * Programa Individual Composto de alguns módulos. Função: executar uma computação específica. Exemplo de aplicação: Obter uma integral definida de uma função dada. Ferramentas de Suporte * * * Pacote Coleção de programas para solucionar problemas de uma área. Exemplo de aplicação: Solução de sistemas de equações lineares Ferramentas de Suporte * * * Biblioteca Coleção sistematizada de programas para resolução de diversas classes de problemas de matemática. Tipicamente contém algumas centenas de programas. Ferramentas de Suporte * * * Sistema de Software Constituído de um pacote ou uma biblioteca com uma interface de comunicação com o usuário. Utiliza uma linguagem especial. Exemplos: MATLAB, MATHCAD, MAPLE, MATHEMATICA, SPSS, etc. Ferramentas de Suporte * * * MATHCAD padrão industrial para cálculos técnicos e matemática aplicada ambiente de trabalho baseado em álgebra computacional avaliação numérica e simbólica de expressões matemáticas; geração de gráficos e construção de algoritmos; avaliação de integrais e derivadas de funções; resolução de sistemas lineares, etc. Ferramentas de Suporte * * * MAPLE sistema de computação algébrica de propósitos gerais operações simbólicas; cálculos complexos; recursos para programação. resolução de problemas matemáticos geração de gráficos técnicos de alta qualidade pacotes de funções de teoria de grupos, álgebra linear e estatística, dentre outros Ferramentas de Suporte pytheas.ucs.indiana.edu/~statmath/math/maple/overview.html * * * MATHEMATICA sistema genérico para computação matemática manipulação integrada de dados numéricos, simbólicos e gráficos ferramenta interativa de cálculo linguagem de programação. Ferramentas de Suporte www.indiana.edu/~statmath/math/mma/overview.html * * * SPSS (Statistical Package for the Social Sciences) originalmente desenvolvido como LP usualmente empregado na pesquisa quantitativa em ciências sociais realização de análises estatísticas, em especial análises de dados de levantamentos processo numérico e gráfico de dados Ferramentas de Suporte www.csubak.edu/ssric/Modules/SPSS/SPSS9BOOK/ * * * O que é o MATLAB ? Software interativo de alto desempenho; Destinado ao cálculo numérico; Integração de análise numérica, cálculo com matrizes, processamento de sinais e construção de gráficos; Ambiente de fácil interação. * * * O que é o MATLAB ? Resolução de problemas numéricos em apenas uma fração do tempo que se gastaria para escrever um programa semelhante em linguagem Fortran, Basic ou C. * * * O que é o MATLAB ? As soluções dos problemas são expressas quase exatamente como escritas matematicamente, ao contrário da programação tradicional. * * * MATLAB – Ambiente de trabalho * * * MATLAB – Ambiente de trabalho * * * Linhas de comando MATLAB – Demo * * * Ferramentas de Suporte Importante!!! Determinadas situações exigem a utilização de uma LP mais adequada para a implementação de um algoritmo para a resolução de um problema de CN. Exemplo de Linguagem: FORTRAN (FORmula TRANslation) C�lculo Num�rico/C�lculo Num�rico - Lista 1.doc Universidade Federal de Campina Grande Departamento de Sistemas e Computação Disciplina: Cálculo Numérico Profs.: Bruno C N Queiroz J. Antão B. Moura José Eustáquio R. de Queiroz Joseana Macêdo Fechine Maria Izabel C. Cabral Lista de Exercícios N° 01 Módulo 1 – Motivação e Ferramentas de Suporte Qual o objetivo do Cálculo Numérico? Apresente aplicações nas quais se torna necessário (ou útil) a produção de resultados numéricos. Sabendo que os métodos numéricos buscam soluções aproximadas para as formulações matemáticas, qual o problema inerente das soluções obtidas através da utilização destes métodos? Quais os passos necessários para a obtenção de uma solução numérica utilizando o computador? Ilustre aplicações do Cálculo Numérico no âmbito do seu curso. O que você entende por Ferramentas de Suporte? Como são classificados os programas de computação numérica? Caracterize cada um destes programas. Descreva em linhas gerais as características do MATLAB que o tornam uma ferramenta útil ao Cálculo Numérico. C�lculo Num�rico/C�lculo Num�rico - Lista 2.doc Universidade Federal de Campina Grande Departamento de Sistemas e Computação Disciplina: Cálculo Numérico Profs.: Bruno C N Queiroz J. Antão B. Moura José Eustáquio R. de Queiroz Joseana Macêdo Fechine Maria Izabel C. Cabral Lista de Exercícios N° 02 Módulo 2 – Conceitos Básicos: Sistemas de Numeração e Ponto Flutuante Enumere os principais princípios usados em Cálculo Numérico que são comuns à Matemática e outras áreas científicas (e.g. Física). Para cada princípio, forneça um exemplo/ ilustração diferente daquele usado em sala de aula. Quais são as bases dos sistemas de numeração decimal, binário, octal e hexadecimal? Em geral, as representações decimal, octal e hexadecimal de um número binário contém mais ou menos dígitos do que o número binário? O maior e menor dígito em qualquer base vale quanto, respectivamente? Quanto é o valor posicional do dígito mais à direita nos sistemas binário, octal, decimal e hexadecimal? Quanto é o valor posicional do dígito imediatamente à esquerda do dígito mais à direita nos sistemas binário, octal, decimal e hexadecimal? Preencha a tabela abaixo com os valores posicionais das quatro posições indicadas, em cada um dos sistemas de numeração indicados: Decimal 1000 100 10 1 Hexadecimal 256 Binário Octal 512 8 Converta o binário 1101 0101 1000 para octal e hexadecimal. Converta FACE para binário. Converta 7316 (octal) para binário. Converta 4FEC para octal (passe primeiro por binário). Converta o binário 1101110 para decimal. Converta 317 (octal) para decimal. Converta 317, 713 (octal) para decimal. Converta 10,08 (decimal) para binário. Converta 417 decimal para binário. Depois forneça os complementos de um e dois. Qual o resultado quando o complemento de um de um número é adicionado ao próprio número? Por que um número real é também chamado de “ponto (ou vírgula) flutuante”? Qual seria a forma normalizada das representações dos números de ponto flutuante (todos decimais): 15,50 22 3,1416... 0,0327 Repita a questão acima no caso dos números hexadecimais: ABC,123 123, ABC 0,F9. Quais os três componentes básicos de uma representação para números reais? O que é bit escondido na representação de floats? Usando a representação/ilustração (8 bits) do slide 32 do conteúdo da Unidade 02, monte uma tabela com as faixas de valores para os números possíveis de serem representados com esta representação (a exemplo da Tabela no slide 45 – Quadro resumo IEEE 754). Por que usamos a representação não normalizada juntamente com a normalizada? Isto não gera confusão? Porquê a necessidade de padronizar a representação de floats? O que é de fato padronizado no IEEE 754? O que é um NAN? Represente com precisão simples e dupla, no padrão IEEE 754, os números decimais: i. 0 (zero); ii. -0 iii. 4 iv. 4725 X 10321 v. 10-345 Defina overflow e underflow. C�lculo Num�rico/C�lculo Num�rico - Lista 3.doc Universidade Federal de Campina Grande Departamento de Sistemas e Computação Disciplina: Cálculo Numérico Profs.: Bruno C N Queiroz J. Antão B. Moura José Eustáquio R. de Queiroz Joseana Macêdo Fechine Maria Izabel C. Cabral Lista de Exercícios N° 03 + Gabarito Módulo 3 – Erros Erros estão sempre presentes nas soluções numéricas. Apresente exemplos dos seguintes tipos de erros: Inerente de Truncamento de Representação de Conversão De que depende a representação de um número em um computador? Os resultados dos cálculos realizados dependem da representação dos números nas máquinas utilizadas. Por que na expressão para xi = 0,11, calculado no computador, obtem-se S=3299.99691 e não S= 3300 ? Defina: Erro Absoluto e Erro Relativo. O que significa “Limitante Superior” no estudo de Erros Absolutos? Dê exemplos. Que tipo de erro nos dá informações sobre “precisão”? Mostre um exemplo em que a “precisão” é importante. Apresente exemplos nos quais ocorrem erros de arredondamento e erros de truncamento. Complete: Ao se resolver um problema numericamente, a cada etapa e a cada operação realizada, devem surgir diferentes tipos de erros gerados das mais variadas maneiras, e estes erros se propagam e determinam o erro no resultado final obtido. O erro total em uma operação aritmética é composto pelo erro ________________________ e pelo erro no ________________ da operação. 8) Seja x = 0.857 x 104 e y = 0.6772 x 102. Calcular x - y e ER(x-y)sabendo que x, y e estão exatamente representados. Seja um sistema de aritmética de ponto flutuante de quatro dígitos, base decimal e com acumulador de precisão dupla. Dados os números: X=0,7237x104 y=0,2145x10-3 e z=0,2585x101 Efetue as seguintes operações e obtenha o erro relativo no resultado, supondo que x, u, e z estão exatamente representados. a)x+y+z b)x-y-z c)x/y d)(x.y)/z e)x.(y/z) f) (x+y).z 10) 11) Mesma questão para : 12) Gabarito da Série de Exercícios (Questões 9 a 12) 9) a) x+y+z = 0,7240 x 104 e lERx+y+zl < 0,9998 x 10-3 b) x-y-z = 0,7234 x 104 e lERx-y-zl < 1,0002 x 10-3 c) x/y = 0,3374 x 108 e lERx/yl < 1/2 x 10-3 d) (x.y)/z= 0,6004 e lER(x.y)/zl < 10-3 e x.(y/z) = 0,6005 e lERx(y/z)l < 10-3 f) (x+y).z = 0,1871 x 105 e lER(x+y).zl < 10-3 10) lERul < 10-t+1 e lERwl < 4/3 x 10-t+1 11) lERul < 10-t+1 e lERwl < 13/8 x10-t+1 12) lERul < 2 x10-t+1 e lERwl < 7/3 x10-t+1 � EMBED Equation.3 ��� � EMBED Equation.3 ��� é menor do que o de Sejam � EMBED Equation.3 ��� e � EMBED Equation.3 ��� as representações de x e y obtidas por arredondamento em um computador. Deduza expressões de limitante de erro para mostrar que o limitante de erro relativo de e e � EMBED Equation.3 ��� � EMBED Equation.3 ��� � EMBED Equation.3 ��� � EMBED Equation.3 ��� Supondo que x é representado num computador por � EMBED Equation.3 ���, onde � EMBED Equation.3 ��� é obtido por arredondamento, obtenha os limites superiores para os erros relativos de � EMBED Equation.3 ��� _1099771095.unknown _1116913791.unknown _1116913802.unknown _1116913711.unknown _1116913718.unknown _1099770729.unknown _1099770977.unknown _1099769191.unknown _1099770728.unknown _1099769190.unknown _1099767986.unknown C�lculo Num�rico/C�lculo Num�rico - Motiva��o.ppt Clique para editar o estilo do título mestre Clique para editar o estilo do subtítulo mestre * * * Cálculo Numérico Profs.: Bruno C N Queiroz J. Antão B. Moura José Eustáquio R. de Queiroz Joseana Macêdo Fechine Maria Izabel C. Cabral Introdução DSC/CCT/UFCG * * * O que é o Cálculo Numérico ? Cálculo Numérico – Introdução * * * O Cálculo Numérico corresponde a um conjunto de ferramentas ou métodos usados para se obter a solução de problemas matemáticos de forma aproximada. Esses métodos se aplicam principalmente a problemas que não apresentam uma solução exata, portanto precisam ser resolvidos numericamente. Cálculo Numérico – Introdução * * * Exemplo: Circuito elétrico composto de uma fonte de tensão e um resistor. Solução exata Introdução de um diodo no circuito: Solução utilizando métodos numéricos V R i V R D i Cálculo Numérico – Introdução * * * Por que produzir resultados numéricos? Cálculo Numérico – Introdução * * * Um problema de Matemática pode ser resolvido analiticamente, mas esse método pode se tornar impraticável com o aumento do tamanho do problema. Exemplo: solução de sistemas de equações lineares. Cálculo Numérico – Introdução * * * A existência de problemas para os quais não existem métodos matemáticos para solução (não podem ser resolvidos analiticamente). Exemplos: a) não tem primitiva em forma simples; b) não pode ser resolvido analiticamente; c) equações diferenciais parciais não lineares podem ser resolvidas analiticamente só em casos particulares. Cálculo Numérico – Introdução * * * Cálculo Numérico – Introdução Os métodos numéricos buscam soluções aproximadas para as formulações matemáticas. Nos problemas reais, os dados são medidas e, como tais, não são exatos. Uma medida física não é um número, é um intervalo, pela própria imprecisão das medidas. Daí, trabalha-se sempre com a figura do erro, inerente à própria medição. Os métodos aproximados buscam uma aproximação do que seria o valor exato. Dessa forma é inerente aos métodos se trabalhar com a figura da aproximação, do erro, do desvio. * * * Cálculo Numérico – Introdução Função do Cálculo Numérico na Engenharia “Buscar solucionar problemas técnicos através de métodos numéricos modelo matemático” * * * Cálculo Numérico – Introdução Passos para a resolução de problemas PROBLEMA MODELAGEM REFINAMENTO RESULTADO DE CIÊNCIAS AFINS MENSURAÇÃO ESCOLHA DE MÉTODOS ESCOLHA DE PARÂMETROS TRUNCAMENTO DAS ITERAÇÕES RESULTADO NUMÉRICO * * * Cálculo Numérico – Introdução Fluxograma – Solução Numérica * * * Cálculo Numérico – Introdução Influência dos Erros nas Soluções Exemplo 1: Falha no lançamento de mísseis (25/02/1991 – Guerra do Golfo – míssil Patriot) Erro de 0,34 s no cálculo do tempo de lançamento Limitação na representação numérica (24 bits) * * * Cálculo Numérico – Introdução Influência dos Erros nas Soluções Exemplo 2: Explosão de foguetes (04/06/1996 – Guiana Francesa – foguete Ariane 5) Erro de trajetória 36,7 s após o lançamento Limitação na representação numérica (64 bits/ 16 bits) Prejuízo: U$ 7,5 bilhões * * * Cálculo Numérico – Introdução Aplicações de cálculo numérico na engenharia. Determinação de raízes de equações Interpolação de valores tabelados Integração numérica, entre outros. * * * Cálculo Numérico – Plano de Ensino Objetivos Ementa Metodologia, Técnicas de Ensino Recursos Didáticos Avaliação Bibliografia * * * Cálculo Numérico – Objetivos do Curso Fornecer condições para que os alunos possam conhecer, calcular, utilizar e aplicar métodos numéricos na solução de problemas de engenharia. Estudar a construção de métodos numéricos, analisar em que condições se pode ter a garantia de que os resultados computados estão próximos dos exatos, baseados nos conhecimentos sobre os métodos. * * * Visão de Engenharia x de Matemática/Computação Conceitos e entendimentos básicos de CN Exemplos de custos de “erros numéricos” nas engenharias Incrementação do perfil profissional Noções de precisão e eficiência nas soluções Introdução dos métodos tradicionais Aplicação de ferramentas disponíveis O que a disciplina vai oferecer? * * * Cálculo Numérico – Ementa Motivação Conceitos básicos: princípios usados em cálculo numérico, representação binária de números inteiros e reais, Padrão IEEE. Problemas: geração e propagação de erros. Resoluções Numéricas: métodos tradicionais para cálculo numérico. Aplicação: exame de bibliotecas e ferramentas atuais * * * Módulo I: Motivação e Ferramentas de Suporte Módulo II: Conceitos Básicos Módulo III: Erros Numéricos – Geração e Propagação Módulo IV: Resolução Numérica de Equações Módulo V: Resolução Numérica de Sistemas de Equações Lineares Módulo VI: Interpolação Polinomial e Ajuste de Curvas Módulo VII: Integração e Diferenciação Numéricas Cálculo Numérico – Programa * * * Metodologia & Técnicas de Ensino Aulas Expositivas; Aulas Práticas em Laboratório; Atividades individuais e em grupo. * * * Cálculo Numérico – Recursos Didáticos Quadro branco; Retroprojetor, Datashow; Laboratório de Informática; Programas de Simulação (Matlab, Mapple, Mathematica). * * * Cálculo Numérico – Avaliação Contínua, mediante avaliações individuais e trabalhos em laboratório; Trabalhos interativos de pesquisa extra-classe individual e em grupo; Avaliações em sala, individual e em grupo. * * * Cálculo Numérico – Bibliografia RUGGIERO, M. A. G. & LOPES, V. L. R. Cálculo numérico: aspectos teóricos e computacionais. 2.ed. São Paulo, Makron, 1997. HATTORI, M. T. H. & QUEIROZ, B. C. N. Métodos e Software Numéricos. Departamento de Sistemas e Computação, Universidade Federal de campina Grande, Campina Grande, 1995. BARROSO, L. C., BARROSO, M. A., CAMPOS, F. F., CARVALHO, M. L. B. & MAIA, M. L. Cálculo Numérico (Com Aplicações), 2.ed. São Paulo, Editora Arbra, 1987. CHAPA, S. C. & CANALE, R. P. Numerical Methods for Engineers, McGraw-Hill, 1990. C�lculo Num�rico/Calculo Num�rico (UFPB).zip Usuarios/Junior/Novo/UFCG/C�lculo Num�rico/teste/DADOOUT.TXT W=[ 0.800 -0.001207 0.300000 0.800 0.000393 0.300000 0.800 -0.000493 0.300000 0.800 0.001416 0.300000 0.800 0.000830 0.300000 0.800 0.000385 0.300000 0.800 0.000080 0.300000 0.800 -0.000092 0.300000 0.800 -0.000137 0.300000 0.800 -0.000059 0.300000 0.800 0.000139 0.300000 0.800 0.000456 0.300000 0.800 0.000882 0.300000 0.800 0.001419 0.300000 0.800 -0.000585 0.300000 0.800 0.000156 0.300000 0.800 0.000994 0.300000 0.800 0.001926 0.300000 0.800 0.000304 0.300000 0.800 0.001414 0.300000 0.800 -0.000035 0.300000 0.800 0.001239 0.300000 0.800 -0.000049 0.300000 0.800 0.001381 0.300000 0.800 0.000242 0.300000 0.800 0.001818 0.300000 0.800 0.000818 0.300000 0.800 -0.000112 0.300000 0.800 0.001661 0.300000 0.800 0.000853 0.300000 0.800 0.000109 0.300000 0.800 0.002064 0.300000 0.800 0.001428 0.300000 0.800 0.000848 0.300000 0.800 0.000323 0.300000 0.800 -0.000150 0.300000 0.800 0.002063 0.300000 0.800 0.001679 0.300000 0.800 0.001341 0.300000 0.800 0.001048 0.300000 0.800 0.000799 0.300000 0.800 0.000591 0.300000 0.800 0.000424 0.300000 0.800 0.000296 0.300000 0.800 0.000205 0.300000 0.800 0.000150 0.300000 0.800 0.000131 0.300000 0.800 0.000144 0.300000 0.800 0.000191 0.300000 0.800 0.000268 0.300000 0.800 0.000375 0.300000 0.800 0.000511 0.300000 0.800 0.000674 0.300000 0.800 0.000864 0.300000 0.800 0.001079 0.300000 0.800 0.001318 0.300000 0.800 0.001580 0.300000 0.800 0.001865 0.300000 0.800 0.002171 0.300000 0.800 0.002497 0.300000 0.800 0.002843 0.300000 0.800 0.003207 0.300000 0.800 0.003588 0.300000 0.800 0.003986 0.300000 0.800 0.004400 0.300000 0.800 0.004829 0.300000 0.800 0.005272 0.300000 0.800 0.005729 0.300000 0.800 0.006198 0.300000 0.800 0.006679 0.300000 0.800 0.007172 0.300000 0.800 0.007675 0.300000 0.800 0.008188 0.300000 0.800 0.008711 0.300000 0.800 0.009242 0.300000 0.800 0.009781 0.300000 0.800 0.010327 0.300000 0.800 0.010881 0.300000 0.800 0.011441 0.300000 0.800 0.012006 0.300000 0.800 0.012577 0.300000 0.800 0.013153 0.300000 0.800 0.013733 0.300000 0.800 0.014317 0.300000 0.800 0.014904 0.300000 0.800 0.015494 0.300000 0.800 0.016087 0.300000 0.800 0.016682 0.300000 0.800 0.017279 0.300000 0.800 0.017877 0.300000 0.800 0.018476 0.300000 0.800 0.019075 0.300000 0.800 0.019675 0.300000 0.800 0.020275 0.300000 0.800 0.020874 0.300000 0.800 0.021473 0.300000 0.800 0.022071 0.300000 0.800 0.022667 0.300000 0.800 0.023262 0.300000 0.800 0.023856 0.300000 0.800 0.024447 0.300000 0.800 0.025036 0.300000 0.800 0.025623 0.300000 0.800 0.026206 0.300000 0.800 0.026787 0.300000 0.800 0.027365 0.300000 0.800 0.027940 0.300000 0.800 0.028511 0.300000 0.800 0.029079 0.300000 0.800 0.029642 0.300000 0.800 0.030202 0.300000 0.800 0.030758 0.300000 0.800 0.031309 0.300000 0.800 0.031856 0.300000 0.800 0.032399 0.300000 0.800 0.032936 0.300000 0.800 0.033470 0.300000 0.800 0.033998 0.300000 0.800 0.034521 0.300000 0.800 0.035040 0.300000 0.800 0.035553 0.300000 0.800 0.036061 0.300000 0.800 0.036564 0.300000 0.800 0.037061 0.300000 0.800 0.037553 0.300000 0.800 0.038040 0.300000 0.800 0.038521 0.300000 0.800 0.038997 0.300000 0.800 0.039467 0.300000 0.800 0.039931 0.300000 0.800 0.040390 0.300000 0.800 0.040843 0.300000 0.800 0.041290 0.300000 0.800 0.041732 0.300000 0.800 0.042167 0.300000 0.800 0.042597 0.300000 0.800 0.043022 0.300000 0.800 0.043440 0.300000 0.800 0.043853 0.300000 0.800 0.044259 0.300000 0.800 0.044660 0.300000 0.800 0.045056 0.300000 0.800 0.045445 0.300000 0.800 0.045829 0.300000 0.800 0.046207 0.300000 0.800 0.046579 0.300000 0.800 0.046945 0.300000 0.800 0.047306 0.300000 0.800 0.047661 0.300000 0.800 0.048011 0.300000 0.800 0.048355 0.300000 0.800 0.048693 0.300000 0.800 0.049026 0.300000 0.800 0.049353 0.300000 0.800 0.049674 0.300000 0.800 0.049991 0.300000 0.800 0.050301 0.300000 0.800 0.050607 0.300000 0.800 0.050907 0.300000 0.800 0.051202 0.300000 0.800 0.051491 0.300000 0.800 0.051775 0.300000 0.800 0.052055 0.300000 0.800 0.052329 0.300000 0.800 0.052598 0.300000 0.800 0.052861 0.300000 0.800 0.053120 0.300000 0.800 0.053374 0.300000 0.800 0.053624 0.300000 0.800 0.053868 0.300000 0.800 0.054108 0.300000 0.800 0.054342 0.300000 0.800 0.054573 0.300000 0.800 0.054798 0.300000 0.800 0.055019 0.300000 0.800 0.055236 0.300000 0.800 0.055448 0.300000 0.800 0.055655 0.300000 0.800 0.055859 0.300000 0.800 0.056058 0.300000 0.800 0.056253 0.300000 0.800 0.056443 0.300000 0.800 0.056630 0.300000 0.800 0.056812 0.300000 0.800 0.056991 0.300000 0.800 0.057165 0.300000 0.800 0.057336 0.300000 0.800 0.057503 0.300000 0.800 0.057666 0.300000 0.800 0.057825 0.300000 0.800 0.057981 0.300000 0.800 0.058133 0.300000 0.800 0.058281 0.300000 0.800 0.058426 0.300000 0.800 0.058568 0.300000 0.800 0.058706 0.300000 0.800 0.058841 0.300000 0.800 0.058972 0.300000 0.800 0.059101 0.300000 0.800 0.059226 0.300000 0.800 0.059460 0.600000 0.800 0.059854 0.600000 0.800 0.060403 0.600000 0.800 0.061100 0.600000 0.800 0.061939 0.600000 0.800 0.062914 0.600000 0.800 0.064020 0.600000 0.800 0.065251 0.600000 0.800 0.066602 0.600000 0.800 0.068067 0.600000 0.800 0.069642 0.600000 0.800 0.071322 0.600000 0.800 0.073101 0.600000 0.800 0.074976 0.600000 0.800 0.076941 0.600000 0.800 0.078992 0.600000 0.800 0.081125 0.600000 0.800 0.083335 0.600000 0.800 0.085619 0.600000 0.800 0.087972 0.600000 0.800 0.090391 0.600000 0.800 0.092872 0.600000 0.800 0.095412 0.600000 0.800 0.098005 0.600000 0.800 0.100651 0.600000 0.800 0.103344 0.600000 0.800 0.106082 0.600000 0.800 0.108861 0.600000 0.800 0.111680 0.600000 0.800 0.114534 0.600000 0.800 0.117420 0.600000 0.800 0.120337 0.600000 0.800 0.123281 0.600000 0.800 0.126250 0.600000 0.800 0.129241 0.600000 0.800 0.132252 0.600000 0.800 0.135280 0.600000 0.800 0.138324 0.600000 0.800 0.141381 0.600000 0.800 0.144449 0.600000 0.800 0.147526 0.600000 0.800 0.150610 0.600000 0.800 0.153698 0.600000 0.800 0.156791 0.600000 0.800 0.159884 0.600000 0.800 0.162978 0.600000 0.800 0.166069 0.600000 0.800 0.169157 0.600000 0.800 0.172241 0.600000 0.800 0.175318 0.600000 0.800 0.178387 0.600000 0.800 0.181447 0.600000 0.800 0.184497 0.600000 0.800 0.187535 0.600000 0.800 0.190561 0.600000 0.800 0.193573 0.600000 0.800 0.196570 0.600000 0.800 0.199550 0.600000 0.800 0.202514 0.600000 0.800 0.205460 0.600000 0.800 0.208388 0.600000 0.800 0.211295 0.600000 0.800 0.214183 0.600000 0.800 0.217049 0.600000 0.800 0.219893 0.600000 0.800 0.222715 0.600000 0.800 0.225514 0.600000 0.800 0.228288 0.600000 0.800 0.231039 0.600000 0.800 0.233764 0.600000 0.800 0.236464 0.600000 0.800 0.239138 0.600000 0.800 0.241786 0.600000 0.800 0.244407 0.600000 0.800 0.247001 0.600000 0.800 0.249567 0.600000 0.800 0.252106 0.600000 0.800 0.254617 0.600000 0.800 0.257099 0.600000 0.800 0.259552 0.600000 0.800 0.261977 0.600000 0.800 0.264373 0.600000 0.800 0.266739 0.600000 0.800 0.269076 0.600000 0.800 0.271383 0.600000 0.800 0.273661 0.600000 0.800 0.275910 0.600000 0.800 0.278128 0.600000 0.800 0.280317 0.600000 0.800 0.282475 0.600000 0.800 0.284604 0.600000 0.800 0.286703 0.600000 0.800 0.288772 0.600000 0.800 0.290811 0.600000 0.800 0.292821 0.600000 0.800 0.294800 0.600000 0.800 0.296750 0.600000 0.800 0.298671 0.600000 0.800 0.300561 0.600000 0.800 0.302423 0.600000 0.800 0.304255 0.600000 0.800 0.306058 0.600000 0.800 0.307832 0.600000 0.800 0.309577 0.600000 0.800 0.311294 0.600000 0.800 0.312982 0.600000 0.800 0.314642 0.600000 0.800 0.316273 0.600000 0.800 0.317877 0.600000 0.800 0.319452 0.600000 0.800 0.321001 0.600000 0.800 0.322522 0.600000 0.800 0.324015 0.600000 0.800 0.325482 0.600000 0.800 0.326923 0.600000 0.800 0.328337 0.600000 0.800 0.329724 0.600000 0.800 0.331086 0.600000 0.800 0.332422 0.600000 0.800 0.333733 0.600000 0.800 0.335019 0.600000 0.800 0.336280 0.600000 0.800 0.337516 0.600000 0.800 0.338728 0.600000 0.800 0.339915 0.600000 0.800 0.341079 0.600000 0.800 0.342220 0.600000 0.800 0.343337 0.600000 0.800 0.344431 0.600000 0.800 0.345503 0.600000 0.800 0.346552 0.600000 0.800 0.347579 0.600000 0.800 0.348585 0.600000 0.800 0.349569 0.600000 0.800 0.350531 0.600000 0.800 0.351473 0.600000 0.800 0.352394 0.600000 0.800 0.353294 0.600000 0.800 0.354175 0.600000 0.800 0.355036 0.600000 0.800 0.355877 0.600000 0.800 0.356699 0.600000 0.800 0.357502 0.600000 0.800 0.358287 0.600000 0.800 0.359053 0.600000 0.800 0.359801 0.600000 0.800 0.360532 0.600000 0.800 0.361244 0.600000 0.800 0.361940 0.600000 0.800 0.362619 0.600000 0.800 0.363281 0.600000 0.800 0.363926 0.600000 0.800 0.364556 0.600000 0.800 0.365169 0.600000 0.800 0.365768 0.600000 0.800 0.366350 0.600000 0.800 0.366918 0.600000 0.800 0.367471 0.600000 0.800 0.368010 0.600000 0.800 0.368534 0.600000 0.800 0.369044 0.600000 0.800 0.369540 0.600000 0.800 0.370024 0.600000 0.800 0.370493 0.600000 0.800 0.370950 0.600000 0.800 0.371394 0.600000 0.800 0.371826 0.600000 0.800 0.372245 0.600000 0.800 0.372652 0.600000 0.800 0.373048 0.600000 0.800 0.373432 0.600000 0.800 0.373805 0.600000 0.800 0.374166 0.600000 0.800 0.374517 0.600000 0.800 0.374857 0.600000 0.800 0.375187 0.600000 0.800 0.375506 0.600000 0.800 0.375816 0.600000 0.800 0.376116 0.600000 0.800 0.376406 0.600000 0.800 0.376687 0.600000 0.800 0.376958 0.600000 0.800 0.377221 0.600000 0.800 0.377475 0.600000 0.800 0.377720 0.600000 0.800 0.377957 0.600000 0.800 0.378186 0.600000 0.800 0.378407 0.600000 0.800 0.378620 0.600000 0.800 0.378826 0.600000 0.800 0.379023 0.600000 0.800 0.379214 0.600000 0.800 0.379398 0.600000 0.800 0.379574 0.600000 0.800 0.379744 0.600000 0.800 0.379907 0.600000 0.800 0.380064 0.600000 0.800 0.380215 0.600000 0.800 0.380359 0.600000 0.800 0.380498 0.600000 0.800 0.380742 0.900000 0.800 0.381145 0.900000 0.800 0.381699 0.900000 0.800 0.382399 0.900000 0.800 0.383239 0.900000 0.800 0.384212 0.900000 0.800 0.385315 0.900000 0.800 0.386540 0.900000 0.800 0.387883 0.900000 0.800 0.389339 0.900000 0.800 0.390903 0.900000 0.800 0.392569 0.900000 0.800 0.394334 0.900000 0.800 0.396192 0.900000 0.800 0.398139 0.900000 0.800 0.400170 0.900000 0.800 0.402282 0.900000 0.800 0.404470 0.900000 0.800 0.406730 0.900000 0.800 0.409059 0.900000 0.800 0.411452 0.900000 0.800 0.413906 0.900000 0.800 0.416417 0.900000 0.800 0.418982 0.900000 0.800 0.421597 0.900000 0.800 0.424259 0.900000 0.800 0.426965 0.900000 0.800 0.429712 0.900000 0.800 0.432497 0.900000 0.800 0.435317 0.900000 0.800 0.438169 0.900000 0.800 0.441050 0.900000 0.800 0.443958 0.900000 0.800 0.446891 0.900000 0.800 0.449845 0.900000 0.800 0.452818 0.900000 0.800 0.455809 0.900000 0.800 0.458815 0.900000 0.800 0.461833 0.900000 0.800 0.464862 0.900000 0.800 0.467900 0.900000 0.800 0.470944 0.900000 0.800 0.473993 0.900000 0.800 0.477046 0.900000 0.800 0.480099 0.900000 0.800 0.483153 0.900000 0.800 0.486204 0.900000 0.800 0.489252 0.900000 0.800 0.492295 0.900000 0.800 0.495331 0.900000 0.800 0.498360 0.900000 0.800 0.501380 0.900000 0.800 0.504390 0.900000 0.800 0.507388 0.900000 0.800 0.510373 0.900000 0.800 0.513344 0.900000 0.800 0.516301 0.900000 0.800 0.519242 0.900000 0.800 0.522166 0.900000 0.800 0.525073 0.900000 0.800 0.527960 0.900000 0.800 0.530829 0.900000 0.800 0.533677 0.900000 0.800 0.536504 0.900000 0.800 0.539310 0.900000 0.800 0.542093 0.900000 0.800 0.544854 0.900000 0.800 0.547590 0.900000 0.800 0.550303 0.900000 0.800 0.552991 0.900000 0.800 0.555654 0.900000 0.800 0.558291 0.900000 0.800 0.560903 0.900000 0.800 0.563488 0.900000 0.800 0.566046 0.900000 0.800 0.568576 0.900000 0.800 0.571080 0.900000 0.800 0.573556 0.900000 0.800 0.576003 0.900000 0.800 0.578423 0.900000 0.800 0.580813 0.900000 0.800 0.583176 0.900000 0.800 0.585509 0.900000 0.800 0.587813 0.900000 0.800 0.590089 0.900000 0.800 0.592334 0.900000 0.800 0.594551 0.900000 0.800 0.596738 0.900000 0.800 0.598896 0.900000 0.800 0.601024 0.900000 0.800 0.603123 0.900000 0.800 0.605192 0.900000 0.800 0.607232 0.900000 0.800 0.609242 0.900000 0.800 0.611223 0.900000 0.800 0.613175 0.900000 0.800 0.615097 0.900000 0.800 0.616990 0.900000 0.800 0.618854 0.900000 0.800 0.620689 0.900000 0.800 0.622495 0.900000 0.800 0.624272 0.900000 0.800 0.626021 0.900000 0.800 0.627741 0.900000 0.800 0.629433 0.900000 0.800 0.631097 0.900000 0.800 0.632733 0.900000 0.800 0.634341 0.900000 0.800 0.635921 0.900000 0.800 0.637474 0.900000 0.800 0.639000 0.900000 0.800 0.640499 0.900000 0.800 0.641972 0.900000 0.800 0.643417 0.900000 0.800 0.644837 0.900000 0.800 0.646230 0.900000 0.800 0.647598 0.900000 0.800 0.648940 0.900000 0.800 0.650257 0.900000 0.800 0.651548 0.900000 0.800 0.652815 0.900000 0.800 0.654058 0.900000 0.800 0.655276 0.900000 0.800 0.656470 0.900000 0.800 0.657640 0.900000 0.800 0.658787 0.900000 0.800 0.659911 0.900000 0.800 0.661012 0.900000 0.800 0.662090 0.900000 0.800 0.663146 0.900000 0.800 0.664180 0.900000 0.800 0.665192 0.900000 0.800 0.666182 0.900000 0.800 0.667152 0.900000 0.800 0.668100 0.900000 0.800 0.669028 0.900000 0.800 0.669935 0.900000 0.800 0.670823 0.900000 0.800 0.671690 0.900000 0.800 0.672538 0.900000 0.800 0.673367 0.900000 0.800 0.674177 0.900000 0.800 0.674968 0.900000 0.800 0.675741 0.900000 0.800 0.676496 0.900000 0.800 0.677233 0.900000 0.800 0.677952 0.900000 0.800 0.678654 0.900000 0.800 0.679339 0.900000 0.800 0.680008 0.900000 0.800 0.680660 0.900000 0.800 0.681296 0.900000 0.800 0.681916 0.900000 0.800 0.682520 0.900000 0.800 0.683109 0.900000 0.800 0.683683 0.900000 0.800 0.684243 0.900000 0.800 0.684787 0.900000 0.800 0.685317 0.900000 0.800 0.685834 0.900000 0.800 0.686336 0.900000 0.800 0.686825 0.900000 0.800 0.687301 0.900000 0.800 0.687763 0.900000 0.800 0.688213 0.900000 0.800 0.688650 0.900000 0.800 0.689075 0.900000 0.800 0.689488 0.900000 0.800 0.689889 0.900000 0.800 0.690279 0.900000 0.800 0.690657 0.900000 0.800 0.691024 0.900000 0.800 0.691380 0.900000 0.800 0.691725 0.900000 0.800 0.692060 0.900000 0.800 0.692384 0.900000 0.800 0.692699 0.900000 0.800 0.693003 0.900000 0.800 0.693298 0.900000 0.800 0.693584 0.900000 0.800 0.693861 0.900000 0.800 0.694128 0.900000 0.800 0.694386 0.900000 0.800 0.694636 0.900000 0.800 0.694878 0.900000 0.800 0.695111 0.900000 0.800 0.695336 0.900000 0.800 0.695554 0.900000 0.800 0.695763 0.900000 0.800 0.695965 0.900000 0.800 0.696160 0.900000 0.800 0.696348 0.900000 0.800 0.696528 0.900000 0.800 0.696702 0.900000 0.800 0.696869 0.900000 0.800 0.697030 0.900000 0.800 0.697184 0.900000 0.800 0.697332 0.900000 0.800 0.697474 0.900000 0.800 0.697610 0.900000]; Usuarios/Junior/Novo/UFCG/C�lculo Num�rico/teste/MATRIZ.TXT 3 3 5 10. 1. 1. 1. 10. 1. 1. 1. 10. 12. 12. 12. Usuarios/Junior/Novo/UFCG/C�lculo Num�rico/teste/MEUNUM.TXT 4. Usuarios/Junior/Novo/UFCG/C�lculo Num�rico/teste/CN1.DOC UNIVERSIDADE FEDERAL DA PARAÍBA CENTRO DE CIÊNCIAS E TECNOLOGIA COORDENAÇÃO DOS CURSOS DE GRADUAÇÃO EM ENGENHARIA ELÉTRICA CÁLCULO NUMÉRICO DATA:Março/1998 PROFESSOR:José Homero Feitosa Cavalcanti Exercício I A fórmula geral das bases numéricas (FGBN) é: 1)Supondo M10=12345, um número inteiro na base 10 (B10), usando a FGBN explique que é ai, Bi, m e n. Qual a fórmula do polinômio de M10? 2)Passar os seguintes números para a base decimal: M16=1DFE; M8=7643; M4=33210; M2=111100010101001. 3)Sabendo-se que M2=111100010101001. Ache M4; M8 e M16. 4)Sabendo-se que M9=84675, ache M3. 5)Conhecendo-se M10=45965, calcule M2. 6) "Dois exploradores espaciais encontram os restos de uma cidade marciana. Após muitas pesquisas, eles não encontram nenhuma representação ou desenho dos marcianos. Durante a exploração das ruínas da cidade marciana, eles encontram uma pequena caixa de pedra fechada e lacrada e com os sinais gravados na tampa da caixa.. Dentro da caixa de pedra eles contam 21 pequenas bolas de pedra.". Pergunta-se: Quantos dedos tinham os marcianos? 7)Usando um byte como se pode representar números para a)contagem; b)complemento de um; c)complemento de dois. Quais os valores maiores e menores de cada representação? 8)Representar os seguintes números na forma inteiro/fração. Utilize 8 algarismos para a rpresentação inteira e 6 algarismos para a representação fracionária. a)M10=154325.000345; b)M16=ACDE$F769=D0005AF; c)M2=1000010.0001011111. 9)Converta os seguintes números decimais para binário:0.08463; 0.789304; 0.95001. Use representação com oito bits. 10)O que significam mantissa e característica (expoente)? 11)Represente os seguintes números decimais em números binários em ponto flutuante: 1256.34501; 845.00234; 0.00004563; -345.23. Use mantissa de 24 bits e expoente de oito bits. Exercício II 1)"Dois exploradores andinos encontram os restos de uma cidade Inca no Peru. Eles observam, numa pedra, a gravação do Deus Inca sendo adorado por um grupo de sacerdotes. Os exploradores observam espantados que o Deus Inca e os sacerdotes estavam representados sem uma das mãos isto é, eram manetas. Continuando a exploração das ruínas da cidade, os arqueólogos encontram uma pequena caixa de pedra fechada e lacrada contendo 6 pequenas bolas de pedra. Na face externa da caixa, eles observam dois caracteres gravados em baixo relevo." - Pergunta-se: Quais os caracteres que estavam desenhados na tampa da caixa? 2)Faça o arredondamento dos seguintes números para 3 dígitos significativos. Determine os seus valores absolutos e os seus erros relativos obtidos dos seus números aproximados: a)2.1514; b)0.16152; c)0.01204; d)1.225; e)-0.0015281; f)-392.85; g)0.1564; h)0.003922; i)625.55; j)-0.0015281 3)Determine os erros absolutos dos seguintes números aproximadose forneça os seus erros relativos: a)a=13267 =0.1% ; b)a=2.32 =0.7% ; c)a=35.72 =1.% ; d)a=0.896 =10% ; e)a=232.44 =1% 4)Foram obtidos a partir de medições os seguintes ângulos. Determine os erros relativos dos números supondo o erro de medição igual a 1%. a)21o37'3'' b)45o; c)1o10''; d)75o20'44'' 5)Determine o número de dígitos corretos sendo dados os seus erros absolutos. a)x=0.3941 x=0.25.10-2; a)x=0.1132 x=0.1.10-3; a)x=-0.2113 x=0.5.10-2; 5)Determine o número de dígitos corretos sendo dados os seus erros relativos. a)a=1.8921 x=0.1.10-2; b)a=0.2218 x=0.2.10-1; c)a=0.02425 x=0.5.10-2 6)Encontre a soma dos números aproximados e indique os seus erros. a)0.145+321+78.2 (todos dígitos corretos) b)0.301+193.1+11.58 c)398.5-72.28+0.34567 d)x1+x2-x3, onde x1=-197.6 x1=0.2; x2=23.44 x2=0.22; x3=201.55 x1=0.17 7)Encontre os produtos dos números aproximados e indique os erros. a)3.49 * 8.6; b)25.1 * 1.743; c)0.02 * 16.5; d)0.253 * 654 * 83.6 8)Encontre os quocientes dos seguintes números aproximados. a)5.684/5.032; b)0.144/1.2; c)216/4; d)726.676/829; e)754.9367/36.5 9)Os lados de um retângulo são iguais a (4.02±0.01)m, (4.96±0.01)m. Calcule a sua área. 10)Os lados de um triângulo agudo são (12.1±0.01)cm, (25.21±0.01)m. Calcule a tangente ao ângulo oposto ao primeiro lado. 11)O raio R de um círculo foi medido com uma acurácia de 0.5cm e com valor 12cm. Encontre o erro absoluto e erro relativo da medida da área do círculo. 12)A altura h e o raio R do círculo base do cilindro foram medidos com acurácia de 0.5%. Qual é o erro relativo limite obtido na computação do volume do cilindro? CÁLCULO NUMÉRICO DATA:Novembro/1998 PROFESSOR:José Homero Feitosa Cavalcanti Exercício III Fig.1 Duas classes delimitadas pela reta x2=x1+1. 1)Usando x2=ax1+b. Qual é a equação da reta que passa pelos pontos (1.,0.) e (0.,-1.)? Qual a diferença entre esta reta e a mostrada na Fig.1? Desenhe esta reta na Fig.1. 2)Usando x2=ax1+b. Qual é a equação da reta que passa pelos pontos (-1.,0.) e (0.,0.5)? Qual o ponto de intesecção entre esta reta e a reta mostrada na Fig.1? Qual a declividade desta reta e a declividade da reta da Fig.1? Desenhe esta reta na Fig.1. 3)Escreva as equações das retas dos exercícios 1 e 2 usando R = W2x2 + W1x1 + W0. 4)O que deve mudar na reta do exercício 1 para ela se tornar a reta da Fig.1? 5)O que deve mudar na reta do exercício 2 para ela se tornar a reta da Fig.1? 6)Qual o peso da reta R=W2x2+W1x1+W0 mais sensível a mudanças no seu valor (W2, W1 ou W0)? 7)Quais são as retas perpendiculares as retas dos exercícios 1 e 2. Mostre na forma x2=ax1+b e R = W2x2 + W1x1 + W0. Mostre a fórmula utilizada. 8)Qual a derivada das retas dos exercícios 1, 2 e 7? 9)Onde as retas dos exercícios 1, 2 e 7 interceptam o eixo x1? 10)Onde as retas paralelas as abscissas e as retas paralelas as ordenadas interceptam a)o eixo dos y; b)o eixo dos x?. � CÁLCULO NUMÉRICO DATA:Novembro/1998 PROFESSOR:José Homero Feitosa Cavalcanti Exercício IV 1)Desenhe as seguintes funções: a)f(x)=1-cos(x); b)f(x)=seno(x)-0.8; c)f(x)=1-tg(x); d)f(x)=x2+1; e)f(x)=x2-1; f)f(x)=seno(x)-2*cos(x). 2)Mostre graficamente os (ou o) pontos de interseção com o eixo dos x (abscissa) das curvas do exercício 1. 3)Calcule e desenhe as derivadas das funções do exercício 1. 4)De acordo com o teorema de Bolzano quais são os intervalos em que as funções do exercício 1 possuem pelo menos uma raiz? 5)Calcule as raízes dos seguintes polinômios: a)p(x)=ax2+bx+c=0; b)p(x)=x2-(a+b)bx+ab=0. Encontre as raízes dos polinômios a) e b) e os desenhe 1)a=1, b=-2 e c=-1; 2)a=1, b=2 e c=1; � UNIVERSIDADE FEDERAL DA PARAÍBA CENTRO DE CIÊNCIAS E TECNOLOGIA COORDENAÇÃO DOS CURSOS DE GRADUAÇÃO EM ENGENHARIA ELÉTRICA CÁLCULO NUMÉRICO DATA:Novembro/1998 PROFESSOR:José Homero Feitosa Cavalcanti EXERCÍCIO V 1)Calcular as raízes das seguintes funções usando os métodos a)Zoom; b)Bissecção; c)Iteração linear. 1.1)f(x)=x2-5 1.2)f(x)=x2-x-2; No caso de iteraçao linear use cn1 para f(x) e cn2 para x=x2-2; x=sqrt(2+x); x=1+2/x e x=x-(x2-x-2)/m com m(0. 1.3)f(x)=M-E+e*seno(E); para M=0.5 e e=0.2 1.4)f(x)=x3+1.9x2-1.3x-2.2=0. 1.5)f(x)=x*ln(x)-3.2 1.6)f(x)=5log(x)-2+0.4x 1.7)f(x)=x2+0.96x-2.08 1.8)Represente as funções 1.1; 1.3; 1.6 e 1.7 na forma x=g(x) da iteração linear. � UNIVERSIDADE FEDERAL DA PARAÍBA CENTRO DE CIÊNCIAS E TECNOLOGIA COORDENAÇÃO DOS CURSOS DE GRADUAÇÃO EM ENGENHARIA ELÉTRICA CÁLCULO NUMÉRICO DATA:1998/2 PROFESSOR:José Homero Feitosa Cavalcanti LABORATÓRIO I PRÁTICA Utilize o programa cn1.exe para encontrar a raiz quadrada do seu número na lista de presença. O seu número de presença deve ser armazenado no arquivo meunum.txt. Faça usando os métodos a)Zoom; b)Bissecção. Apresente os resultados para 5 iterações (mostre os gráficos obtidos). Qual dos dois métodos convergiu mais rapidamente? Compare os dois métodos. LABORATÓRIO II PRÁTICA Utilize o programa cn2.exe para encontrar a raiz de um polinômio de segundo grau com três diferentes funções g(x). O inverso do seu número da lista de presença deverá ser adicionado à raiz inicial que você escolheu. Faça 5 iterações para cada tipo de função g(x) e apresente os resultados da última das 5 iterações (mostre os gráficos obtidos). Explique o valor de g'(x) no intervalo em que se encontra a raiz (justifique a convergência ou não convergência). Observe-se que são três tipos de funções g(x), duas raízes, devem ser fornecidos os resultados em 6 gráficos acompanhados das explicações (o valor de g'(x) no intervalo em que existe a raiz). � LABORATÓRIO III PRÁTICA Utilize o programa cn3.exe para solucionar um sistema de equações lineares pelo método de Gauss-Seidel. O inverso do seu número da lista de presença deverá ser adicionado à raiz inicial que você escolheu um dos sistemas de equações lineares mostrados abaixo. Qual deles converge mais rápido (explique)? Qual o método utilizado no programa CN3.c, deslocamentos simultâneos ou deslocamentos sucessivos? Explique. Modifique o programa CN3.c para o Gauss-Seidel com deslocamentos simultâneos (sugestão, faça um novo vetor float x[11]). 10x1 + x2 + x3 = 12(1+1/sn) x1 + 10x2 + x3 = 12(1+1/sn) x1 + x2 + 10x3 = 12(1+1/sn) x1 + 10x2 + x3 = 12(1+1/sn) 10x1 + x2 + x3 = 12(1+1/sn) x1 + x2 + 10x3 = 12(1+1/sn) x1 + x2 + 10x3 = 12(1+1/sn) x1 + 10x2 + x3 = 12(1+1/sn) 10x1 + x2 + x3 = 12(1+1/sn) � LABORATÓRIO IV PRÁTICA Utilize o programa motorcc.exe para simular um motor elétrico de corrente contínua utilizando o método de Runge Kutta de Quarta ordem. Apresente os parâmetros do motor. Faça o mesmo utilizando o método de Euler utilizando Ra=1.+1/(10*seu_numero). _950446773.doc _951565832.doc A B x1 -1 1 x2 _950445568.unknown Usuarios/Junior/Novo/UFCG/C�lculo Num�rico/teste/CN3.DOC UNIVERSIDADE FEDERAL DA PARAÍBA CENTRO DE CIÊNCIAS E TECNOLOGIA COORDENAÇÃO DOS CURSOS DE GRADUAÇÃO EM ENGENHARIA ELÉTRICA CÁLCULO NUMÉRICO DATA: Julho/1999 PROFESSOR: José Homero Feitosa Cavalcanti LABORATÓRIO III PRÁTICA Utilize o programa matrizes para solucionar um sistema de equações lineares pelos métodos “Esquemas Compactos” e Gauss-Seidel. O inverso do seu número da lista de presença deverá ser adicionado à primeira raiz. O sistema na forma Ax=b deverá ter o vetor b modificado como mostrado abaixo. Sistema 1 10x1 + x2 + x3 = 12+10/sn x1 + 10x2 + x3 = 12+1/sn x1 + x2 + 10x3 = 12+1/sn Sistema 2 x1 + 10x2 + x3 = 12+1/sn 10x1 + x2 + x3 = 12+10/sn x1 + x2 + 10x3 = 12+1/sn Sistema 3 x1 + x2 + 10x3 = 12+1/sn x1 + 10x2 + x3 = 12+1/sn 10x1 + x2 + x3 = 12+10/sn 1)Qual dos sistemas de equações mostrados acima converge ou não converge quando solucionados utilizando os métodos Gauss-Seidel e “Esquemas Compactos” (explique)? Por que o método Gauss-Seidel não converge para alguns dos sistemas mostrados acima? 2)Qual o método utilizado no programa matrizes.for, deslocamentos simultâneos ou deslocamentos sucessivos? Explique. 3)Modifique o programa matrizes.for para o método Gauss-Seidel com deslocamentos simultâneos (sugestão, faça um novo vetor x(i,1) a cada iteração). Apresente os resultados obtidos rodando o programa matrizes.for para o Sistema 1 mostrado acima. Usuarios/Junior/Novo/UFCG/C�lculo Num�rico/teste/CN4.DOC UNIVERSIDADE FEDERAL DA PARAÍBA CENTRO DE CIÊNCIAS E TECNOLOGIA COORDENAÇÃO DOS CURSOS DE GRADUAÇÃO EM ENGENHARIA ELÉTRICA CÁLCULO NUMÉRICO DATA: 1999/1 PROFESSOR: José Homero Feitosa Cavalcanti LABORATÓRIO IV Parâmetros do motor CC As variáveis de estado do sistema motor CC podem ser definidas como (t), (t) e Ia(t). O modelo de estado na forma contínua do motor CC é mostrado na equação 1. A resistência dos enrolamentos de armadura representada por Ra, a indutância de armadura por La, a inércia do rotor do motor por Jm, o coeficiente de atrito viscoso por Bm, a constante de torque por Ki, e a constante de fcem por K Sendo a indutância da armadura muito pequena [D'azzo, 1988][Ogata, 1982], a constante de tempo elétrica pode ser dada por =(RaJm)/(RaBm+KbKi), e a constante de acionamento do motor CC pode ser dada por =Ki/(RaBm+KbKi) [Dessaint et alii, 1990]. ��EMBED Equation.3 + ��EMBED Equation.3 (1) dIa(t)/dt = -(Ra/La)Ia(t)-(Kb/La)(t)+Ea(t)/La (2) d(t)/dt = Ki/JmIa(t)-(Bm/Jm)(t)-Tl(t)/Jm (3) d(t)/dt = (t) (4) O modelo contínuo de segunda e de primeira ordem da função de transferência do motor CC são representados pelas equações 5 e 6 G1(s) = (5) G2(s) = (6) Utilize o programa motorcc.exe (motorcc1.exe) para simular um motor elétrico de corrente contínua (eq.2 e eq.3, corrente de armadura e velocidade) utilizando o método de Runge-Kutta de Quarta ordem e o método de Euler. Apresente os parâmetros do motor e utilize a resistência da armadura com o seguinte valor Ra=1.+1/(10*seu_numero). Implemente o método de Runge-Kutta para calcular o deslocamento do eixo do motor cc (eq.4). Usuarios/Junior/Novo/UFCG/C�lculo Num�rico/teste/QC.INI QC����_ð��� ��p����������������� Usuarios/Junior/Novo/UFCG/C�lculo Num�rico/teste/cn1.zip CN1.EXE CN1.DOC UNIVERSIDADE FEDERAL DA PARAÍBA CENTRO DE CIÊNCIAS E TECNOLOGIA COORDENAÇÃO DOS CURSOS DE GRADUAÇÃO EM ENGENHARIA ELÉTRICA CÁLCULO NUMÉRICO DATA:Março/1998 PROFESSOR:José Homero Feitosa Cavalcanti Exercício I A fórmula geral das bases numéricas (FGBN) é: 1)Supondo M10=12345, um número inteiro na base 10 (B10), usando a FGBN explique que é ai, Bi, m e n. Qual a fórmula do polinômio de M10? 2)Passar os seguintes números para a base decimal: M16=1DFE; M8=7643; M4=33210; M2=111100010101001. 3)Sabendo-se que M2=111100010101001. Ache M4; M8 e M16. 4)Sabendo-se que M9=84675, ache M3. 5)Conhecendo-se M10=45965, calcule M2. 6) "Dois exploradores espaciais encontram os restos de uma cidade marciana. Após muitas pesquisas, eles não encontram nenhuma representação ou desenho dos marcianos. Durante a exploração das ruínas da cidade marciana, eles encontram uma pequena caixa de pedra fechada e lacrada e com os sinais gravados na tampa da caixa.. Dentro da caixa de pedra eles contam 21 pequenas bolas de pedra.". Pergunta-se: Quantos dedos tinham os marcianos? 7)Usando um byte como se pode representar números para a)contagem; b)complemento de um; c)complemento de dois. Quais os valores maiores e menores de cada representação? 8)Representar os seguintes números na forma inteiro/fração. Utilize 8 algarismos para a rpresentação inteira e 6 algarismos para a representação fracionária. a)M10=154325.000345; b)M16=ACDE$F769=D0005AF; c)M2=1000010.0001011111. 9)Converta os seguintes números decimais para binário:0.08463; 0.789304; 0.95001. Use representação com oito bits. 10)O que significam mantissa e característica (expoente)? 11)Represente os seguintes números decimais em números binários em ponto flutuante: 1256.34501; 845.00234; 0.00004563; -345.23. Use mantissa de 24 bits e expoente de oito bits. Exercício II 1)"Dois exploradores andinos encontram os restos de uma cidade Inca no Peru. Eles observam, numa pedra, a gravação do Deus Inca sendo adorado por um grupo de sacerdotes. Os exploradores observam espantados que o Deus Inca e os sacerdotes estavam representados sem uma das mãos isto é, eram manetas. Continuando a exploração das ruínas da cidade, os arqueólogos encontram uma pequena caixa de pedra fechada e lacrada contendo 6 pequenas bolas de pedra. Na face externa da caixa, eles observam dois caracteres gravados em baixo relevo." - Pergunta-se: Quais os caracteres que estavam desenhados na tampa da caixa? 2)Faça o arredondamento dos seguintes números para 3 dígitos significativos. Determine os seus valores absolutos e os seus erros relativos obtidos dos seus números aproximados: a)2.1514; b)0.16152; c)0.01204; d)1.225; e)-0.0015281; f)-392.85; g)0.1564; h)0.003922; i)625.55; j)-0.0015281 3)Determine os erros absolutos dos seguintes números aproximadose forneça os seus erros relativos: a)a=13267 =0.1% ; b)a=2.32 =0.7% ; c)a=35.72 =1.% ; d)a=0.896 =10% ; e)a=232.44 =1% 4)Foram obtidos a partir de medições os seguintes ângulos. Determine os erros relativos dos números supondo o erro de medição igual a 1%. a)21o37'3'' b)45o; c)1o10''; d)75o20'44'' 5)Determine o número de dígitos corretos sendo dados os seus erros absolutos. a)x=0.3941 x=0.25.10-2; a)x=0.1132 x=0.1.10-3; a)x=-0.2113 x=0.5.10-2; 5)Determine o número de dígitos corretos sendo dados os seus erros relativos. a)a=1.8921 x=0.1.10-2; b)a=0.2218 x=0.2.10-1; c)a=0.02425 x=0.5.10-2 6)Encontre a soma dos números aproximados e indique os seus erros. a)0.145+321+78.2 (todos dígitos corretos) b)0.301+193.1+11.58 c)398.5-72.28+0.34567 d)x1+x2-x3, onde x1=-197.6 x1=0.2; x2=23.44 x2=0.22; x3=201.55 x1=0.17 7)Encontre os produtos dos números aproximados e indique os erros. a)3.49 * 8.6; b)25.1 * 1.743; c)0.02 * 16.5; d)0.253 * 654 * 83.6 8)Encontre os quocientes dos seguintes números aproximados. a)5.684/5.032; b)0.144/1.2; c)216/4; d)726.676/829; e)754.9367/36.5 9)Os lados de um retângulo são iguais a (4.02±0.01)m, (4.96±0.01)m. Calcule a sua área. 10)Os lados de um triângulo agudo são (12.1±0.01)cm, (25.21±0.01)m. Calcule a tangente ao ângulo oposto ao primeiro lado. 11)O raio R de um círculo foi medido com uma acurácia de 0.5cm e com valor 12cm. Encontre o erro absoluto e erro relativo da medida da área do círculo. 12)A altura h e o raio R do círculo base do cilindro foram medidos com acurácia de 0.5%. Qual é o erro relativo limite obtido na computação do volume do cilindro? CÁLCULO NUMÉRICO DATA:Novembro/1998 PROFESSOR:José Homero Feitosa Cavalcanti Exercício III Fig.1 Duas classes delimitadas pela reta x2=x1+1. 1)Usando x2=ax1+b. Qual é a equação da reta que passa pelos pontos (1.,0.) e (0.,-1.)? Qual a diferença entre esta reta e a mostrada na Fig.1? Desenhe esta reta na Fig.1. 2)Usando x2=ax1+b. Qual é a equação da reta que passa pelos pontos (-1.,0.) e (0.,0.5)? Qual o ponto de intesecção entre esta reta e a reta mostrada na Fig.1? Qual a declividade desta reta e a declividade da reta da Fig.1? Desenhe esta reta na Fig.1. 3)Escreva as equações das retas dos exercícios 1 e 2 usando R = W2x2 + W1x1 + W0. 4)O que deve mudar na reta do exercício 1 para ela se tornar a reta da Fig.1? 5)O que deve mudar na reta do exercício 2 para ela se tornar a reta da Fig.1? 6)Qual o peso da reta R=W2x2+W1x1+W0 mais sensível a mudanças no seu valor (W2, W1 ou W0)? 7)Quais são as retas perpendiculares as retas dos exercícios 1 e 2. Mostre na forma x2=ax1+b e R = W2x2 + W1x1 + W0. Mostre a fórmula utilizada. 8)Qual a derivada das retas dos exercícios 1, 2 e 7? 9)Onde as retas dos exercícios 1, 2 e 7 interceptam o eixo x1? 10)Onde as retas paralelas as abscissas e as retas paralelas as ordenadas interceptam a)o eixo dos y; b)o eixo dos x?. � CÁLCULO NUMÉRICO DATA:Novembro/1998 PROFESSOR:José Homero Feitosa Cavalcanti Exercício IV 1)Desenhe as seguintes funções: a)f(x)=1-cos(x); b)f(x)=seno(x)-0.8; c)f(x)=1-tg(x); d)f(x)=x2+1; e)f(x)=x2-1; f)f(x)=seno(x)-2*cos(x). 2)Mostre graficamente os (ou o) pontos de interseção com o eixo dos x (abscissa) das curvas do exercício 1. 3)Calcule e desenhe as derivadas das funções do exercício 1. 4)De acordo com o teorema de Bolzano quais são os intervalos em que as funções do exercício 1 possuem pelo menos uma raiz? 5)Calcule as raízes dos seguintes polinômios: a)p(x)=ax2+bx+c=0; b)p(x)=x2-(a+b)bx+ab=0. Encontre as raízes dos polinômios a) e b) e os desenhe 1)a=1, b=-2 e c=-1; 2)a=1, b=2 e c=1; � � UNIVERSIDADE FEDERAL DA PARAÍBA CENTRO DE CIÊNCIAS E TECNOLOGIA COORDENAÇÃO DOS CURSOS DE GRADUAÇÃO EM ENGENHARIA ELÉTRICA CÁLCULO NUMÉRICO DATA:Novembro/1998 PROFESSOR:José Homero Feitosa Cavalcanti EXERCÍCIO V 1)Calcular as raízes das seguintes funções usando os métodos a)Zoom; b)Bissecção; c)Iteração linear. 1.1)f(x)=x2-5 1.2)f(x)=x2-x-2; No caso de iteraçao linear use cn1 para f(x) e cn2 para x=x2-2; x=sqrt(2+x); x=1+2/x e x=x-(x2-x-2)/m com m(0. 1.3)f(x)=M-E+e*seno(E); para M=0.5 e e=0.2 1.4)f(x)=x3+1.9x2-1.3x-2.2=0. 1.5)f(x)=x*ln(x)-3.2 1.6)f(x)=5log(x)-2+0.4x 1.7)f(x)=x2+0.96x-2.08 1.8)Represente as funções 1.1; 1.3; 1.6 e 1.7 na forma x=g(x) da iteração linear. PRÁTICA Utilize o programa cn1.exe para encontrar a raiz quadrada do seu número na lista de presença. O seu número de presença deve ser armazenado no arquivo meunum.txt. Faça usando os métodos a)Zoom; b)Bissecção. Apresente os resultados para 5 iterações (mostre os gráficos obtidos). Qual dos dois métodos convergiu mais rapidamente? Compare os dois métodos. � _950446773.doc _951565832.doc A B x1 -1 1 x2 _950445568.unknown CN1.C #include <graph.h> #include <time.h> #include <dos.h> #include <math.h> #include <stdio.h> #include <stdlib.h> struct videoconfig vc; struct rccoord rcoord; int TMSx,TMSy; float erro,raiz,a0,b0,x[102],y[102],h,max,valor,num; int i,iter,j; char buffer[81]; main() { FILE *fp_in; fp_in = fopen("meunum.txt","r"); fscanf(fp_in,"%f",&num); fclose(fp_in); erro=0.; a0=0.; b0=0.; janela(); _settextposition(1,1); _outtext("METODO DO ZOOM PARA ACHAR AS RAIZES DA FUNCAO y=x*x-C"); _settextposition(2,1); _outtext("C = N, N (real) eh o seu numero na lista de presenca"); _settextposition(3,1); _outtext("C deve ser gravado no arquivo meunum.txt"); _settextposition(4,1); _outtext("Forneca Numero de testes (iteracoes) = "); scanf("%d",&iter); janela0(); for(j=1;j<=iter;j++) { _setcolor(14); _settextposition(1,1); sprintf(buffer,"y=x*x-%5.1f a0=%7.4f b0=%7.4f",num,a0,b0); _outtext(buffer); _settextposition(2,1); sprintf(buffer,"Forneca inicio do intervalo A%d = ",j); _outtext(buffer); scanf("%f",&a0); _settextposition(3,1); sprintf(buffer,"Forneca o final do intervalo B%d = ",j); _outtext(buffer); scanf("%f",&b0); /* CALCULO DOS PONTOS X E Y - 100 PONTOS*/ _settextcolor(12); h=(b0-a0)/99.; x[1]=a0; funcao(1); for(i=2;i<=100;i++) { x[i]=x[i-1]+h; funcao(i); } janela0(); /*DESENHO DA CURVA*/ raiz=(a0+b0)/2.; erro=fabs((b0-a0)/2.); sprintf(buffer,"a0=%7.4f b0=%7.4f raiz_aprox=%7.4f erro=%8.5f",a0,b0,raiz,erro); _outtext(buffer); max=y[1]; for(i=2;i<=100;i++) { if(y[i]>max)max=y[i]; /*funcao*/ } _settextposition(1,20); _setcolor(13); _moveto(-TMSx,0); _lineto(TMSx,0); _moveto(0,-TMSy/2); _lineto(0,TMSy/2); _moveto(200,-TMSy/2); _lineto(200,TMSy/2); _setcolor(9); _moveto(100,-TMSy/2-20); _lineto(100,TMSy/2+20); _setcolor(14); for(i=1;i<=99;i++) { valor=(int)(100.*y[i]/max); _moveto(2*i,-valor); valor=(int)(100.*y[i+1]/max); _lineto(2*i+1,-valor); } getch(); } _setvideomode(_DEFAULTMODE); } janela() { _setvideomode(_VRES16COLOR); _getvideoconfig(&vc); TMSy = (int)(vc.numypixels/2); TMSx = (int)(vc.numxpixels/2); _setlogorg (vc.numxpixels/2 - 1, vc.numypixels/2 - 1); _settextwindow(1,1,33,80); _settextcolor(14); _setcolor(11); } janela0() { _clearscreen(_GWINDOW); } funcao(int id) { y[id]=x[id]*x[id]-num; } CN1.OBJ MEUNUM.TXT 11. QC.INI QC��_�w���� ��p����������������� Usuarios/Junior/Novo/UFCG/C�lculo Num�rico/teste/CN1.EXE Usuarios/Junior/Novo/UFCG/C�lculo Num�rico/teste/CN2.EXE Usuarios/Junior/Novo/UFCG/C�lculo Num�rico/teste/CN3.EXE Usuarios/Junior/Novo/UFCG/C�lculo Num�rico/teste/ITERLIN.EXE Usuarios/Junior/Novo/UFCG/C�lculo Num�rico/teste/LINFOR.EXE Usuarios/Junior/Novo/UFCG/C�lculo Num�rico/teste/MATRIZ~1.EXE Usuarios/Junior/Novo/UFCG/C�lculo Num�rico/teste/MATRIZES.EXE Usuarios/Junior/Novo/UFCG/C�lculo Num�rico/teste/MOTOR.EXE Usuarios/Junior/Novo/UFCG/C�lculo Num�rico/teste/MOTORCC.EXE Usuarios/Junior/Novo/UFCG/C�lculo Num�rico/teste/MOTORCC1.EXE Usuarios/Junior/Novo/UFCG/C�lculo Num�rico/teste/Motorcc2.exe Usuarios/Junior/Novo/UFCG/C�lculo Num�rico/teste/NEWFOR.EXE Usuarios/Junior/Novo/UFCG/C�lculo Num�rico/teste/NEWTON.EXE Usuarios/Junior/Novo/UFCG/C�lculo Num�rico/teste/SINE.EXE Usuarios/Junior/Novo/UFCG/C�lculo Num�rico/teste/CN1.C #include <graph.h> #include <time.h> #include <dos.h> #include <math.h> #include <stdio.h> #include <stdlib.h> struct videoconfig vc; struct rccoord rcoord; int TMSx,TMSy; float erro,raiz,a0,b0,x[102],y[102],h,max,valor,num; int i,iter,j; char buffer[81]; main() { FILE *fp_in; fp_in = fopen("meunum.txt","r"); fscanf(fp_in,"%f",&num); fclose(fp_in); erro=0.; a0=0.; b0=0.; janela(); _settextposition(1,1); _outtext("METODO DO ZOOM PARA ACHAR AS RAIZES DA FUNCAO y=x*x-C"); _settextposition(2,1); _outtext("C = N, N (real) eh o seu numero na lista de presenca"); _settextposition(3,1); _outtext("C deve ser gravado no arquivo meunum.txt"); _settextposition(4,1); _outtext("Forneca Numero de testes (iteracoes) = "); scanf("%d",&iter); janela0(); for(j=1;j<=iter;j++) { _setcolor(14); _settextposition(1,1); sprintf(buffer,"y=x*x-%5.1f a0=%7.4f b0=%7.4f",num,a0,b0); _outtext(buffer); _settextposition(2,1); sprintf(buffer,"Forneca inicio do intervalo A%d = ",j); _outtext(buffer); scanf("%f",&a0); _settextposition(3,1); sprintf(buffer,"Forneca o final do intervalo B%d = ",j); _outtext(buffer); scanf("%f",&b0); /* CALCULO DOS PONTOS X E Y - 100 PONTOS*/ _settextcolor(12); h=(b0-a0)/99.; x[1]=a0; funcao(1); for(i=2;i<=100;i++) { x[i]=x[i-1]+h; funcao(i); } janela0(); /*DESENHO DA CURVA*/ raiz=(a0+b0)/2.; erro=fabs((b0-a0)/2.); sprintf(buffer,"a0=%7.4f b0=%7.4f raiz_aprox=%7.4f erro=%8.5f",a0,b0,raiz,erro); _outtext(buffer); max=y[1]; for(i=2;i<=100;i++) { if(y[i]>max)max=y[i]; /*funcao*/ } _settextposition(1,20); _setcolor(13); _moveto(-TMSx,0); _lineto(TMSx,0); _moveto(0,-TMSy/2); _lineto(0,TMSy/2); _moveto(200,-TMSy/2); _lineto(200,TMSy/2); _setcolor(9); _moveto(100,-TMSy/2-20); _lineto(100,TMSy/2+20); _setcolor(14); for(i=1;i<=99;i++) { valor=(int)(100.*y[i]/max); _moveto(2*i,-valor); valor=(int)(100.*y[i+1]/max); _lineto(2*i+1,-valor); } getch(); } _setvideomode(_DEFAULTMODE); } janela() { _setvideomode(_VRES16COLOR); _getvideoconfig(&vc); TMSy = (int)(vc.numypixels/2); TMSx = (int)(vc.numxpixels/2); _setlogorg (vc.numxpixels/2 - 1, vc.numypixels/2 - 1); _settextwindow(1,1,33,80); _settextcolor(14); _setcolor(11); } janela0() { _clearscreen(_GWINDOW); } funcao(int id) { y[id]=x[id]*x[id]-num; } Usuarios/Junior/Novo/UFCG/C�lculo Num�rico/teste/ITERLIN.C #include <graph.h> #include <time.h> #include <dos.h> #include <math.h> #include <stdio.h> #include <stdlib.h> struct videoconfig vc; struct rccoord rcoord; int TMSx,TMSy,tipo,iter,onde; float erro,raiz,a0,b0,x[102],y[102],h,max,valor; main() { int i,aga,numero; float xnum; char buffer[81]; erro=0; janela(); _setcolor(12); _settextposition(1,1); _outtext("METODO DA ITERACAO LINEAR PARA ACHAR AS RAIZES DE UMA FUNCAO "); _settextposition(2,1); _outtext("Raizes 2 e -1 para f(x)=x*x-x-2=0 Tipos de x=g(x)"); _settextposition(3,1); _outtext("if(tipo==1)y[id]=sqrt(2.+x[id]);"); _settextposition(4,1); _outtext("if(tipo==2)y[id]=x[id]*x[id]-2.;"); _settextposition(5,1); _outtext("if(tipo==3)y[id]=1.+2/x;"); _setcolor(14); _settextposition(6,1); _outtext("Forneca o Tipo (1, 2 ou 3) das funcoes g(x) = "); scanf("%d",&tipo); _settextposition(7,1); _outtext("Forneca inicio do intervalo [a,b] a = "); scanf("%f",&a0); _settextposition(8,1); _outtext("Forneca o fim do intervalo [a,b] b = "); scanf("%f",&b0); _settextposition(9,1); _outtext("Forneca Numero de Iteracoes = "); scanf("%d",&iter); _settextposition(10,1); _outtext("Forneca o seu numero (real), tal que "); _settextposition(11,1); _outtext("o valor inicial x0 de x1 = g(x0) seja calculado como"); _settextposition(12,1); _outtext("x0 = 1.+1/(seu numero), seu numero (real) = "); scanf("%f",&raiz); if(raiz==0.)raiz=0.01; else if(raiz>0.)raiz=1.+1./raiz; else raiz= -0.5-1./raiz; _settextposition(13,1); sprintf(buffer,"VALORES: a0=%7.4f b0=%7.4f raiz=%7.4f iter=%d", a0,b0,raiz,iter); _outtext(buffer); /* CALCULO DOS PONTOS X E Y - 100 PONTOS*/ _settextcolor(12); h=(b0-a0)/100.; x[1]=a0; funcao(1); for(i=2;i<=100;i++) { x[i]=x[i-1]+h; funcao(i); } getch(); janela0(); _settextposition(1,10); sprintf(buffer,"a0=%7.4f b0=%7.4f raiz=%7.4f iter=%d",a0,b0,raiz,iter); _outtext(buffer); /*DESENHO DA CURVA*/ x[0]=raiz; funcao(0); max=y[1]; for(i=2;i<=100;i++) /*Calcula o maximo da funcao em [a,b]*/ { if(y[i]>max)max=y[i]; } /*Desenha as coordenadas*/ _setcolor(14); _moveto(-TMSx,0); _lineto(TMSx,0); _moveto(0,-TMSy/2); _lineto(0,TMSy/2); _moveto(200,-TMSy/2); _lineto(200,TMSy/2); /*Desenha as curvas de f(x)=x e g(x);*/ for(i=1;i<=99;i++) { _setcolor(9); onde=(int)(100.*y[i]/max); _moveto(2*i,-onde); onde=(int)(100.*y[i+1]/max); _lineto(2*i+1,-onde); _setcolor(13); onde=(int)(100.*x[i]/max); _moveto(2*i,-onde); onde=(int)(100.*x[i+1]/max); _lineto(2*i+1,-onde); } _setcolor(9); /*Faz as iteracoes apresentando a raiz na cor azul*/ for(i=1;i<=iter;i++) { erro=fabs(raiz-y[0]); _settextposition(1+i,1); sprintf(buffer,"raiz=%7.4f g(raiz)=%8.5f erro=(g(.)-raiz)=%8.5f Iter=%d", raiz,y[0],erro,i); _outtext(buffer); aga=(int)(200.*(raiz-a0)/(fabs(b0-a0)));/*200*/ _moveto(aga,-TMSy/2-20+15*i); _lineto(aga,TMSy/2+20-15*i); raiz=y[0]; x[0]=raiz; funcao(0); getch(); } _setcolor(14); _settextposition(30,1); erro=fabs(y[0]-x[0]); sprintf(buffer,"raiz=%7.4f g(raiz)=%8.5f erro=(g(.)-raiz)=%8.5f",raiz,y[0],erro); _outtext(buffer); getch(); _setvideomode(_DEFAULTMODE); } janela() { _setvideomode(_VRES16COLOR); _getvideoconfig(&vc); TMSy = (int)(vc.numypixels/2); TMSx = (int)(vc.numxpixels/2); _setlogorg (vc.numxpixels/2 - 1, vc.numypixels/2 - 1); _settextwindow(1,1,23,80); _settextcolor(14); _setcolor(11); } janela0() { _clearscreen(_GWINDOW); } funcao(int id) { /* raizes 2 e -1, f(x)=x*x-x-2=0 */ if(tipo==1)y[id]=sqrt(2.+x[id]); if(tipo==2)y[id]=x[id]*x[id]-2.; if(tipo==3) { if(x[id]!=0.)y[id]=1.+2./x[id]; else y[id]=1.; } } Usuarios/Junior/Novo/UFCG/C�lculo Num�rico/teste/NEWTON.C #include <graph.h> #include <time.h> #include <dos.h> #include <math.h> #include <stdio.h> #include <stdlib.h> struct videoconfig vc; struct rccoord rcoord; int TMSx,TMSy,tipo,iter,onde; float erro,raiz,a0,b0,x[102],y[102],yl[102],h,max,valor; main() { int i,aga,numero,agaa; float xnum; char buffer[81]; erro=0; janela(); _setcolor(12); _settextposition(1,1); _outtext("METODO DE NEWTON RAPHSON PARA ACHAR AS RAIZES DE UMA FUNCAO "); _settextposition(3,1); _outtext("fUNCAO f(x)=x*x-x-2=(x-2)(x+1)=0 "); _settextposition(4,1); _outtext("Forneca inicio do intervalo [a,b] a = "); scanf("%f",&a0); _settextposition(5,1); _outtext("Forneca o fim do intervalo [a,b] b = "); scanf("%f",&b0); _settextposition(6,1); _outtext("Forneca Numero de Iteracoes = "); scanf("%d",&iter); _settextposition(7,1); _outtext("Forneca o seu numero (real), tal que "); _settextposition(8,1); _outtext("o valor inicial x0 de f(x)=0 seja calculado como"); _settextposition(9,1); _outtext("x0 = 1.+1/(seu numero), seu numero (real) = "); scanf("%f",&raiz); if(raiz==0.)raiz=0.01; else if(raiz>0.)raiz=1.+1./raiz; else raiz= -0.5-1./raiz; _settextposition(13,1); sprintf(buffer,"VALORES: a0=%7.4f b0=%7.4f raiz=%7.4f iter=%d", a0,b0,raiz,iter); _outtext(buffer); /* CALCULO DOS PONTOS X E Y - 100 PONTOS*/ _settextcolor(12); h=(b0-a0)/100.; x[1]=a0; funcao(1); for(i=2;i<=100;i++) { x[i]=x[i-1]+h; funcao(i); } getch(); janela0(); _settextposition(1,10); sprintf(buffer,"a0=%7.4f b0=%7.4f raiz=%7.4f iter=%d",a0,b0,raiz,iter); _outtext(buffer); /*DESENHO DA CURVA*/ x[0]=raiz; funcao(0); max=y[1]; for(i=2;i<=100;i++) /*Calcula o maximo da funcao em [a,b]*/ { if(y[i]>max)max=y[i]; } /*Desenha as coordenadas*/ _setcolor(14); _moveto(-TMSx,0); _lineto(TMSx,0); _moveto(0,-TMSy/2); _lineto(0,TMSy/2); _moveto(200,-TMSy/2); _lineto(200,TMSy/2); /*Desenha a curva de f(x)=0*/ for(i=1;i<=99;i++) { _setcolor(9); onde=(int)(100.*y[i]/max); _moveto(2*i,-onde); onde=(int)(100.*y[i+1]/max); _lineto(2*i+1,-onde); _setcolor(13); onde=(int)(100.*yl[i]/max); _moveto(2*i,-onde); onde=(int)(100.*yl[i+1]/max); _lineto(2*i+1,-onde); } /*Faz as iteracoes apresentando a raiz na cor azul*/ x[1]=raiz; aga=(int)(200.*(raiz-a0)/(fabs(b0-a0)));/*200*/ _moveto(aga,-TMSy/2-20+15*i); _lineto(aga,TMSy/2+20-15*i); for(i=1;i<=iter;i++) { funcao(i); _settextposition(1+i,1); _setcolor(8+i); sprintf(buffer,"raiz=%7.4f novaraiz=%7.4f y(raiz)=%8.5f yl(raiz)=%8.5f Iter=%d", x[i],x[i+1],y[i],yl[i],i); _outtext(buffer); aga=(int)(200.*(x[i+1]-a0)/(fabs(b0-a0)));/*200*/ _moveto(aga,-TMSy/2-20+10*i); _lineto(aga,TMSy/2+20-10*i); _setcolor(12); agaa=(int)(200.*(x[i]-a0)/(fabs(b0-a0)));/*abscissa de xi*/ onde=(int)(100.*y[i]/max); aga=(int)(200.*(x[i+1]-a0)/(fabs(b0-a0)));/*abscissa de xi+1*/ _moveto(agaa,-onde); _lineto(aga,0); getch(); } getch(); _setvideomode(_DEFAULTMODE); } janela() { _setvideomode(_VRES16COLOR); _getvideoconfig(&vc); TMSy = (int)(vc.numypixels/2); TMSx = (int)(vc.numxpixels/2); _setlogorg (vc.numxpixels/2 - 1, vc.numypixels/2 - 1); _settextwindow(1,1,23,80); _settextcolor(14); _setcolor(11); } janela0() { _clearscreen(_GWINDOW); } funcao(int id) { /* raizes 2 e -1, f(x)=x*x-x-2=0 */ y[id]=x[id]*x[id]-x[id]-2.; yl[id]=2.*x[id]-1.; if(fabs(yl[id])>0.01)x[id+1]=x[id]-y[id]/yl[id]; } Usuarios/Junior/Novo/UFCG/C�lculo Num�rico/teste/C5.BAT PATH=C:\C5\BIN;C:\TMP;%PATH% set LIB=C:\C5\LIB;%LIB% set INCLUDE=C:\C5\INCLUDE;%INCLUDE% set TMP=%TMP% set INIT=C:\C5\SOURCE\ME\INI;%INIT% Usuarios/Junior/Novo/UFCG/C�lculo Num�rico/teste/ITERLIN.FOR C************************************************************ C UNIVERSIDADE FEDERAL DA PARAIBA C CENTRO DE CIENCIAS E TECNOLOGIA C DEPARTAMENTO DE ENGENHARIA ELETRICA C DISCIPLINA: CALCULO NUMERICO C PROFESSOR: HOMERO C ALUNO: C ESTE PROGRAMA CALCULA A RAIZ DE UMA FUNCAO C ATRAVES DO METODO DA ITERACAO LINEAR C************************************************************ C PROGRAMA ITERACAO LINEAR C DEFINICAO DAS VARIAVEIS USADAS NO PROGRAMA. REAL X0,X1 C *********************************************** C DEFINICAO DA FUNCAO G(X) COM Raizes 2 e -1, f(x)=x*x-x-2=0 FUNCAO(X)=SQRT(2.+X) C *********************************************** C *** LE OS VALORES PARA O INTERVALO [A,B]. WRITE(6,23) 23 FORMAT(' RAIZ INICIAL = ') READ(5,1)X0 1 FORMAT(F5.2) I=1 WRITE(6,6) 6 FORMAT(' RAIZ G(RAIZ) ITER') 2 X1 = FUNCAO(X0) WRITE(6,3)X0,X1,I 3 FORMAT(F9.6 F9.6 I4) X0=X1 C *********************************************** C RETORNA I=I+1 IF(I.LT.10)GO TO 2 STOP END C FIM DO PROGRAMA **************************************** Usuarios/Junior/Novo/UFCG/C�lculo Num�rico/teste/LINFOR.FOR C ITERACAO LINEAR INCLUDE 'FGRAPH.FI' INCLUDE 'FGRAPH.FD' LOGICAL fourcolors EXTERNAL fourcolors IF( fourcolors() ) THEN CALL threegraphs() ELSE WRITE (*,*) ' This program requires an EGA, VGA or', + ' SVGA graphics card.' END IF END C Additional functions defined below C FOURCOLORS - Function to enter graphics mode for REALG. LOGICAL FUNCTION fourcolors() INCLUDE 'FGRAPH.FD' INTEGER*2 dummy RECORD /videoconfig/ screen COMMON screen C C Set to maximum number of available colors. C C dummy = SETVIDEOMODE( $MAXCOLORMODE ) $ERESCOLOR dummy = SETVIDEOMODE( $VRES16COLOR ) CALL GETVIDEOCONFIG( screen ) fourcolors = .TRUE. IF( dummy .EQ. 0 ) fourcolors = .FALSE. END C . SUBROUTINE threegraphs() INCLUDE 'FGRAPH.FD' INTEGER*2 dummy, halfx, halfy INTEGER*2 xwidth, yheight, cols, rows LOGICAL*2 finvert /'.FALSE.' / RECORD /videoconfig/ screen COMMON screen CALL CLEARSCREEN( $GCLEARSCREEN ) xwidth = screen.numxpixels yheight = screen.numypixels cols = screen.numtextcols rows = screen.numtextrows halfx = xwidth / 2 halfy = (yheight / rows) * (rows / 2) CALL SETVIEWPORT( 0, 1, xwidth - 1, yheight - 1 ) CALL SETTEXTWINDOW( 1, 1, rows, cols ) dummy = SETWINDOW( finvert, -3.D0, -1.5D0, 1.5D0, 1.5D0 ) CALL CALCULA( INT2( (rows / 2) + MOD( rows, 2 ) ) ) dummy = RECTANGLE_W( $GBORDER, -3.0, -1.5, 1.5, 1.5 ) READ (*,*) ! Wait for ENTER key to be pressed dummy = SETVIDEOMODE( $DEFAULTMODE ) END C C******************************************** C C Inicio da subrotina ITERACAO LINEAR C C******************************************** C SUBROUTINE CALCULA(numc) INCLUDE 'FGRAPH.FD' C DEFINICAO DAS VARIAVEIS USADAS NO PROGRAMA. REAL X0,X1,A0,B0,XX(21),H,MAXX,MAXY INTEGER*2 dummy, numc, i, k CHARACTER*4 str DOUBLE PRECISION bananas(31), x, YY(31), R RECORD /videoconfig/ screen RECORD /wxycoord/ wxy RECORD /rccoord/ curpos COMMON screen C C DEFINICAO DA FUNCAO G(X) COM Raizes 2 e -1, f(x)=x*x-x-2=0 C FUNCAO(X)=(-1.)*(SQRT(X+2.)) C FUNCAO(X)=X*X-2. FUNCAO(X)=1.+2./X C LE OS VALORES PARA O INTERVALO [A,B]. WRITE(6,20) 20 FORMAT(' INTERVALO INICIAL = ') READ(5,1)A0 WRITE(6,21) 21 FORMAT(' INTERVALO FINAL = ') READ(5,1)B0 WRITE(6,22) 22 FORMAT(' RAIZ INICIAL = ') READ(5,1)X0 1 FORMAT(F5.2) if(X0.EQ.0.)X0=0.01 C CALCULA OS VALORES DE G(X) NO INTERVALO [A0,B0] C ACHA MAXIMOS DOS EIXOS X E Y H=(B0-A0)/20. XX(1)=A0 YY(1)=FUNCAO(XX(1)) MAXY=ABS(YY(1)) DO i=2,21 k=i-1 XX(i)=XX(k)+H YY(i)=FUNCAO(XX(i)) if(ABS(YY(i)).GT.MAXY)MAXY=ABS(YY(i)) END DO C O METODO DA ITERACAO LINEAR CALCULA X=G(X) bananas(1)=X0 MAXX=X0 WRITE(6,6) 6 FORMAT(' RAIZ G(RAIZ) ITER') C DO I=2,21 X1 = FUNCAO(X0) bananas(I)=X1 if(X1.GT.MAXX)MAXX=X1 WRITE(6,3)X0,X1,I 3 FORMAT(F9.6 F9.6 I4) X0=X1 END DO C READ (*,*) ! Wait for ENTER key to be pressed CALL clearscreen ($GCLEARSCREEN) C C APRESENTA RAIZES Xi C dummy = SETTEXTCOLOR( 13 ) IF( screen.numcolors .LT. numc ) numc = screen.numcolors - 1 DO i = 1, 21 CALL SETTEXTPOSITION( i, 2, curpos ) WRITE (str, '(F4.1)') bananas(i) CALL OUTTEXT( 'Valor da raiz = ' // str ) END DO C APRESENTA OS Intervalos inicial e final dummy = SETTEXTCOLOR( 14 ) CALL SETTEXTPOSITION( 1, 30, curpos ) WRITE (str, '(F4.1)')A0 CALL OUTTEXT( 'Intervalo Inicial = ' // str ) CALL SETTEXTPOSITION( 2, 30, curpos ) WRITE (str, '(F4.1)')B0 CALL OUTTEXT( 'Intervalo Final = ' // str ) C C Draw a bordered rectangle around the graph. C dummy = SETCOLOR( 1 ) dummy = RECTANGLE_W( $GBORDER, -1.00, -1.00, 1.00, 1.00 ) dummy = RECTANGLE_W( $GBORDER, -1.02, -1.02, 1.02, 1.02 ) C C PLOTA OS PONTOS DAS RAIZES CALCULADAS. C x = -0.90 DO i = 1, 19 dummy = SETCOLOR( 2 ) CALL MOVETO_W( x, -1.D0, wxy ) dummy = LINETO_W( x, 1.0 ) CALL MOVETO_W( -1.D0, x, wxy ) dummy = LINETO_W( 1.0, x ) dummy = SETCOLOR( 14 ) CALL MOVETO_W( x - 0.1D0, bananas( i )/MAXX, wxy ) dummy = LINETO_W( x, bananas( i + 1 )/MAXX ) x = x + 0.1 END DO CALL MOVETO_W( 0.9D0, bananas( i )/MAXX, wxy ) dummy = LINETO_W( 1.0, bananas( i + 1 )/MAXX ) C C Plota a reta C R = 0. x = -0.90 DO i = 1, 19 dummy = SETCOLOR( 13 ) CALL MOVETO_W( x - 0.1D0, A0 + R, wxy ) dummy = LINETO_W( x, A0+R+H ) R= R + H x = x + 0.1 END DO C C Plot os pontos de g(x) C dummy = SETCOLOR( 12 ) x = -0.90 DO i = 1, 19 CALL MOVETO_W( x - 0.1D0, YY( i )/MAXY, wxy ) dummy = LINETO_W( x, YY( i + 1 )/MAXY ) x = x + 0.1 END DO CALL MOVETO_W( 0.9D0, YY( i )/MAXY, wxy ) dummy = LINETO_W( 1.0, YY( i + 1 )/MAXY ) dummy = SETCOLOR( 3 ) END Usuarios/Junior/Novo/UFCG/C�lculo Num�rico/teste/matrizes1.for C Matrizes c c This procedure writes out the matrices in matrix form c SUBROUTINE writematrix(m1, m2, m3, n, np) real*4 m1(np,np),m2(np,np),m3(np,np) c Start by writing out the original matrix: write(*,1) 1 format(' +--' \) do 11 j=1, (13*n-3) write(*,12) 12 format(' '\) 11 continue write(*,2) 2 format('--+') do 21 i=1, n write(*,24) 24 format(' | '\) do 23 j=1, n write(*, 22) m1(i,j) 22 format(f11.6,' '\) 23 continue if (i .EQ. (n/2 +1)) then write(*,25) else write(*,26) endif 25 format('| x') 26 format('|') 21 continue write(*,3) 3 format(' +--' \) do 31 j=1, (13*n-3) write(*,32) 32 format(' '\) 31 continue write(*,4) 4 format('--+') c Now display the inverse of the matrix write(*,41) 41 format(' +--' \) do 51 j=1, (13*n-3) write(*,52) 52 format(' '\) 51 continue write(*,42) 42 format('--+') do 61 i=1, n write(*,64) 64 format(' | '\) do 63 j=1, n write(*, 62) m2(i,j) 62 format(f11.6,' '\) 63 continue if (i .EQ. (n/2+1)) then write(*,65) else write(*,66) endif 65 format('| =') 66 format('|') 61 continue write(*,43) 43 format(' +--' \) do 71 j=1, (13*n-3) write(*,72) 72 format(' '\) 71 continue write(*,44) 44 format('--+') c Now display the result of their product (should be the identity) write(*,45) 45 format(' +--' \) do 53 j=1, (12*n-3) write(*,54) 54 format(' '\) 53 continue write(*,46) 46 format('--+') do 81 i=1, n write(*,84) 84 format(' | '\) do 83 j=1, n write(*, 82) m3(i,j) 82 format(f10.7,' '\) 83 continue write(*,85) 85 format('|') 81 continue write(*,47) 47 format(' +--' \) do 73 j=1, (12*n-3) write(*,74) 74 format(' '\) 73 continue write(*,48) 48 format('--+') END c c Subroutine to compute the inverse of a matrix c SUBROUTINE invert(a, y, indx, np, n) INTEGER np, n DIMENSION a(np,np), y(np,np), indx(np) INTEGER i, j, d DO 12 i=1,n DO 11 j=1,n y(i,j)=0. 11 CONTINUE y(i,i) = 1. 12 CONTINUE CALL LUDCMP(a,n,np,indx,d) DO 13 j=1,n CALL LUBKSB(a,n,np,indx,y(1,j)) 13 CONTINUE END c ----------------------------------------------------------------- SUBROUTINE LUDCMP(A,N,NP,INDX,D) PARAMETER (NMAX=100,TINY=1.0E-20) DIMENSION A(NP,NP),INDX(N),VV(NMAX) INTEGER D D=1 DO 12 I=1,N AAMAX=0. DO 11 J=1,N IF (ABS(A(I,J)).GT.AAMAX) AAMAX=ABS(A(I,J)) 11 CONTINUE IF (AAMAX.EQ.0.) PAUSE 'Singular matrix.' VV(I)=1./AAMAX 12 CONTINUE DO 19 J=1,N IF (J.GT.1) THEN DO 14 I=1,J-1 SUM=A(I,J) IF (I.GT.1)THEN DO 13 K=1,I-1 SUM=SUM-A(I,K)*A(K,J) 13 CONTINUE A(I,J)=SUM ENDIF 14 CONTINUE ENDIF AAMAX=0. DO 16 I=J,N SUM=A(I,J) IF (J.GT.1)THEN DO 15 K=1,J-1 SUM=SUM-A(I,K)*A(K,J) 15 CONTINUE A(I,J)=SUM ENDIF DUM=VV(I)*ABS(SUM) IF (DUM.GE.AAMAX) THEN IMAX=I AAMAX=DUM ENDIF 16 CONTINUE IF (J.NE.IMAX)THEN DO 17 K=1,N DUM=A(IMAX,K) A(IMAX,K)=A(J,K) A(J,K)=DUM 17 CONTINUE D=-D VV(IMAX)=VV(J) ENDIF INDX(J)=IMAX IF(J.NE.N)THEN IF(A(J,J).EQ.0.) A(J,J)=TINY DUM=1./A(J,J) DO 18 I=J+1,N A(I,J)=A(I,J)*DUM 18 CONTINUE ENDIF 19 CONTINUE IF(A(N,N).EQ.0.) A(N,N)=TINY RETURN END c ----------------------------------------------------------------- SUBROUTINE LUBKSB(A,N,NP,INDX,B) DIMENSION A(NP,NP),INDX(N),B(N) II=0 DO 12 I=1,N LL=INDX(I) SUM=B(LL) B(LL)=B(I) IF (II.NE.0)THEN DO 11 J=II,I-1 SUM=SUM-A(I,J)*B(J) 11 CONTINUE ELSE IF (SUM.NE.0.) THEN II=I ENDIF B(I)=SUM 12 CONTINUE DO 14 I=N,1,-1 SUM=B(I) IF(I.LT.N)THEN DO 13 J=I+1,N SUM=SUM-A(I,J)*B(J) 13 CONTINUE ENDIF B(I)=SUM/A(I,I) 14 CONTINUE RETURN END c c This is the driver for the matrix inversion program. c The program goes through the following steps: c 1. Fills a a(3 X 3) matrix with real numbers c 2 Fills a b(3 X 1) matrix with real numbers c 3. WRITEs out the matrix a and v to the screen c 4. Calls a subroutine to INVERT the matrix c 5. WRITEs out the inverse to the screen c 6. WRITEs out the proof of the inversion c 7. Calcula x=A-1b e imprime x(3,1) c PROGRAM inversion REAL*4 a(20,20), origA(20,20), indx(20),b(20,20),x(20,20) REAL*4 invA(20,20),sum, idmatrix(20,20),d(20) INTEGER*4 np, n, iter PARAMETER (np=20) n = 3 c c Step1: Initialize as matrizes c a(1,1)=10. a(1,2)=1. a(1,3)=1. a(2,1)=1. a(2,2)=10. a(2,3)=1. a(3,1)=1. a(3,2)=1. a(3,3)=10. b(1,1)=12.83 b(2,1)=12.08 b(3,1)=12.08 c iteracoes finais do metodo Gauss-Seidel iter=5 c c Step 2: WRITE as matrizes a e b c WRITE(*,'(1x,a)') 'A matriz A(3,3) de Ax=b eh:' DO 21 i=1,n do 23 j=1,n origA(i,j) = a(i,j) WRITE (*,22) a(i,j) 23 continue 22 format(f12.6,\) WRITE(*,*) 21 CONTINUE WRITE(*,*) WRITE(*,'(1x,a)') 'A matriz b(3,1) de Ax=b eh:' DO 25 i=1,n WRITE (*,22) b(i,1) 25 CONTINUE WRITE(*,*) c c Step 3: Call the INVERT routine c CALL invert(a, invA, indx, np, n) WRITE(*,'(1x,a)') 'Tecle ENTER para continuar...' read(*,*) c c Step 4: WRITE a matriz inversa no video c WRITE(*,'(1x,a)') 'A matriz inversa A-1 eh:' DO 41 i=1,n do 43 j=1,n WRITE (*,42) invA(i,j) 43 continue 42 format(f8.3,\) WRITE(*,*) 41 continue WRITE (*,*) c c Step 5: WRITE a prova da inversion c WRITE(*,'(1x,a)') 'Verificacao da inversao:' do 51 i=1,n do 55 k=1,n sum = 0. do 53 j=1,n-1 sum = ( origA(i,j) * invA(j,k) ) + sum 53 continue sum = (origA(i,n) * invA(n,k)) + sum idmatrix(i,k) = sum 55 continue 51 continue CALL WRITEMATRIX(origA, invA, idmatrix, n, np) WRITE(*,'(1x,a)') 'Tecle ENTER para continuar...' read(*,*) c c Step 6: WRITE a matriz x c WRITE(*,'(1x,a)') 'Calculo da matriz x=A-1b:' do 61 i=1,n sum = 0. do 63 j=1,n sum = invA(i,j) * b(j,1) + sum 63 continue x(i,1)=sum 61 continue WRITE(*,*) WRITE(*,'(1x,a)') 'A matriz solucao de Ax=b eh x(3,1):' DO 65 i=1,n WRITE (*,22) x(i,1) 65 CONTINUE WRITE(*,*) WRITE(*,'(1x,a)') 'Comeco do metodo Gauss-Seidel' WRITE(*,*) c c Redifinicao da matriz a c a(1,1)=10. a(1,2)=1. a(1,3)=1. a(2,1)=1. a(2,2)=10. a(2,3)=1. a(3,1)=1. a(3,2)=1. a(3,3)=10. c Matriz diagonal DO 71 i=1,n d(i)=a(i,i) x(i,1)=0. 71 continue WRITE(*,'(1x,a)') 'A matriz diagonal de A eh d(3):' DO 75 i=1,n WRITE (*,22) d(i) 75 CONTINUE WRITE(*,*) do 81 i=1,n b(i,1)=b(i,1)/d(i) do 81 j=1,n a(i,j)=-a(i,j)/d(i) 81 continue WRITE(*,'(1x,a)') 'A matriz B de x=Bx+b eh:' DO 91 i=1,n do 93 j=1,n WRITE (*,42) a(i,j) 93 continue WRITE(*,*) 91 continue WRITE(*,*) do 150 k=1,iter do 92 p=1,n x(p,2)=x(p,1) 92 continue do 120 i=1,n x(i,1)=b(i,1) do 110 j=1,n if(i.NE.j)x(i,1)=x(i,1)+x(j,2)*a(i,j) 110 continue 120 continue WRITE(*,*) WRITE(*,'(1x,a)') 'A matriz solucao de Ax=b eh x(3,1):' DO 165 i=1,n WRITE (*,22) x(i,1) read(*,*) 165 CONTINUE WRITE(*,*) 150 continue read(*,*) 999 END Usuarios/Junior/Novo/UFCG/C�lculo Num�rico/teste/matrizes.for C Matrizes c c This procedure writes out the matrices in matrix form c SUBROUTINE writematrix(m1, m2, m3, n, np) real*4 m1(np,np),m2(np,np),m3(np,np) c Start by writing out the original matrix: write(*,1) 1 format(' +--' \) do 11 j=1, (13*n-3) write(*,12) 12 format(' '\) 11 continue write(*,2) 2 format('--+') do 21 i=1, n write(*,24) 24 format(' | '\) do 23 j=1, n write(*, 22) m1(i,j) 22 format(f11.6,' '\) 23 continue if (i .EQ. (n/2 +1)) then write(*,25) else write(*,26) endif 25 format('| x') 26 format('|') 21 continue write(*,3) 3 format(' +--' \) do 31 j=1, (13*n-3) write(*,32) 32 format(' '\) 31 continue write(*,4) 4 format('--+') c Now display the inverse of the matrix write(*,41) 41 format(' +--' \) do 51 j=1, (13*n-3) write(*,52) 52 format(' '\) 51 continue write(*,42) 42 format('--+') do 61 i=1, n write(*,64) 64 format(' | '\) do 63 j=1, n write(*, 62) m2(i,j) 62 format(f11.6,' '\) 63 continue if (i .EQ. (n/2+1)) then write(*,65) else write(*,66) endif 65 format('| =') 66 format('|') 61 continue write(*,43) 43 format(' +--' \) do 71 j=1, (13*n-3) write(*,72) 72 format(' '\) 71 continue write(*,44) 44 format('--+') c Now display the result of their product (should be the identity) write(*,45) 45 format(' +--' \) do 53 j=1, (12*n-3) write(*,54) 54 format(' '\) 53 continue write(*,46) 46 format('--+') do 81 i=1, n write(*,84) 84 format(' | '\) do 83 j=1, n write(*, 82) m3(i,j) 82 format(f10.7,' '\) 83 continue write(*,85) 85 format('|') 81 continue write(*,47) 47 format(' +--' \) do 73 j=1, (12*n-3) write(*,74) 74 format(' '\) 73 continue write(*,48) 48 format('--+') END c c Subroutine to compute the inverse of a matrix c SUBROUTINE invert(a, y, indx, np, n) INTEGER np, n DIMENSION a(np,np), y(np,np), indx(np) INTEGER i, j, d DO 12 i=1,n DO 11 j=1,n y(i,j)=0. 11 CONTINUE y(i,i) = 1. 12 CONTINUE CALL LUDCMP(a,n,np,indx,d) DO 13 j=1,n CALL LUBKSB(a,n,np,indx,y(1,j)) 13 CONTINUE END c ----------------------------------------------------------------- SUBROUTINE LUDCMP(A,N,NP,INDX,D) PARAMETER (NMAX=100,TINY=1.0E-20) DIMENSION A(NP,NP),INDX(N),VV(NMAX) INTEGER D D=1 DO 12 I=1,N AAMAX=0. DO 11 J=1,N IF (ABS(A(I,J)).GT.AAMAX) AAMAX=ABS(A(I,J)) 11 CONTINUE IF (AAMAX.EQ.0.) PAUSE 'Singular matrix.' VV(I)=1./AAMAX 12 CONTINUE DO 19 J=1,N IF (J.GT.1) THEN DO 14 I=1,J-1 SUM=A(I,J) IF (I.GT.1)THEN DO 13 K=1,I-1 SUM=SUM-A(I,K)*A(K,J) 13 CONTINUE A(I,J)=SUM ENDIF 14 CONTINUE ENDIF AAMAX=0. DO 16 I=J,N SUM=A(I,J) IF (J.GT.1)THEN DO 15 K=1,J-1 SUM=SUM-A(I,K)*A(K,J) 15 CONTINUE A(I,J)=SUM ENDIF DUM=VV(I)*ABS(SUM) IF (DUM.GE.AAMAX) THEN IMAX=I AAMAX=DUM ENDIF 16 CONTINUE IF (J.NE.IMAX)THEN DO 17 K=1,N DUM=A(IMAX,K) A(IMAX,K)=A(J,K) A(J,K)=DUM 17 CONTINUE D=-D VV(IMAX)=VV(J) ENDIF INDX(J)=IMAX IF(J.NE.N)THEN IF(A(J,J).EQ.0.) A(J,J)=TINY DUM=1./A(J,J) DO 18 I=J+1,N A(I,J)=A(I,J)*DUM 18 CONTINUE ENDIF 19 CONTINUE IF(A(N,N).EQ.0.) A(N,N)=TINY RETURN END c ----------------------------------------------------------------- SUBROUTINE LUBKSB(A,N,NP,INDX,B) DIMENSION A(NP,NP),INDX(N),B(N) II=0 DO 12 I=1,N LL=INDX(I) SUM=B(LL) B(LL)=B(I) IF (II.NE.0)THEN DO 11 J=II,I-1 SUM=SUM-A(I,J)*B(J) 11 CONTINUE ELSE IF (SUM.NE.0.) THEN II=I ENDIF B(I)=SUM 12 CONTINUE DO 14 I=N,1,-1 SUM=B(I) IF(I.LT.N)THEN DO 13 J=I+1,N SUM=SUM-A(I,J)*B(J) 13 CONTINUE ENDIF B(I)=SUM/A(I,I) 14 CONTINUE RETURN END c c This is the driver for the matrix inversion program. c The program goes through the following steps: c 1. Fills a a(3 X 3) matrix with real numbers c 2 Fills a b(3 X 1) matrix with real numbers c 3. WRITEs out the matrix a and v to the screen c 4. Calls a subroutine to INVERT the matrix c 5. WRITEs out the inverse to the screen c 6. WRITEs out the proof of the inversion c 7. Calcula x=A-1b e imprime x(3,1) c PROGRAM inversion REAL*4 a(20,20), origA(20,20), indx(20),b(20,20),x(20,20) REAL*4 invA(20,20),sum, idmatrix(20,20),d(20) INTEGER*4 np, n, iter PARAMETER (np=20) n = 3 c c Step1: Initialize as matrizes c a(1,1)=10 a(1,2)=1 a(1,3)=1 a(2,1)=1 a(2,2)=10 a(2,3)=1 a(3,1)=1. a(3,2)=1. a(3,3)=10. b(1,1)=12.83 b(2,1)=12.08 b(3,1)=12.08 c iteracoes finais do metodo Gauss-Seidel iter=5 c c Step 2: WRITE as matrizes a e b c WRITE(*,'(1x,a)') 'A matriz A(3,3) de Ax=b eh:' DO 21 i=1,n do 23 j=1,n origA(i,j) = a(i,j) WRITE (*,22) a(i,j) 23 continue 22 format(f12.6,\) WRITE(*,*) 21 CONTINUE WRITE(*,*) WRITE(*,'(1x,a)') 'A matriz b(3,1) de Ax=b eh:' DO 25 i=1,n WRITE (*,22) b(i,1) 25 CONTINUE WRITE(*,*) c c Step 3: Call the INVERT routine c CALL invert(a, invA, indx, np, n) WRITE(*,'(1x,a)') 'Tecle ENTER para continuar...' read(*,*) c c Step 4: WRITE a matriz inversa no video c WRITE(*,'(1x,a)') 'A matriz inversa A-1 eh:' DO 41 i=1,n do 43 j=1,n WRITE (*,42) invA(i,j) 43 continue 42 format(f8.3,\) WRITE(*,*) 41 continue WRITE (*,*) c c Step 5: WRITE a prova da inversion c WRITE(*,'(1x,a)') 'Verificacao da inversao:' do 51 i=1,n do 55 k=1,n sum = 0. do 53 j=1,n-1 sum = ( origA(i,j) * invA(j,k) ) + sum 53 continue sum = (origA(i,n) * invA(n,k)) + sum idmatrix(i,k) = sum 55 continue 51 continue CALL WRITEMATRIX(origA, invA, idmatrix, n, np) WRITE(*,'(1x,a)') 'Tecle ENTER para continuar...' read(*,*) c c Step 6: WRITE a matriz x c WRITE(*,'(1x,a)') 'Calculo da matriz x=A-1b:' do 61 i=1,n sum = 0. do 63 j=1,n sum = invA(i,j) * b(j,1) + sum 63 continue x(i,1)=sum 61 continue WRITE(*,*) WRITE(*,'(1x,a)') 'A matriz solucao de Ax=b eh x(3,1):' DO 65 i=1,n WRITE (*,22) x(i,1) 65 CONTINUE WRITE(*,*) WRITE(*,'(1x,a)') 'Comeco do metodo Gauss-Seidel' WRITE(*,*) c c Redifinicao da matriz a c a(1,1)=10. a(1,2)=1. a(1,3)=1. a(2,1)=1. a(2,2)=10. a(2,3)=1. a(3,1)=1. a(3,2)=1. a(3,3)=10. c Matriz diagonal DO 71 i=1,n d(i)=a(i,i) x(i,1)=0. 71 continue WRITE(*,'(1x,a)') 'A matriz diagonal de A eh d(3):' DO 75 i=1,n WRITE (*,22) d(i) 75 CONTINUE WRITE(*,*) do 81 i=1,n b(i,1)=b(i,1)/d(i) do 81 j=1,n a(i,j)=-a(i,j)/d(i) 81 continue WRITE(*,'(1x,a)') 'A matriz B de x=Bx+b eh:' DO 91 i=1,n do 93 j=1,n WRITE (*,42) a(i,j) 93 continue WRITE(*,*) 91 continue WRITE(*,*) do 150 k=1,iter do 120 i=1,n x(i,1)=b(i,1) do 110 j=1,n if(i.NE.j)x(i,1)=x(i,1)+x(j,1)*a(i,j) 110 continue 120 continue WRITE(*,*) WRITE(*,'(1x,a)') 'A matriz solucao de Ax=b eh x(3,1):' DO 165 i=1,n WRITE (*,22) x(i,1) read(*,*) 165 CONTINUE WRITE(*,*) 150 continue read(*,*) 999 END Usuarios/Junior/Novo/UFCG/C�lculo Num�rico/teste/motorcc1.for c funcaoia(float yy) c return(ui/la - yy * ra/la - wm * kb/la) c END c funcaowm(float yy) c return(ki*ia/jm - yy*bm/jm - tl/jm ); c END c funcaotetam(float yy) c return(wm); c END c rungekuta4() /*Ordem 4*/ c float eqinc,k1,k2,k3,k4; cc eqinc=0.001; c k1 = eqinc*funcaoia(ia); c k2 = eqinc*funcaoia(ia+k1/2.); c k3 = eqinc*funcaoia(ia+k2/2.); c k4 = eqinc*funcaoia(ia+k3); c ia = ia + (k1 + 2. * k2 + 2. * k3 + k4)/6.; c k1 = eqinc*funcaowm(wm); c k2 = eqinc*funcaowm(wm+k1/2.); c k3 = eqinc*funcaowm(wm+k2/2.); c k4 = eqinc*funcaowm(wm+k3); c wm = wm + (k1 + 2. * k2 + 2. * k3 + k4)/6.; c k1 = eqinc*funcaotetam(tetam); c k2 = eqinc*funcaotetam(tetam+k1/2.); c k3 = eqinc*funcaotetam(tetam+k2/2.); c k4 = eqinc*funcaotetam(tetam+k3); c tetam = tetam + (k1 + 2. * k2 + 2. * k3 + k4)/6.; c END CC SINE.FOR - Illustrates basic graphics commands. CC INCLUDE 'FGRAPH.FI' INCLUDE 'FLIB.FI' CALL graphicsmode() CALL drawlines() CALL sinewave() c CALL drawshapes() CALL endprogram() END C Definitions of subroutines go here SUBROUTINE graphicsmode() INCLUDE 'FGRAPH.FD' INTEGER*2 modestatus, maxx, maxy RECORD /videoconfig/ myscreen COMMON maxx, maxy C C Set highest resolution graphics mode. C modestatus = SETVIDEOMODE( $VRES16COLOR ) IF( modestatus.EQ.0) STOP 'Error: cannot set graphics mode' C C Determine the minimum and maximum dimensions. C CALL GETVIDEOCONFIG( myscreen ) maxx = myscreen.numxpixels - 1 maxy = myscreen.numypixels - 1 END CC NEWX - This function finds new x-coordinates. CC INTEGER*2 FUNCTION newx( xcoord ) INTEGER*2 xcoord, maxx, maxy REAL*4 tempx COMMON maxx, maxy tempx = maxx / 1000.0 tempx = xcoord * tempx + 0.5 newx = tempx END CC NEWY - This function finds new y-coordinates. INTEGER*2 FUNCTION newy( ycoord ) INTEGER*2 ycoord, maxx, maxy REAL*4 tempy COMMON maxx, maxy tempy = maxy / 1000.0 tempy = ycoord * tempy + 0.5 newy = tempy END CC DRAWLINES - This subroutine draws a box and CC several lines. SUBROUTINE drawlines() INCLUDE 'FGRAPH.FD' EXTERNAL newx,newy INTEGER*2 status, newx, newy, maxx, maxy RECORD /xycoord/ xy COMMON maxx, maxy C C Draw the box. C dummy = SETCOLOR( 15 ) status = RECTANGLE( $GBORDER, 1, 0, maxx, maxy ) CALL SETVIEWORG( 0, newy( INT2( 500 ) ), xy ) C C Draw the lines. C CALL MOVETO( 0, 0, xy ) status = LINETO( newx( INT2( 1000 ) ), 0 ) CALL SETLINESTYLE( #AA3C ) CALL MOVETO( 0, newy( INT2( -250 ) ), xy ) status = LINETO(newx(INT2( 1000 ) ), + newy( INT2( -250 ) ) ) CALL SETLINESTYLE( #8888 ) CALL MOVETO( 0, newy( INT2( 250 ) ), xy ) status = LINETO( newx( INT2( 1000 ) ), + newy( INT2( 250 ) ) ) END CC SINEWAVE - This subroutine calculates and plots a sine CC wave. CC SUBROUTINE sinewave() INCLUDE 'FGRAPH.FD' REAL ra,la,kb,ki,jm,bm,tl,wm,ia,ui,k1,k2,k3,k4,eqinc INTEGER*2 dummy, newx, newy, locx, locy, i DOUBLE PRECISION PI EXTERNAL newx, newy RECORD /rccoord/ curpos PARAMETER ( PI = 3.14159 ) eqinc=0.001 C Variaveis do motor de corrente continua ra=1.01429 la=0.0292 kb=0.0869 ki=0.0869 jm=0.00063078 bm=0.0023 Tl=0.1 dummy = SETTEXTCOLOR( 15 ) dummy = SETCOLOR( 15 ) CALL SETTEXTPOSITION( 2, 10, curpos ) CALL OUTTEXT( 'Resolucao de Equacoes diferenciais' // str ) CALL SETTEXTPOSITION( 3, 10, curpos ) CALL OUTTEXT( 'Simulacao de um motor de corrente continua' // str) CALL SETTEXTPOSITION( 24, 15, curpos ) CALL OUTTEXT( 'Vel(armar) Tens_armd(Verm) Corr_armd(Cyan)' // str) ui=2. wm=0. ia=0. C C Calculate each position and display it on the screen. C DO i = 0, 999, 3 C k1 = eqinc*funcaoia(ia) C k2 = eqinc*funcaoia(ia+k1/2.) C k3 = eqinc*funcaoia(ia+k2/2.) C k4 = eqinc*funcaoia(ia+k3) k1 = eqinc*(ui/la - ia * ra/la - wm * kb/la) k2 = eqinc*(ui/la - (ia+k1/2.) * ra/la - wm * kb/la) k3 = eqinc*(ui/la - (ia+k2/2.) * ra/la - wm * kb/la) k4 = eqinc*(ui/la - (ia+k3) * ra/la - wm * kb/la) ia = ia + (k1 + 2. * k2 + 2. * k3 + k4)/6. C ia=ia+0.001*(ui/la - ia * ra/la - wm * kb/la) k1 = eqinc*(ki*ia/jm - wm*bm/jm - tl/jm ) k2 = eqinc*(ki*ia/jm - (wm+k1/2.)*bm/jm - tl/jm ) k3 = eqinc*(ki*ia/jm - (wm+k2/2.)*bm/jm - tl/jm ) k4 = eqinc*(ki*ia/jm - (wm+k3)*bm/jm - tl/jm ) wm = wm + (k1 + 2. * k2 + 2. * k3 + k4)/6. C wm=wm+0.01*(ki*ia/jm - wm*bm/jm - tl/jm ) if(wm.LT.0.)wm=0. ui=1+i/100 locx = newx( i ) dummy = SETCOLOR( 15 ) locy = newy( INT2( -ui * 50.0 ) ) dummy = SETPIXEL( locx, locy ) dummy = SETCOLOR( 15 ) locy = newy( INT2( -ia * 60.0 ) ) dummy = SETPIXEL( locx, locy ) dummy = SETCOLOR( 15 ) locy = newy( INT2( -wm * 7.0 ) ) dummy = SETPIXEL( locx, locy ) END DO CALL SETTEXTPOSITION( 25, 10, curpos ) WRITE(*,*)wm,ui,ia END CC DRAWSHAPES - Draws two boxes and two ellipses. CC SUBROUTINE drawshapes() INCLUDE 'FGRAPH.FD' EXTERNAL newx, newy INTEGER*2 dummy, newx, newy C C Create a masking (fill) pattern. C INTEGER*1 diagmask(8), linemask(8) DATA diagmask / #93, #C9, #64, #B2, #59, #2C, + #96, #4B / DATA linemask / #FF, #00, #7F, #FE, #00, #00, + #00, #CC / C C Draw the rectangles. C CALL SETLINESTYLE( #FFFF ) CALL SETFILLMASK( diagmask ) dummy = SETCOLOR( 9 ) dummy = RECTANGLE( $GBORDER, + newx( INT2( 50 ) ), newy( INT2( -325 ) ), + newx( INT2( 200 ) ), newy( INT2( -425 ) ) ) dummy = RECTANGLE( $GFILLINTERIOR, + newx( INT2( 550 ) ), newy( INT2( -325 ) ), + newx( INT2( 700 ) ), newy( INT2( -425 ) ) ) C C Draw the ellipses. C CALL SETFILLMASK( linemask ) dummy = ELLIPSE( $GBORDER, + newx( INT2( 50 ) ), newy( INT2(325 ) ), + newx( INT2( 200 ) ), newy( INT2(425 ) ) ) dummy = ELLIPSE( $GFILLINTERIOR, + newx( INT2( 550 ) ), newy( INT2( 325 ) ), + newx( INT2( 700 ) ), newy( INT2( 425 ) ) ) END CC ENDPROGRAM - This subroutine waits for a key to CC be pressed, then resets the screen before CC returning. SUBROUTINE endprogram() INCLUDE 'FGRAPH.FD' INCLUDE 'FLIB.FD' INTEGER*2 dummy CHARACTER*1 dumch dumch = GETCHARQQ() ! Wait for a key to be pressed dummy = SETVIDEOMODE( $DEFAULTMODE ) END Usuarios/Junior/Novo/UFCG/C�lculo Num�rico/teste/motorcc2.for C funcaoia(float yy) C return(ui/la - yy * ra/la - wm * kb/la) C END C funcaowm(float yy) C return(ki*ia/jm - yy*bm/jm - tl/jm ); C END C funcaotetam(float yy) C return(wm); C END C rungekuta4() /*Ordem 4*/ C float eqinc,k1,k2,k3,k4; C eqinc=0.001; C k1 = eqinc*funcaoia(ia); C k2 = eqinc*funcaoia(ia+k1/2.); C k3 = eqinc*funcaoia(ia+k2/2.); C k4 = eqinc*funcaoia(ia+k3); C ia = ia + (k1 + 2. * k2 + 2. * k3 + k4)/6.; C k1 = eqinc*funcaowm(wm); C k2 = eqinc*funcaowm(wm+k1/2.); C k3 = eqinc*funcaowm(wm+k2/2.); C k4 = eqinc*funcaowm(wm+k3); C wm = wm + (k1 + 2. * k2 + 2. * k3 + k4)/6.; C k1 = eqinc*funcaotetam(tetam); C k2 = eqinc*funcaotetam(tetam+k1/2.); C k3 = eqinc*funcaotetam(tetam+k2/2.); C k4 = eqinc*funcaotetam(tetam+k3); C tetam = tetam + (k1 + 2. * k2 + 2. * k3 + k4)/6.; C END CC SINE.FOR - Illustrates basic graphics commands. CC INCLUDE 'FGRAPH.FI' INCLUDE 'FLIB.FI' CALL graphicsmode() CALL drawlines() CALL sinewave() c CALL drawshapes() CALL endprogram() END C Definitions of subroutines go here SUBROUTINE graphicsmode() INCLUDE 'FGRAPH.FD' INTEGER*2 modestatus, maxx, maxy RECORD /videoconfig/ myscreen COMMON maxx, maxy C C Set highest resolution graphics mode. C modestatus = SETVIDEOMODE( $VRES16COLOR ) IF( modestatus.EQ.0) STOP 'Error: cannot set graphics mode' C C Determine the minimum and maximum dimensions. C CALL GETVIDEOCONFIG( myscreen ) maxx = myscreen.numxpixels - 1 maxy = myscreen.numypixels - 1 END CC NEWX - This function finds new x-coordinates. CC INTEGER*2 FUNCTION newx( xcoord ) INTEGER*2 xcoord, maxx, maxy REAL*4 tempx COMMON maxx, maxy tempx = maxx / 1000.0 tempx = xcoord * tempx + 0.5 newx = tempx END CC NEWY - This function finds new y-coordinates. INTEGER*2 FUNCTION newy( ycoord ) INTEGER*2 ycoord, maxx, maxy REAL*4 tempy COMMON maxx, maxy tempy = maxy / 1000.0 tempy = ycoord * tempy + 0.5 newy = tempy END CC DRAWLINES - This subroutine draws a box and CC several lines. SUBROUTINE drawlines() INCLUDE 'FGRAPH.FD' EXTERNAL newx,newy INTEGER*2 status, newx, newy, maxx, maxy RECORD /xycoord/ xy COMMON maxx, maxy C C Draw the box. C dummy = SETCOLOR( 15 ) status = RECTANGLE( $GBORDER, 1, 0, maxx, maxy ) CALL SETVIEWORG( 0, newy( INT2( 500 ) ), xy ) C C Draw the lines. C CALL MOVETO( 0, 0, xy ) status = LINETO( newx( INT2( 1000 ) ), 0 ) CALL SETLINESTYLE( #AA3C ) CALL MOVETO( 0, newy( INT2( -250 ) ), xy ) status = LINETO(newx(INT2( 1000 ) ), + newy( INT2( -250 ) ) ) CALL SETLINESTYLE( #8888 ) CALL MOVETO( 0, newy( INT2( 250 ) ), xy ) status = LINETO( newx( INT2( 1000 ) ), + newy( INT2( 250 ) ) ) END CC SINEWAVE - This subroutine calculates and plots a sine CC wave. CC SUBROUTINE sinewave() INCLUDE 'FGRAPH.FD' REAL ra,la,kb,ki,jm,bm,tl,wm,ia,ui,k1,k2,k3,k4,eqinc,teta INTEGER*2 dummy, newx, newy, locx, locy, i DOUBLE PRECISION PI EXTERNAL newx, newy RECORD /rccoord/ curpos PARAMETER ( PI = 3.14159 ) eqinc=0.001 C Variaveis do motor de corrente continua ra=1.0045 la=0.0292 kb=0.0869 ki=0.0869 jm=0.00063078 bm=0.0023 Tl=0.1 dummy = SETTEXTCOLOR( 15 ) dummy = SETCOLOR( 15 ) CALL SETTEXTPOSITION( 2, 10, curpos ) CALL OUTTEXT( 'Resolucao de Equacoes diferenciais' // str ) CALL SETTEXTPOSITION( 3, 10, curpos ) CALL OUTTEXT( 'Simulacao de um motor de corrente continua' // str) CALL SETTEXTPOSITION( 24, 15, curpos ) CALL OUTTEXT( 'Vel(armar) Tens_armd(Verm) Corr_armd(Cyan)' // str) CALL SETTEXTPOSITION( 24, 59, curpos ) CALL OUTTEXT( 'Deslocamento(amarelo)' // str) ui=2. wm=0. ia=0. teta=0. C C Calculate each position and display it on the screen. C DO i = 0, 999, 3 C k1 = eqinc*funcaoia(ia) C k2 = eqinc*funcaoia(ia+k1/2.) C k3 = eqinc*funcaoia(ia+k2/2.) C k4 = eqinc*funcaoia(ia+k3) k1 = eqinc*(ui/la - ia * ra/la - wm * kb/la) k2 = eqinc*(ui/la - (ia+k1/2.) * ra/la - wm * kb/la) k3 = eqinc*(ui/la - (ia+k2/2.) * ra/la - wm * kb/la) k4 = eqinc*(ui/la - (ia+k3) * ra/la - wm * kb/la) ia = ia + (k1 + 2. * k2 + 2. * k3 + k4)/6. C ia=ia+0.001*(ui/la - ia * ra/la - wm * kb/la) k1 = eqinc*(ki*ia/jm - wm*bm/jm - tl/jm ) k2 = eqinc*(ki*ia/jm - (wm+k1/2.)*bm/jm - tl/jm ) k3 = eqinc*(ki*ia/jm - (wm+k2/2.)*bm/jm - tl/jm ) k4 = eqinc*(ki*ia/jm - (wm+k3)*bm/jm - tl/jm ) wm = wm + (k1 + 2. * k2 + 2. * k3 + k4)/6. C wm=wm+0.01*(ki*ia/jm - wm*bm/jm - tl/jm ) if(wm.LT.0.)wm=0. ui=1+i/100 locx = newx( i ) teta=teta+0.01*wm dummy = SETCOLOR( 11 ) locy = newy( INT2( -ui * 50.0 ) ) dummy = SETPIXEL( locx, locy ) dummy = SETCOLOR( 12 ) locy = newy( INT2( -ia * 60.0 ) ) dummy = SETPIXEL( locx, locy ) dummy = SETCOLOR( 13 ) locy = newy( INT2( -wm * 7.0 ) ) dummy = SETPIXEL( locx, locy ) dummy = SETCOLOR( 14 ) locy = newy( INT2( -teta * 7.0 ) ) dummy = SETPIXEL( locx, locy ) END DO CALL SETTEXTPOSITION( 25, 10, curpos ) WRITE(*,*)wm,ui,ia,teta END CC DRAWSHAPES - Draws two boxes and two ellipses. CC SUBROUTINE drawshapes() INCLUDE 'FGRAPH.FD' EXTERNAL newx, newy INTEGER*2 dummy, newx, newy C C Create a masking (fill) pattern. C INTEGER*1 diagmask(8), linemask(8) DATA diagmask / #93, #C9, #64, #B2, #59, #2C, + #96, #4B / DATA linemask / #FF, #00, #7F, #FE, #00, #00, + #00, #CC / C C Draw the rectangles. C CALL SETLINESTYLE( #FFFF ) CALL SETFILLMASK( diagmask ) dummy = SETCOLOR( 9 ) dummy = RECTANGLE( $GBORDER, + newx( INT2( 50 ) ), newy( INT2( -325 ) ), + newx( INT2( 200 ) ), newy( INT2( -425 ) ) ) dummy = RECTANGLE( $GFILLINTERIOR, + newx( INT2( 550 ) ), newy( INT2( -325 ) ), + newx( INT2( 700 ) ), newy( INT2( -425 ) ) ) C C Draw the ellipses. C CALL SETFILLMASK( linemask ) dummy = ELLIPSE( $GBORDER, + newx( INT2( 50 ) ), newy( INT2(325 ) ), + newx( INT2( 200 ) ), newy( INT2(425 ) ) ) dummy = ELLIPSE( $GFILLINTERIOR, + newx( INT2( 550 ) ), newy( INT2( 325 ) ), + newx( INT2( 700 ) ), newy( INT2( 425 ) ) ) END CC ENDPROGRAM - This subroutine waits for a key to CC be pressed, then resets the screen before CC returning. SUBROUTINE endprogram() INCLUDE 'FGRAPH.FD' INCLUDE 'FLIB.FD' INTEGER*2 dummy CHARACTER*1 dumch dumch = GETCHARQQ() ! Wait for a key to be pressed dummy = SETVIDEOMODE( $DEFAULTMODE ) END Usuarios/Junior/Novo/UFCG/C�lculo Num�rico/teste/Motorcc.for CC SINE.FOR - Illustrates basic graphics commands. CC INCLUDE 'FGRAPH.FI' INCLUDE 'FLIB.FI' CALL graphicsmode() CALL drawlines() CALL sinewave() c CALL drawshapes() CALL endprogram() END C Definitions of subroutines go here SUBROUTINE graphicsmode() INCLUDE 'FGRAPH.FD' INTEGER*2 modestatus, maxx, maxy RECORD /videoconfig/ myscreen COMMON maxx, maxy C C Set highest resolution graphics mode. C modestatus = SETVIDEOMODE( $VRES16COLOR ) IF( modestatus.EQ.0) STOP 'Error: cannot set graphics mode' C C Determine the minimum and maximum dimensions. C CALL GETVIDEOCONFIG( myscreen ) maxx = myscreen.numxpixels - 1 maxy = myscreen.numypixels - 1 END CC NEWX - This function finds new x-coordinates. CC INTEGER*2 FUNCTION newx( xcoord ) INTEGER*2 xcoord, maxx, maxy REAL*4 tempx COMMON maxx, maxy tempx = maxx / 1000.0 tempx = xcoord * tempx + 0.5 newx = tempx END CC NEWY - This function finds new y-coordinates. INTEGER*2 FUNCTION newy( ycoord ) INTEGER*2 ycoord, maxx, maxy REAL*4 tempy COMMON maxx, maxy tempy = maxy / 1000.0 tempy = ycoord * tempy + 0.5 newy = tempy END CC DRAWLINES - This subroutine draws a box and CC several lines. SUBROUTINE drawlines() INCLUDE 'FGRAPH.FD' EXTERNAL newx,newy INTEGER*2 status, newx, newy, maxx, maxy RECORD /xycoord/ xy COMMON maxx, maxy C C Draw the box. C dummy = SETCOLOR( 9 ) status = RECTANGLE( $GBORDER, 1, 0, maxx, maxy ) CALL SETVIEWORG( 0, newy( INT2( 500 ) ), xy ) C C Draw the lines. C CALL MOVETO( 0, 0, xy ) status = LINETO( newx( INT2( 1000 ) ), 0 ) CALL SETLINESTYLE( #AA3C ) CALL MOVETO( 0, newy( INT2( -250 ) ), xy ) status = LINETO(newx(INT2( 1000 ) ), + newy( INT2( -250 ) ) ) CALL SETLINESTYLE( #8888 ) CALL MOVETO( 0, newy( INT2( 250 ) ), xy ) status = LINETO( newx( INT2( 1000 ) ), + newy( INT2( 250 ) ) ) END CC SINEWAVE - This subroutine calculates and plots a sine CC wave. CC SUBROUTINE sinewave() INCLUDE 'FGRAPH.FD' REAL ra,la,kb,ki,jm,bm,tl,wm,ia,ui INTEGER*2 dummy, newx, newy, locx, locy, i DOUBLE PRECISION PI EXTERNAL newx, newy RECORD /rccoord/ curpos PARAMETER ( PI = 3.14159 ) C Variaveis do motor de corrente continua ra=1.01429 la=0.0292 kb=0.0869 ki=0.0869 jm=0.00063078 bm=0.0023 Tl=0.1 dummy = SETTEXTCOLOR( 14 ) dummy = SETCOLOR( 13 ) CALL SETTEXTPOSITION( 2, 10, curpos ) CALL OUTTEXT( 'Resolucao de Equacoes diferenciais' // str ) CALL SETTEXTPOSITION( 3, 10, curpos ) CALL OUTTEXT( 'Simulacao de um motor de corrente continua' // str) CALL SETTEXTPOSITION( 24, 15, curpos ) CALL OUTTEXT( 'Vel(armar) Tens_armd(Verm) Corr_armd(Cyan)' // str) ui=2. wm=0. ia=0. C C Calculate each position and display it on the screen. C DO i = 0, 999, 3 ia=ia+0.001*(ui/la - ia * ra/la - wm * kb/la) wm=wm+0.001*(ki*ia/jm - wm*bm/jm - tl/jm ) if(wm.LT.0.)wm=0. ui=1+i/100 locx = newx( i ) dummy = SETCOLOR( 12 ) locy = newy( INT2( -ui * 50.0 ) ) dummy = SETPIXEL( locx, locy ) dummy = SETCOLOR( 13 ) locy = newy( INT2( -ia * 60.0 ) ) dummy = SETPIXEL( locx, locy ) dummy = SETCOLOR( 14 ) locy = newy( INT2( -wm * 7.0 ) ) dummy = SETPIXEL( locx, locy ) END DO CALL SETTEXTPOSITION( 25, 10, curpos ) WRITE(*,*)wm,ui,ia END CC DRAWSHAPES - Draws two boxes and two ellipses. CC SUBROUTINE drawshapes() INCLUDE 'FGRAPH.FD' EXTERNAL newx, newy INTEGER*2 dummy, newx, newy C C Create a masking (fill) pattern. C INTEGER*1 diagmask(8), linemask(8) DATA diagmask / #93, #C9, #64, #B2, #59, #2C, + #96, #4B / DATA linemask / #FF, #00, #7F, #FE, #00, #00, + #00, #CC / C C Draw the rectangles. C CALL SETLINESTYLE( #FFFF ) CALL SETFILLMASK( diagmask ) dummy = SETCOLOR( 9 ) dummy = RECTANGLE( $GBORDER, + newx( INT2( 50 ) ), newy( INT2( -325 ) ), + newx( INT2( 200 ) ), newy( INT2( -425 ) ) ) dummy = RECTANGLE( $GFILLINTERIOR, + newx( INT2( 550 ) ), newy( INT2( -325 ) ), + newx( INT2( 700 ) ), newy( INT2( -425 ) ) ) C C Draw the ellipses. C CALL SETFILLMASK( linemask ) dummy = ELLIPSE( $GBORDER, + newx( INT2( 50 ) ), newy( INT2(325 ) ), + newx( INT2( 200 ) ), newy( INT2(425 ) ) ) dummy = ELLIPSE( $GFILLINTERIOR, + newx( INT2( 550 ) ), newy( INT2( 325 ) ), + newx( INT2( 700 ) ), newy( INT2( 425 ) ) ) END CC ENDPROGRAM - This subroutine waits for a key to CC be pressed, then resets the screen before CC returning. SUBROUTINE endprogram() INCLUDE 'FGRAPH.FD' INCLUDE 'FLIB.FD' INTEGER*2 dummy CHARACTER*1 dumch dumch = GETCHARQQ() ! Wait for a key to be pressed dummy = SETVIDEOMODE( $DEFAULTMODE ) END Usuarios/Junior/Novo/UFCG/C�lculo Num�rico/teste/NEWFOR.FOR C ITERACAO LINEAR INCLUDE 'FGRAPH.FI' INCLUDE 'FGRAPH.FD' LOGICAL fourcolors EXTERNAL fourcolors IF( fourcolors() ) THEN CALL graficos() ELSE WRITE (*,*) ' This program requires an EGA, VGA or', + ' SVGA graphics card.' END IF END C Additional functions defined below C FOURCOLORS - Function to enter graphics mode for REALG. LOGICAL FUNCTION fourcolors() INCLUDE 'FGRAPH.FD' INTEGER*2 dummy RECORD /videoconfig/ screen COMMON screen C C Set to maximum number of available colors. C C dummy = SETVIDEOMODE( $MAXCOLORMODE ) $ERESCOLOR dummy = SETVIDEOMODE( $VRES16COLOR ) CALL GETVIDEOCONFIG( screen ) fourcolors = .TRUE. IF( dummy .EQ. 0 ) fourcolors = .FALSE. END C . SUBROUTINE graficos() INCLUDE 'FGRAPH.FD' INTEGER*2 dummy, halfx, halfy INTEGER*2 xwidth, yheight, cols, rows LOGICAL*2 finvert /'.FALSE.' / RECORD /videoconfig/ screen COMMON screen CALL CLEARSCREEN( $GCLEARSCREEN ) xwidth = screen.numxpixels yheight = screen.numypixels cols = screen.numtextcols rows = screen.numtextrows halfx = xwidth / 2 halfy = (yheight / rows) * (rows / 2) CALL SETVIEWPORT( 0, 1, xwidth - 1, yheight - 1 ) CALL SETTEXTWINDOW( 1, 1, rows, cols ) dummy = SETWINDOW( finvert, -3.D0, -1.5D0, 1.5D0, 1.5D0 ) CALL CALCULA( INT2( (rows / 2) + MOD( rows, 2 ) ) ) dummy = RECTANGLE_W( $GBORDER, -3.0, -1.5, 1.5, 1.5 ) READ (*,*) ! Wait for ENTER key to be pressed dummy = SETVIDEOMODE( $DEFAULTMODE ) END C C******************************************** C C Inicio da subrotina ITERACAO LINEAR C C******************************************** C SUBROUTINE CALCULA(numc) INCLUDE 'FGRAPH.FD' C DEFINICAO DAS VARIAVEIS USADAS NO PROGRAMA. REAL X0,X1,A0,B0,XX(21),H,MAXX,MAXY INTEGER*2 dummy, numc, i, k CHARACTER*4 str DOUBLE PRECISION ban(31),bananas(31), x, YY(31) RECORD /videoconfig/ screen RECORD /wxycoord/ wxy RECORD /rccoord/ curpos COMMON screen C C DEFINICAO DA FUNCAO F(X) COM Raizes 2 e -1, f(x)=x*x-x-2=0 C FUNC(X)=X*X-X-2. FUNCL(X)=2*X-1. C LE OS VALORES PARA O INTERVALO [A,B]. WRITE(6,20) 20 FORMAT(' INTERVALO INICIAL = ') READ(5,1)A0 WRITE(6,21) 21 FORMAT(' INTERVALO FINAL = ') READ(5,1)B0 WRITE(6,22) 22 FORMAT(' RAIZ INICIAL = ') READ(5,1)X0 1 FORMAT(F5.2) if(X0.EQ.0.)X0=0.01 ban(1)=FUNC(X0) C CALCULA OS VALORES DE G(X) NO INTERVALO [A0,B0] C ACHA MAXIMOS DOS EIXOS X E Y H=(B0-A0)/20. XX(1)=A0 YY(1)=FUNC(XX(1)) MAXY=ABS(YY(1)) DO i=2,21 k=i-1 XX(i)=XX(k)+H YY(i)=FUNC(XX(i)) if(ABS(YY(i)).GT.MAXY)MAXY=ABS(YY(i)) END DO C O METODO DE NEWTON CALCULA F(X)=0 bananas(1)=X0 MAXX=X0 WRITE(6,6) 6 FORMAT(' RAIZ G(RAIZ) ITER') C DO I=2,21 if(FUNCL(X0).NE.0.)X1 = X0-FUNC(X0)/FUNCL(X0) bananas(I)=X1 ban(I)=FUNC(X1) if(X1.GT.MAXX)MAXX=X1 WRITE(6,3)X0,X1,I 3 FORMAT(F9.6 F9.6 I4) X0=X1 END DO C READ (*,*) ! Wait for ENTER key to be pressed CALL clearscreen ($GCLEARSCREEN) C C APRESENTA RAIZES Xi C dummy = SETTEXTCOLOR( 13 ) IF( screen.numcolors .LT. numc ) numc = screen.numcolors - 1 DO i = 1, 21 CALL SETTEXTPOSITION( i, 2, curpos ) WRITE (str, '(F4.1)') bananas(i) CALL OUTTEXT( 'Valor da raiz = ' // str ) END DO C APRESENTA OS Intervalos inicial e final dummy = SETTEXTCOLOR( 14 ) CALL SETTEXTPOSITION( 1, 30, curpos ) WRITE (str, '(F4.1)')A0 CALL OUTTEXT( 'Intervalo Inicial = ' // str ) CALL SETTEXTPOSITION( 2, 30, curpos ) WRITE (str, '(F4.1)')B0 CALL OUTTEXT( 'Intervalo Final = ' // str ) C C Draw a bordered rectangle around the graph. C dummy = SETCOLOR( 1 ) dummy = RECTANGLE_W( $GBORDER, -1.00, -1.00, 1.00, 1.00 ) dummy = RECTANGLE_W( $GBORDER, -1.02, -1.02, 1.02, 1.02 ) C C PLOTA OS PONTOS DAS RAIZES CALCULADAS. C x = -0.90 DO i = 1, 19 dummy = SETCOLOR( 2 ) CALL MOVETO_W( x, -1.D0, wxy ) dummy = LINETO_W( x, 1.0 ) CALL MOVETO_W( -1.D0, x, wxy ) dummy = LINETO_W( 1.0, x ) dummy = SETCOLOR( 14 ) CALL MOVETO_W( x - 0.1D0, bananas( i )/MAXX, wxy ) dummy = LINETO_W( x, bananas( i + 1 )/MAXX ) x = x + 0.1 END DO CALL MOVETO_W( 0.9D0, bananas( i )/MAXX, wxy ) dummy = LINETO_W( 1.0, bananas( i + 1 )/MAXX ) C Plot os pontos de g(x) C dummy = SETCOLOR( 12 ) x = -0.90 DO i = 1, 19 CALL MOVETO_W( x - 0.1D0, YY( i )/MAXY, wxy ) dummy = LINETO_W( x, YY( i + 1 )/MAXY ) x = x + 0.1 END DO CALL MOVETO_W( 0.9D0, YY( i )/MAXY, wxy ) dummy = LINETO_W( 1.0, YY( i + 1 )/MAXY ) END Usuarios/Junior/Novo/UFCG/C�lculo Num�rico/teste/SINE.FOR CC SINE.FOR - Illustrates basic graphics commands. CC INCLUDE 'FGRAPH.FI' INCLUDE 'FLIB.FI' CALL graphicsmode() CALL drawlines() CALL sinewave() CALL drawshapes() CALL endprogram() END C Definitions of subroutines go here SUBROUTINE graphicsmode() INCLUDE 'FGRAPH.FD' INTEGER*2 modestatus, maxx, maxy RECORD /videoconfig/ myscreen COMMON maxx, maxy C C Set highest resolution graphics mode. C modestatus = SETVIDEOMODE( $ERESCOLOR ) IF( modestatus.EQ.0) STOP 'Error: cannot set graphics mode' C C Determine the minimum and maximum dimensions. C CALL GETVIDEOCONFIG( myscreen ) maxx = myscreen.numxpixels - 1 maxy = myscreen.numypixels - 1 END CC NEWX - This function finds new x-coordinates. CC INTEGER*2 FUNCTION newx( xcoord ) INTEGER*2 xcoord, maxx, maxy REAL*4 tempx COMMON maxx, maxy tempx = maxx / 1000.0 tempx = xcoord * tempx + 0.5 newx = tempx END CC NEWY - This function finds new y-coordinates. INTEGER*2 FUNCTION newy( ycoord ) INTEGER*2 ycoord, maxx, maxy REAL*4 tempy COMMON maxx, maxy tempy = maxy / 1000.0 tempy = ycoord * tempy + 0.5 newy = tempy END CC DRAWLINES - This subroutine draws a box and CC several lines. SUBROUTINE drawlines() INCLUDE 'FGRAPH.FD' EXTERNAL newx,newy INTEGER*2 dummy,status, newx, newy, maxx, maxy RECORD /xycoord/ xy COMMON maxx, maxy C C Draw the box. C status = RECTANGLE( $GBORDER, 0, 0, maxx, maxy ) CALL SETVIEWORG( 0, newy( INT2( 500 ) ), xy ) C C Draw the lines. C dummy = SETTEXTCOLOR( 14 ) dummy = SETCOLOR( 14 ) CALL MOVETO( 0, 0, xy ) status = LINETO( newx( INT2( 1000 ) ), 0 ) CALL SETLINESTYLE( #AA3C ) CALL MOVETO( 0, newy( INT2( -250 ) ), xy ) status = LINETO(newx(INT2( 1000 ) ), + newy( INT2( -250 ) ) ) CALL SETLINESTYLE( #8888 ) CALL MOVETO( 0, newy( INT2( 250 ) ), xy ) status = LINETO( newx( INT2( 1000 ) ), + newy( INT2( 250 ) ) ) END CC SINEWAVE - This subroutine calculates and plots a sine CC wave. CC SUBROUTINE sinewave() INCLUDE 'FGRAPH.FD' REAL X0,A0,B0 INTEGER*2 dummy, newx, newy, locx, locy, i DOUBLE PRECISION rad, PI EXTERNAL newx, newy PARAMETER ( PI = 3.14159 ) C C Calculate each position and display it on the screen. C C LE OS VALORES PARA O INTERVALO [A,B]. WRITE(6,20) 20 FORMAT(' INTERVALO INICIAL = ') READ(5,1)A0 WRITE(6,21) 21 FORMAT(' INTERVALO FINAL = ') READ(5,1)B0 WRITE(6,22) 22 FORMAT(' RAIZ INICIAL = ') READ(5,1)X0 1 FORMAT(F5.2) dummy = SETCOLOR( 12 ) DO i = 0, 999, 3 rad = -SIN( PI * i / 250.0 ) locx = newx( i ) locy = newy( INT2( rad * 250.0 ) ) dummy = SETPIXEL( locx, locy ) END DO END CC DRAWSHAPES - Draws two boxes and two ellipses. CC SUBROUTINE drawshapes() INCLUDE 'FGRAPH.FD' EXTERNAL newx, newy INTEGER*2 dummy, newx, newy C C Create a masking (fill) pattern. C INTEGER*1 diagmask(8), linemask(8) DATA diagmask / #93, #C9, #64, #B2, #59, #2C, + #96, #4B / DATA linemask / #FF, #00, #7F, #FE, #00, #00, + #00, #CC / C C Draw the rectangles. C CALL SETLINESTYLE( #FFFF ) CALL SETFILLMASK( diagmask ) dummy = SETCOLOR( 13 ) dummy = RECTANGLE( $GBORDER, + newx( INT2( 50 ) ), newy( INT2( -325 ) ), + newx( INT2( 200 ) ), newy( INT2( -425 ) ) ) dummy = RECTANGLE( $GFILLINTERIOR, + newx( INT2( 550 ) ), newy( INT2( -325 ) ), + newx( INT2( 700 ) ), newy( INT2( -425 ) ) ) C C Draw the ellipses. C CALL SETFILLMASK( linemask ) dummy = SETCOLOR( 9 ) dummy = ELLIPSE( $GBORDER, + newx( INT2( 50 ) ), newy( INT2(325 ) ), + newx( INT2( 200 ) ), newy( INT2(425 ) ) ) dummy = ELLIPSE( $GFILLINTERIOR, + newx( INT2( 550 ) ), newy( INT2( 325 ) ), + newx( INT2( 700 ) ), newy( INT2( 425 ) ) ) END CC ENDPROGRAM - This subroutine waits for a key to CC be pressed, then resets the screen before CC returning. SUBROUTINE endprogram() INCLUDE 'FGRAPH.FD' INCLUDE 'FLIB.FD' INTEGER*2 dummy CHARACTER*1 dumch dumch = GETCHARQQ() ! Wait for a key to be pressed dummy = SETVIDEOMODE( $DEFAULTMODE ) END Usuarios/Junior/Novo/UFCG/C�lculo Num�rico/teste/CN1.OBJ Usuarios/Junior/Novo/UFCG/C�lculo Num�rico/teste/ITERLIN.OBJ Usuarios/Junior/Novo/UFCG/C�lculo Num�rico/teste/LINFOR.OBJ Usuarios/Junior/Novo/UFCG/C�lculo Num�rico/teste/MATRIZ~1.OBJ Usuarios/Junior/Novo/UFCG/C�lculo Num�rico/teste/MATRIZES.OBJ Usuarios/Junior/Novo/UFCG/C�lculo Num�rico/teste/MOTORCC.OBJ Usuarios/Junior/Novo/UFCG/C�lculo Num�rico/teste/MOTORCC1.OBJ Usuarios/Junior/Novo/UFCG/C�lculo Num�rico/teste/MOTORCC2.OBJ Usuarios/Junior/Novo/UFCG/C�lculo Num�rico/teste/NEWFOR.OBJ Usuarios/Junior/Novo/UFCG/C�lculo Num�rico/teste/SINE.OBJ Usuarios/Junior/Novo/UFCG/C�lculo Num�rico/teste/CN1.PIF Usuarios/Junior/Novo/UFCG/C�lculo Num�rico/teste/CN3.PIF Usuarios/Junior/Novo/UFCG/C�lculo Num�rico/teste/dadoin.txt Ra 1.005882353 La 0.0292 kb 0.0869 ki 0.0869 jm 0.00063078 Bm 0.0023 Tl 0.25 Iaref 10. Wmref 80. tref 5. CTEwm 100. CTEia 5. CTEteta 5. Ea 12.00000 INC 0.0020 kkp 0.086 kki -0.081 kkkp 36.22 kkki -29.95 ITER 3 #CONTAia 10 #CONTAwm 30 GRAFNUM 1 CONTROL 3 ZOOM 1 C�lculo Num�rico/exercicio 2 parte I.doc Universidade Federal de Campina Grande Departamento de Sistemas e Computação Disciplina: Cálculo Numérico Profs.: Bruno C N Queiroz J. Antão B. Moura José Eustáquio R. de Queiroz Joseana Macêdo Fechine Maria Izabel C. Cabral Lista de Exercícios N° 02 Módulo 2 – Conceitos Básicos: Sistemas de Numeração e Ponto Flutuante Aluno: Charles Cavalcante Marques Mat: 20521787 Enumere os principais princípios usados em Cálculo Numérico que são comuns à Matemática e outras áreas científicas (e.g. Física). Para cada princípio, forneça um exemplo/ ilustração diferente daquele usado em sala de aula. Interação ou aproximação sucessiva. Ex: Discretização. Ex: Transformação. Ex: área de um trapézio por retângulo(P1) e triângulos (P2) Aproximação. Ex: assíntotas ilustram comportamento !no limite”de uma função (complexa) de interesse. Divisão e Conquista. Ex: fazer uma integral complexa(por partes). Quais são as bases dos sistemas de numeração decimal, binário, octal e hexadecimal? Decimal: base 10; Binário: base 2; octal: base 8; Hexadecimal: base 6 Em geral, as representações decimal, octal e hexadecimal de um número binário contém mais ou menos dígitos do que o número binário? Menos, porque só tem 0 e 1. O maior e menor dígito em qualquer base vale quanto, respectivamente? Base – 1 é o maior digito em qualquer base, e o menor é zero. Quanto é o valor posicional do dígito mais à direita nos sistemas binário, octal, decimal e hexadecimal? É o b0, decimal = 100, no binário =20, no octal = 80, no hexadecimal = 160. Quanto é o valor posicional do dígito imediatamente à esquerda do dígito mais à direita nos sistemas binário, octal, decimal e hexadecimal? O mais a esquerda é b1, no decimal é 101, no binário é 21, no octal é 81, no hexadecimal é 161. Preencha a tabela abaixo com os valores posicionais das quatro posições indicadas, em cada um dos sistemas de numeração indicados: Decimal 1000 100 10 1 Hexadecimal 4096 256 16 1 Binário 8 4 2 1 Octal 512 64 8 1 Converta o binário 1101 0101 1000 para octal e hexadecimal. (11010101100)2 = (D58)16 = (6530)8 Converta FACE para binário. (FACE)16 = (1111 1010 1100 1110)2 Converta 7316 (octal) para binário. (7316)8 = (111 011 001 110)2 Converta 4FEC para octal (passe primeiro por binário). (4FEC)16 = (0 100 111 111 101 100)2 = (47754)8 Converta o binário 1101110 para decimal. (1101110)2 = 1 x 26 + 1 x 25 +0 x 24 + 1 x 23 + 1x 22 +1 x 21 + 0 x 20 = (110)10 Converta 317 (octal) para decimal. (317)8 = (317)10 Converta 317, 713 (octal) para decimal. (317,713)8 = 3 x 82 + 1 x 81 +7 x 80 , 7 x 8-1 +1 x 8-2 + 3 x 8-3 Converta 10,08 (decimal) para binário. (10,08)10 = 1010,0001 Converta 417 decimal para binário. Depois forneça os complementos de um e dois. (417)10 = (0100 0001 0111)2 C�lculo Num�rico/exercicio 2 parte II.doc Universidade Federal de Campina Grande Departamento de Sistemas e Computação Disciplina: Cálculo Numérico Profs.: Bruno C N Queiroz J. Antão B. Moura José Eustáquio R. de Queiroz Joseana Macêdo Fechine Maria Izabel C. Cabral Lista de Exercícios N° 02 Módulo 2 – Conceitos Básicos: Sistemas de Numeração e Ponto Flutuante Aluno: Charles Cavalcante Marques Mat: 20521787 Converta 417 decimal para binário. Depois forneça os complementos de um e dois. Qual o resultado quando o complemento de um de um número é adicionado ao próprio número? Por que um número real é também chamado de “ponto (ou vírgula) flutuante”? Por ser não contínuos e discretos. Qual seria a forma normalizada das representações dos números de ponto flutuante (todos decimais): 15,50 = normalizando = 0,1550 x 102 22 = normalizando = 0,22 x 102 3,1416... = normalizando = 0,31416... x 101 0,0327 = normalizando = 0,327 x 10-1 Repita a questão acima no caso dos números hexadecimais: ABC,123 = normalizando = 0,ABC123 x 163 123, ABC = normalizando= 0,123ABC x 16 3 0,F9. = normalizando = 0,F9 x160 Quais os três componentes básicos de uma representação para números reais? O sinal, a parte fracionaria chamada de significando ou mantissa e o expoente. O que é bit escondido na representação de floats? É um bit q não precisa ser representado, pois já esta implícito. Usando a representação/ilustração (8 bits) do slide 32 do conteúdo da Unidade 02, monte uma tabela com as faixas de valores para os números possíveis de serem representados com esta representação (a exemplo da Tabela no slide 45 – Quadro resumo IEEE 754). Por que usamos a representação não normalizada juntamente com a normalizada? Isto não gera confusão? Porquê a necessidade de padronizar a representação de floats? O que é de fato padronizado no IEEE 754? O que é um NAN? Represente com precisão simples e dupla, no padrão IEEE 754, os números decimais: i. 0 (zero); ii. -0 iii. 4 iv. 4725 X 10321 v. 10-345 14) Defina overflow e underflow. Ocorre overrflow quando o valor absoluto do dado a ser representado excede a capacidade de representação, porque o número de bits de expoente (nesse caso é positivo) é insuficiente para representar o dado. Ocorre underflow quando o valor absoluto do dado a ser representado é tão pequeno que fica menor que o menor valor representável. C�lculo Num�rico/exercicios 1.doc Universidade Federal de Campina Grande Departamento de Sistemas e Computação Disciplina: Cálculo Numérico Profs.: Bruno C N Queiroz J. Antão B. Moura José Eustáquio R. de Queiroz Joseana Macêdo Fechine Maria Izabel C. Cabral Lista de Exercícios N° 01 Módulo 1 – Motivação e Ferramentas de Suporte Aluno: Charles Marques Mat:20521787 Qual o objetivo do Cálculo Numérico? Estudar os procedimentos associados a diferentes métodos numéricos, analisando, com base nos conhecimentos adquiridos, em que condições se pode garantir que os resultados computados estão próximos dos resultados. Apresente aplicações nas quais se torna necessário (ou útil) a produção de resultados numéricos. Na construção de edifícios, na introdução de um diodo num circuito, etc. Sabendo que os métodos numéricos buscam soluções aproximadas para as formulações matemáticas, qual o problema inerente das soluções obtidas através da utilização destes métodos? Por ser aproximado do resultado real, sempre vai ter uma margem de erro, que pode ou não ser admissível. Quais os passos necessários para a obtenção de uma solução numérica utilizando o computador? Problema – levantamentos de dados – construção do modelo matemático – escolha do método numérico – implementação computacional – análise dos resultados – verificação. Ilustre aplicações do Cálculo Numérico no âmbito do seu curso. Plotar gráficos de engenharia, estudar métodos de produção,calcular margens de erros, entre outros. O que você entende por Ferramentas de Suporte? As ferramentas de suportes são subroutina disponíveis pela plataforma, no caso o compilador, que nos auxilia na construção dos programas. Como são classificados os programas de computação numérica? Caracterize cada um destes programas. São classificados em: Programa Individual Composto de alguns módulos Função: executar uma computação especifica. Pacote Coleção de programas pra solucionar problemas de uma área. Biblioteca Coleção sistematizada de programas para resolução de diversas classes de problemas de matemáticas. Tipicamente contem algumas centenas de programas. Sistema de Software Constituindo de um pacote ou biblioteca com uma interface de comunicação com o usuário. Utiliza uma linguagem especial. Descreva em linhas gerais as características do MATLAB que o tornam uma ferramenta útil ao Cálculo Numérico. Software interativo de alto desempenho; integração de analise numérica, calculo com matrizes, processamento de sinais e construção de gráficos resolução de problemas numéricos em apenas um fração do tempo que se gastaria para escrever um programa semelhante de linguagem Fortran, Basic ou C; as soluções dos problemas são expressas quase exatamente como escritas matematicamente, ao contrario da programação tradicional. C�lculo Num�rico/exercicios 2.doc Universidade Federal de Campina Grande Departamento de Sistemas e Computação Disciplina: Cálculo Numérico Profs.: Bruno C N Queiroz J. Antão B. Moura José Eustáquio R. de Queiroz Joseana Macêdo Fechine Maria Izabel C. Cabral Lista de Exercícios N° 02 Módulo 2 – Conceitos Básicos: Sistemas de Numeração e Ponto Flutuante Enumere os principais princípios usados em Cálculo Numérico que são comuns à Matemática e outras áreas científicas (e.g. Física). Para cada princípio, forneça um exemplo/ ilustração diferente daquele usado em sala de aula. Interação ou aproximação sucessiva. Ex: Discretização. Ex: Transformação. Ex: Aproximação. Ex: Divisão e Conquista. Ex: Quais são as bases dos sistemas de numeração decimal, binário, octal e hexadecimal? Decimal: base 10; Binário: base 2; octal: base 8; Hexadecimal: base 6 Em geral, as representações decimal, octal e hexadecimal de um número binário contém mais ou menos dígitos do que o número binário? Menos, porque só tem 0 e 1. O maior e menor dígito em qualquer base vale quanto, respectivamente? Base – 1 é o maior digito em qualquer base, e o menor é zero. Quanto é o valor posicional do dígito mais à direita nos sistemas binário, octal, decimal e hexadecimal? É o b0, decimal = 100, no binário =20, no octal = 80, no hexadecimal = 160. Quanto é o valor posicional do dígito imediatamente à esquerda do dígito mais à direita nos sistemas binário, octal, decimal e hexadecimal? O mais a esquerda é b1, no decimal é 101, no binário é 21, no octal é 81, no hexadecimal é 161. Preencha a tabela abaixo com os valores posicionais das quatro posições indicadas, em cada um dos sistemas de numeração indicados: Decimal 1000 100 10 1 Hexadecimal 4096 256 16 1 Binário 8 4 2 1 Octal 512 64 8 1 Converta o binário 1101 0101 1000 para octal e hexadecimal. Converta FACE para binário. Converta 7316 (octal) para binário. Converta 4FEC para octal (passe primeiro por binário). Converta o binário 1101110 para decimal. Converta 317 (octal) para decimal. Converta 317, 713 (octal) para decimal. Converta 10,08 (decimal) para binário. Converta 417 decimal para binário. Depois forneça os complementos de um e dois. Qual o resultado quando o complemento de um de um número é adicionado ao próprio número? Por que um número real é também chamado de “ponto (ou vírgula) flutuante”? Qual seria a forma normalizada das representações dos números de ponto flutuante (todos decimais): 15,50 22 3,1416... 0,0327 Repita a questão acima no caso dos números hexadecimais: ABC,123 123, ABC 0,F9. Quais os três componentes básicos de uma representação para números reais? O que é bit escondido na representação de floats? Usando a representação/ilustração (8 bits) do slide 32 do conteúdo da Unidade 02, monte uma tabela com as faixas de valores para os números possíveis de serem representados com esta representação (a exemplo da Tabela no slide 45 – Quadro resumo IEEE 754). Por que usamos a representação não normalizada juntamente com a normalizada? Isto não gera confusão? Porquê a necessidade de padronizar a representação de floats? O que é de fato padronizado no IEEE 754? O que é um NAN? Represente com precisão simples e dupla, no padrão IEEE 754, os números decimais: i. 0 (zero); ii. -0 iii. 4 iv. 4725 X 10321 v. 10-345 Defina overflow e underflow. C�lculo Num�rico/exercicios integra�ao.doc Universidade Federal de Campina Grande Departamento de Sistemas e Computação Disciplina: Cálculo Numérico Profs.: Bruno C N Queiroz J. Antão B. Moura José Eustáquio R. de Queiroz Joseana Macêdo Fechine Maria Izabel C. Cabral Lista de Exercícios N° 08 Módulo 7 – Integração DATA: 18/03/2003 1) Qual a idéia básica da integração numérica? 2) Ilustre situações nas quais se torna útil a realização da integração numérica. 3) Descreva as principais características da Regra dos Trapézios Simples e da Regra dos Trapézios Composta. 4) Seja Calcule uma aproximação para I usando a Regra de Trapézios Simples. Estime o erro cometido. Calcule uma aproximação para I usando a Regra de Trapézios Composta, com 5 intervalos. Estime o erro cometido. Para a integral acima, determine o número mínimo de intervalos para uso na Regra de Trapézios Composta de modo que o erro seja inferior a 0,001. Seja, Calcule uma aproximação para I usando a Regra de Trapézios Simples. Estime o erro cometido. Calcule uma aproximação para I usando a Regra de Trapézios Composta, com 4 intervalos. Estime o erro cometido. � EMBED Unknown ��� � EMBED Unknown ��� _1109688995.unknown _1109499587.unknown C�lculo Num�rico/exercicios interpola�ao.doc Universidade Federal de Campina Grande Departamento de Sistemas e Computação Disciplina: Cálculo Numérico Profs.: Bruno C N Queiroz J. Antão B. Moura José Eustáquio R. de Queiroz Joseana Macêdo Fechine Maria Izabel C. Cabral Lista de Exercícios N° 07 Módulo 6 – Interpolação e Ajuste de Curvas DATA: 18/03/2003 Em que consiste a interpolação? Ilustre situações nas quais se torna útil o uso da interpolação. Descreva, em linhas gerais, a interpolação polinomial. Apresente situações nas quais não é aconselhável o uso da interpolação polinomial. Descreva as principais características do Método dos Mínimos Quadrados utilizado para o Ajuste de Curvas. Qual a relação entre o número de pontos usados na interpolação e o grau do polinômio interpolador que pode ser calculado? Se você tiver um conjunto de 5 dados {(x0,f(x0), (x1,f(x1), (x2,f(x2), (x3,f(x3), (x4,f(x4),}, e deseja fazer uma interpolação linear, isto é, encontrar uma reta que lhe permita obter o valor de f(x(), onde x1<x(<x2: Qual seria o grau do polinômio que você calcularia, isto é, quantos pontos você utilizaria? E quais pontos da tabela você usaria? 7) A seguinte tabela informa o número de carros que passam por um determinado pedágio em um determinado dia: Horário 10:00 10:30 11:00 11:30 12:00 12:30 Número (em mil) 2.69 1.64 1.09 1.04 1.49 2.44 Faça um gráfico de horário vs. número de carros para verificar qual a tendência da curva. Estime o número de carros que passariam pelo pedágio às 11:10, usando a forma de Lagrange para encontrar um polinômio interpolador p(x) que estima o número de carros em função do tempo. Use uma reta como função interpoladora. Agora, faça a mesma estimativa, mas utilizando uma parábola como polinômio interpolador. 8) Determine a melhor reta que passa pelos seguintes pontos (use MMQ): x 1 2 3 4 5 f(x) 0 2 4 5 5 9) Repita o exercício 7) acima, só que agora, fazendo ajuste de curvas (MMQ). Regressão linear Regressão polinomial C�lculo Num�rico/exercicios n 3.doc Universidade Federal de Campina Grande Departamento de Sistemas e Computação Disciplina: Cálculo Numérico Profs.: Bruno C N Queiroz J. Antão B. Moura José Eustáquio R. de Queiroz Joseana Macêdo Fechine Maria Izabel C. Cabral Lista de Exercícios N° 03 + Gabarito Módulo 3 – Erros Erros estão sempre presentes nas soluções numéricas. Apresente exemplos dos seguintes tipos de erros: Inerente ex: 50,3 +- 02 cm de Truncamento ex: aproximação de uma função pela serie de Taylor. de Representação de Conversão De que depende a representação de um número em um computador? Depende do computador q será usado. Os resultados dos cálculos realizados dependem da representação dos números nas máquinas utilizadas. Por que na expressão para xi = 0,11, calculado no computador, obtem-se S=3299.99691 e não S= 3300 ? o resultado dos cálculos realizados dependem da representação dos números nas maquinas utilizadas. (011)10 não tem representação finita ma base 2. Defina: Erro Absoluto e Erro Relativo. O que significa “Limitante Superior” no estudo de Erros Absolutos? Dê exemplos. Erro absoluto = a diferença entre um valor exato e sua aproximação ´[e dito erro absoluto no qual é denotado por EA Erro relativo = é o erro absoluto dividido pelo valor aproximado. ER Que tipo de erro nos dá informações sobre “precisão”? Mostre um exemplo em que a “precisão” é importante. Apresente exemplos nos quais ocorrem erros de arredondamento e erros de truncamento. Complete: Ao se resolver um problema numericamente, a cada etapa e a cada operação realizada, devem surgir diferentes tipos de erros gerados das mais variadas maneiras, e estes erros se propagam e determinam o erro no resultado final obtido. O erro total em uma operação aritmética é composto pelo erro ________________________ e pelo erro no ________________ da operação. 8) Seja x = 0.857 x 104 e y = 0.6772 x 102. Calcular x - y e ER(x-y)sabendo que x, y e estão exatamente representados. Seja um sistema de aritmética de ponto flutuante de quatro dígitos, base decimal e com acumulador de precisão dupla. Dados os números: X=0,7237x104 y=0,2145x10-3 e z=0,2585x101 Efetue as seguintes operações e obtenha o erro relativo no resultado, supondo que x, u, e z estão exatamente representados. a)x+y+z b)x-y-z c)x/y d)(x.y)/z e)x.(y/z) f) (x+y).z 10) 11) Mesma questão para : 12) Gabarito da Série de Exercícios (Questões 9 a 12) 9) a) x+y+z = 0,7240 x 104 e lERx+y+zl < 0,9998 x 10-3 b) x-y-z = 0,7234 x 104 e lERx-y-zl < 1,0002 x 10-3 c) x/y = 0,3374 x 108 e lERx/yl < 1/2 x 10-3 d) (x.y)/z= 0,6004 e lER(x.y)/zl < 10-3 e x.(y/z) = 0,6005 e lERx(y/z)l < 10-3 f) (x+y).z = 0,1871 x 105 e lER(x+y).zl < 10-3 10) lERul < 10-t+1 e lERwl < 4/3 x 10-t+1 11) lERul < 10-t+1 e lERwl < 13/8 x10-t+1 12) lERul < 2 x10-t+1 e lERwl < 7/3 x10-t+1 � EMBED Equation.3 ��� � EMBED Equation.3 ��� é menor do que o de Sejam � EMBED Equation.3 ��� e � EMBED Equation.3 ��� as representações de x e y obtidas por arredondamento em um computador. Deduza expressões de limitante de erro para mostrar que o limitante de erro relativo de e e � EMBED Equation.3 ��� � EMBED Equation.3 ��� � EMBED Equation.3 ��� � EMBED Equation.3 ��� Supondo que x é representado num computador por � EMBED Equation.3 ���, onde � EMBED Equation.3 ��� é obtido por arredondamento, obtenha os limites superiores para os erros relativos de � EMBED Equation.3 ��� _1099771095.unknown _1116913791.unknown _1116913802.unknown _1116913711.unknown _1116913718.unknown _1099770729.unknown _1099770977.unknown _1099769191.unknown _1099770728.unknown _1099769190.unknown _1099767986.unknown C�lculo Num�rico/Lista 1.doc Universidade Federal de Campina Grande Centro de Ciências e Tecnologia Disciplina: Cálculo Numérico Professor: Marcelo Barros Universitário: Hélio Cavalcanti A. Neto Respostas da Lista de Exercícios Nº01 01. Buscar solucionar problemas técnicos através de métodos numéricos na solução de problemas na engenharia, verificando sempre a veracidade dos resultados. 02. As aplicações em cálculo numérico são largamente utilizadas em diversos processos da engenharia. Pode-se citar, por exemplo, a introdução de um diodo no circuito, determinação de raízes de equações, construções de edifícios e pontes. 03. Como os métodos numéricos buscam soluções aproximadas do que seria um valor exato, a possibilidade de se cometer erros é grande. Para um engenheiro é extremamente necessário conhecer a margem de tais erros e saber se estes são cabíveis ou não, para o desempenho preciso de seu trabalho. 04. São os seguintes passos: 1) Conhecer o problema; 2) Fazer um levantamento de dados; 3) Realizar a construção de um modelo matemático; 4) Escolha do método numérico; 5) Implementação computacional; 6) Análise dos dados; 7) Verificação do resultado. 05. No âmbito da engenharia de produção, têm-se inúmeras utilidades, pois o curso de engenharia de produção oferece diversas especialidades. Pode-se plotar gráficos, determinar valores aproximados para a correta execução de projetos urbanístico-arquitetônicos, determinar soluções para problemas matemáticos que não podem ser resolvidos de forma analítica, etc. 06. Ferramentas de suporte são softwares que auxiliam a resolução de problemas que envolvem calculo numérico. 07. São classificados em: Programa individual. Composto de alguns módulos, tendo função de executar uma compilação especifica. Exemplo: Obter uma integral definida de uma função dada. Pacote. Coleção de programas para solucionar problemas de uma área. Exemplo: Solução de sistemas de equações lineares. Biblioteca. Coleção sistematizada de programas para resolução de diversas classes de problemas de matemática. Tipicamente contém algumas centenas de programas. Sistema de Software. Constituído de um pacote ou uma biblioteca com uma interface de comunicação com o usuário. Utiliza uma linguagem especial. Exemplos: MATLAB, MAPLE, MATHEMATICA, etc. 08. Software interativo destinado ao cálculo numérico, onde seu ambiente é de fácil interação. Podem-se solucionar diversos tipos de problema, tais como: integração de integração de análise numérica, cálculo com matrizes, construções de gráficos e processamentos de sinais. Além disso, é um software ágil e eficiente, pois os problemas numéricos são resolvidos em fração de tempo que se gastaria para escrever um programa semelhante em linguagem Fortran, Basic ou C. C�lculo Num�rico/Lista 2.doc Universidade Federal de Campina Grande Centro de Ciências e Tecnologia Disciplina: Cálculo Numérico Professor: Marcelo Barros Universitário: Hélio Cavalcanti A. Neto Respostas da Lista de Exercícios Nº02 01. 1) Interação ou aproximação sucessiva. Exemplo: Conversores A/D por aproximação sucessiva, utilizando um algoritmo para converter a entrada analógica em digital 2) Discretização. Exemplo: Numa dilatação de uma placa de concreto, se pega uma amostra que esteja dentre o intervalo de 1 hora e a estuda-a. 3) Aproximação. Exemplo: Utiliza-se nas series o teste da comparação para solucionar determinadas funções que são semelhantes a funções cujos resultados são conhecidos. 4) Transformação Exemplo: A área de um hexágono regular pode ser achada dividindo este hexágono em seis triângulos eqüiláteros e somando suas áreas. 5) Divisão e conquista. Exemplo: Área de um hexágono regular 02. Decimal: base 10; Binário: base 2; Octal: base 8; Hexadecimal: base 16. 03. Contém menos. 04. O menor dígito vale zero, já o maior dígito depende da base. Pode-se identificar fazendo: (BASE-1). Por exemplo: Maior dígito da Base 8 8-1 = 7 05. Decimal: 10 Binária: 2 Hexadecimal: 16 Octal: 8 Por exemplo: 26 2.10 +6.10 Valor posicional do dígito mais a direita 06. Decimal: 10 Binária: 2 Hexadecimal: 16 Octal: 8 Por exemplo: 26 2.10 +6.10 Valor posicional do dígito a esquerda 07. Decimal 1000 100 10 1 Hexadecimal 4096 256 16 1 Binário 8 4 2 1 Octal 512 64 8 1 08. (11010101100)2 = (D58)16 = (6530)8 09. (FACE)16 = (1111 1010 1100 1110)2 10. (7316)8 = (111 011 001 110)2 11. (4FEC)16 = (0 100 111 111 101 100)2 = (47754)8 12. (1101110)2 = 1 x 26 + 1 x 25 +0 x 24 + 1 x 23 + 1x 22 +1 x 21 + 0 x 20 = (110)10 13. (317)8 = (317)10 14. (317,713)8 = 3 x 82 + 1 x 81 +7 x 80 , 7 x 8-1 +1 x 8-2 + 3 x 8-3 15. (10,08)10 = 1010,0001 16. (417)10 = (0100 0001 0111)2 17. 18. Por ser não contínuos e discretos. 19. 15,50 normalizando = 0,1550 x 102 22 normalizando = 0,22 x 102 3,1416... normalizando = 0,31416... x 101 0,0327 normalizando = 0,327 x 10-1 20. ABC,123 normalizando = 0,ABC123 x 163 123, ABC normalizando= 0,123ABC x 16 3 0,F9 normalizando = 0,F9 x160 21. O sinal, a mantissa e o expoente. _1227648555.unknown _1227648724.unknown _1227649438.unknown _1227649445.unknown _1227648785.unknown _1227648714.unknown _1227648507.unknown _1227648522.unknown _1227634620.unknown C�lculo Num�rico/Lista 3.doc Universidade Federal de Campina Grande Centro de Ciências e Tecnologia Disciplina: Cálculo Numérico Professor: Marcelo Barros Universitário: Hélio Cavalcanti A. Neto Respostas da Lista de Exercícios Nº03 01. a) Erro inerente de uma balança, pois todo e qualquer instrumento possui limitações na precisão com que pode fazer medidas de grandezas físicas. b) Número c) Representação de 128.5 é 1000 0000.1 Mas os 9 bits não cabem nos 8 bits da mantissa, portanto o número representado é 128.0 originando um erro de representação d) Conversão de 0,1 para base 2. 02. Depende da máquina utilizada. Por exemplo, não tem representação finita e podem existir várias representações distintas em diferentes máquinas. 03. O resultado dos cálculos depende da representação dos números nas maquinas utilizadas, no caso acima a diferença de ocorre devido a uma aproximação, resultando em S = 3300. 04. Erro absoluto ( ) é a diferença entre o valor exato e o valor aproximado. = Erro relativo ( ) é a divisão entre o valor absoluto e o valor exato. = Limite superior é a variação tanto positiva quanto negativa que se pode conter o erro. Para ((3.14 ,3.15) |EA | = | - | < 0.01, Para = 2112,9 com |EAx| < 0.1 tem-se x ((2112,8, 2113), Para = 5.3 com |EAx| < 0.1 tem-se y ( (5.2,5.4). 05. Arredondamento. Na construção de pontes. 06. Truncamento: aproximação de uma função pela serie de Taylor e valor de Arredondamento: valor de e 07. Ao se resolver um problema numericamente, a cada etapa e a cada operação realizada, deve surgir diferentes tipos de erros gerados das mais variadas maneiras, e estes erros se propagam e determinam o erro no resultado final obtido. O erro total em uma operação aritmética é composto pelo erro DAS PARCELAS e pelo erro no RESULTADO da operação. 08. 09. _1227650789.unknown _1227651278.unknown _1227950115.unknown _1227950919.unknown _1227950983.unknown _1227950714.unknown _1227651419.unknown _1227650979.unknown _1227651043.unknown _1227651193.unknown _1227650811.unknown _1227650340.unknown C�lculo Num�rico/matlab.zip apostilamatlab.doc � 11 INTRODUÇÃO 2 EXEMPLOS SIMPLES 1 3 CARACTERÍSTICAS BÁSICAS 4 3.1 Área de Trabalho do MATLAB 4 3.2 Formato dos Números 5 3.3 Variáveis 5 3.4 Comentários e Pontuações 6 3.5 Operadores Relacionais 8 4 Números Complexos 8 5 Funções Matemáticas 9 6 Gerenciamento de Arquivos 13 6.1 Arquivos Script (M-files) 13 7 CONSTRUÇÃO DE VETORES 17 7.1 ENDEREÇAMENTO DE VETORES 19 8 Controles de Fluxo no MatLab 22 8.1 Loops for 22 8.2 Loops while 23 8.3 Estruturas if-else-end 23 9 MATRIZES 25 9.1 Operações Escalares com Matrizes no MatLab 26 9.2 Operações entre Matrizes no MatLab 27 10 Manipulação de Gráficos 29 10.1 Estilo de Linhas e Cores: 33 11 EXEMPLOS DE APLICAÇÃO DE VETORES NA VISUALIZAÇÃO DE SINAIS REPRESENTADOS NO DOMÍNIO DO TEMPO 35 �� INTRODUÇÃO O MATLAB é uma ferramenta software que pode funcionar como uma simples calculadora ou até como uma linguagem de programação científica (fortran, C, etc.) para soluções de complicadas expressões algébricas. Entretanto, o MATLAB apresenta diversas vantagens em relação as calculadoras e linguagens de programação: simplicidade e uma interface gráfica bastante completa para visualização e análise dos resultados. EXEMPLOS SIMPLES Os exemplos aqui apresentados tem o objetivo de demonstrar alguns tipos de problemas que podem ser resolvidos utilizando o Matlab. Como primeiro exemplo tem-se a utilização do Matlab como uma calculadora. Os comandos apresentados abaixo devem ser digitados diretamente no prompt ((() do Matlab. O símbolo ( significa apertar a tecla Enter. (( 3+5+2 ( ans = 10 Neste exemplo foram digitados três números intercalados pelo símbolo +. Esta expressão para o Matlab significa a soma destes três números. Ao apertar a tecla Enter (() é apresentado o resultado desta operação que é 10. As letras ans significa answer, ou seja, resposta. O próximo exemplo mostra a capacidade de atribuir um valor a uma variável e realizar operações com estas variáveis. (( a = 5 ( a = 5 (( b = 33.50 ( b = 33.5000 (( a + b ( ans 38.5000 Observe que neste exemplo foram atribuídos valores para as variáveis a e b e em seguida é feita uma operação somando os dois valores. Um comando interessante de apresentar neste momento é o who. Ao digitar este comando no prompt do Matlab e pressionar o Enter são apresentadas as variáveis utilizadas até o momento. O próximo exemplo fará a visualização da função � A seguir estão os comandos para apresentar o gráfico desta função com A=1 e ( =phi=0 . Estes comandos devem ser digitados diretamente no prompt do Matlab. ((A=1; ( ((phi = 0; ( (( x = 0:360; ( (( y = A*sin(2*pi*x/360+phi); ( (( plot(y,'k');grid on ( ((xlabel(‘Valores de x em graus’) ( ((ylabel(‘y’) ( ((title(‘Figura 1 : sin(2*pi*x/360)’) ( O resultado destes comandos é a plotagem de um ciclo do seno como mostrado na figura 1. Observe a necessidade da divisão por 360 para que seja possivel o aparecimento de um ciclo completo. Exercício : Plote um ciclo do seno como mostrado na figura 1.1 quando : i) A = 2 e ( = phi = 0. Use os comandos : ((A=2; ( ((phi = 0; ( (( x = 0:360; ( (( z = A*sin(2*pi*x/360+phi); ( (( plot(z,'k-');grid on ( ii) A=2 e (=phi=2*pi* 45/360. Use os comandos : ((A=2; ( ((phi = 2*pi*45/360; (( x = 0:360; ( (( v = A*sin(2*pi*x/360+phi); ( (( plot(v,'k');grid on ( iii) Finalmente use o comando : (( plot(x,y,‘k-.’,x, z,‘b-o’,x, v,‘r+’); grid on ( O MATLAB oferece as seguintes operações aritméticas básicas : Tabela 1 : Operações Aritméticas Básicas Operação Símbolo Exemplos adição, a ( b ( 8(3 subtração, a ( b ( 28(15 multiplicação, a(b ( 4.15(8.10 divisão, a(b / ou \ 64/5 ; 67\9 power, ab ^ 5^2 As expressões são executadas da esquerda para a direita com a seguinte ordem de precedência: operação de potência, seguida das operações de multiplicação e divisão, que por sua vez são seguidas pelas operações de adição e subtração. Parênteses podem ser usados para alterar esta ordem de precedências, onde as operações são executadas dos parênteses mais internos para os mais externos. CARACTERÍSTICAS BÁSICAS O MATLAB é uma ferramenta software que tem por característica básica a simplicidade de utilização e uma poderosa interface gráfica. Como qualquer software ou linguagem de programação é necessário haver uma adaptação à ferramenta. Área de Trabalho do MATLAB A área de trabalho do MATLAB é onde ficam residentes os diversos comandos e valores de quaisquer variáveis que foram digitados na janela de comandos. Como aqueles comandos e variáveis estão residentes na área de trabalho do MATLAB, podem ser invocados sempre que for preciso ou desejado. Por exemplo, se quiser verificar o valor da variável a basta que se entre com o nome desta variável no prompt. (( a ( a = 5 Como já foi visto, se você não consegue lembrar das variáveis, pode-se obter uma lista de todas as variáveis usando-se o comando who ((who ( Your variables are : a b x A phi ans y z v Formato dos Números Como default, se um resultado é inteiro, o MATLAB mostra o número como inteiro. Igualmente, quando o resultado é real, o MATLAB mostra o número com 4 dígitos a direita do ponto decimal. Se os dígitos do resultado estiverem fora desta faixa, o MATLAB mostra o resultado usando a notação científica como numa calculadora científica. Este default pode, entretanto, ser modificado usando-se o Numeric Format da pasta general na linha Preferences do ítem Files na barra de menus. Exercício : Usando-se a variável b usado anteriormente, verifique a tabela de formatos numéricos abaixo : Tabela 2 : Formatos Numéricos Comando MATLAB b Comentários format long 33.50000000000000 16 dígitos format short e 33.500e+01 5 dígitos mais expoente format long e 33.50000000000000 e +01 16 dígitos mais expoente format hex 4040c00000000000 hexadecimal format bank 33.50 2 dígitos decimais format + + positivo, negativo ou zero format rat 67/2 racional format short 33.5000 4 dígitos decimais (formato default) Variáveis Os nomes das variáveis devem consistir de uma única palavra, conforme as três regras abaixo : Tabela 3 : Regras de Construção de Variáveis Regras de Construção das Variáveis Comentários/Exemplos Variáveis em letras minúsculas e maísculas são diferentes mesmo que consistam das mesmas letras Items, items, itEms e ITEMS são variáveis diferentes entre si no MATLAB As variáveis podem consistir de até 19 letras holnmbjkitkklwenohu As variáveis devem começar com alguma letra, podendo ser seguido por quaisquer letras, dígitos ou subescrito. Caracteres de pontuação não podem ser utilizados. how_about x512 a_b_c_d Em adição às regras acima para formação das variáveis, as seguintes variáveis são especiais no MATLAB : ans, pi, eps, flops, inf, NaN, i, j, nargin, nargout, realmin e realmax Tabela 4 : Variáveis Especiais Variáveis Especiais Significado ans Nome “default” da variável usado para resultados pi Constante igual à razão da circunferência de um círculo para o seu diâmetro eps O menor número tal que quando adicionado com um outro resulta em um número diferente flops Conta o número de operações em ponto- flutuante inf Indica um número infinito, p.e., 1/0 NaN Indica que não é um número, p. e., 0/0 i (e) j i=j= � nargin Número de argumentos de entrada usados em uma função nargout Número de argumentos de saída usados em uma função realmin O menor número real positivo utilizável realmax O maior número real positivo utilizável Comentários e Pontuações Todo e qualquer texto depois do símbolo de porcentagem (%), é tomado como sendo um comentário : ((n_macacos=10 % Número de macacos que vivem no bosque ( n_macacos= 10 Vários comandos podem ser colocados em uma linha se os mesmos forem separados por virgula ou ponto e vírgula : ((n_macacos=10, n_laranjas=20, n_uvas=1000; n_bananas=100 ( n_macacos= 10 n_laranjas= 20 n_bananas= 100 Observe que quando é utilizado ponto e vírgula o MATLAB não mostra o resultado. No exemplo acima, o valor atribuído à variável n_uvas não foi mostrado por causa do ponto e vírgula que foi utilizado. Observe agora o efeito dos três pontos (...) : ((clientes=10; ( ((n_uvas_por_cliente=n_uvas/... ( clientes ( ((n_uvas_por_cliente= 100 Assim, os três pontos (...) indica ao MATLAB continuação da expressão matemática na próxima linha. Operadores Relacionais Os operadores relacionais do Matlab incluem todas as comparações comuns e são apresentados na tabela 5. Tabela 5: Operadores relacionais Números Complexos Os números complexos podem ser representados no MATLAB de diversas maneiras. Alguns exemplos são mostrados a seguir : ((x=1-4i % a letra “i” significa ou indica a parte imaginária ( x= 1.000 - 4.000i ((x=1-4j % a letra “j” também pode ser usada para indicar a parte imaginária ( x= 1.000 - 4.000i Identidade de Euler : relaciona a forma polar de um número complexo com a sua forma retangular � No MATLAB, a conversão entre as formas polar e retangular de um número complexo utiliza as seguintes funções : real, imag, abs e angle. ((x ( x= 1.000 - 4.000i ((M=abs(x) ( M= 4.1231 ((theta=angle(x)*180/pi ( theta=-14.0362 ((a=real(x) ( a= 1 ((b=imag(x) ( b= -4 Funções Matemáticas Na tabela abaixo tem-se uma lista parcial das funções comuns que o MATLAB suporta. Tabela 6 : Funções Comuns abs(x) acos(x) acosh(x) angle(x) asin(x) asinh(x) atan(x) atanh(x) conj(x) cos(x) cosh(x) exp(x) fix(x) floor(x) gcd(x,y) imag(x) lcm(x) log(x) log10(x) real(x) rem(x,y) round(x) sign(x) sin(x) sinh(x) sqrt(x) tan(x) tanh(x) Valor absoluto ou magnitude de um número complexo Inverso do coseno Inverso do coseno hiperbólico Ângulo de um número complexo Inverso do seno Inverso do seno hiperbólico Inverso da tangente Inverso da tangente hiperbólico Conjugado complexo Coseno Coseno hiperbólico Exponencial : ex Arredondamento em direção ao zero Arredondamento em direção ao menos infinito Máximo divisor comum dos inteiros x e y Parte imaginária de um número complexo Mínimo múltiplo comum dos inteiros x e y Logarítmo natural Logarítmo comum Parte real de um número complexo Resto da divisão de x/y Arredondamento para o inteiro mais próximo Função signum Seno Seno hiperbólico Raíz quadrada Tangente Tangente hiperbólico Uma função muito útil no estudo de princípios de comunicações, é a função retangular definida abaixo : No MATLAB, pode-se visualizar esta função a partir da função sign(x). Para um melhor entendimento, inicialmente é visualizado a função -sign(t) no intervalo -( ( t ( ( . ((t=-pi:2*pi/100:pi; % Cria-se o vetor t com 100 elementos em ( (( % incrementos de 2*pi/100 ( ((y=-sign(t); ((plot(t,y,‘g+’); grid on ( ((title(‘Figura 2 : Função -sign(t)’) ( ((xlabel(‘t’) ( ((ylabel(‘-sign(t)’) ( A figura 2 mostra a plotagem da função –sign(t), no intervalo -( ( t ( (. Comparando-se a curva obtida da função -sign(t) com a definição da função retangular f(t), conclui-se que f(t) é a função -sign(t) deslocada de (, i.e. : � Portanto, os seguintes comandos são suficientes para reproduzir a função retangular, f(t): ((t=0:2*pi/100:2pi; % Cria-se o vetor t com 100 elementos em ( (( % incrementos de 2*pi/100 ( ((y=-sign(t-pi); ( ((plot(t,y,‘g+’); grid on ( ((title(‘Figura 3 : Função retangular f(t)’) ( ((xlabel(‘t’) ( ((ylabel(‘f(t)’) ( Obtém-se o resultado mostrado abaixo (figura 3). � Gerenciamento de Arquivos O MATLAB possui uma série de comandos para gerenciamento de arquivos, tais como listar os nomes de arquivos, vizualizar, deletar, etc. Na tabela abaixo tem-se um resumo dos principais comandos : Tabela 7 : Comandos para Gerenciamento de Arquivos cd p=cd cd temp cd .. chdir chdir path delete test dir ls matlabroot path pwd type test what which test Mostra o diretório de trabalho atual ou corrente Retorna para a variável p o diretório de trabalho corrente Muda para o diretório temp Muda para o diretório um nível acima O mesmo que cd O mesmo que cd temp deleta o arquivo test.m Lista todos os arquivos do diretório de trabalho presente Faz o mesmo que o comando dir Retorna o caminho do diretório onde se encontra o programa MATLAB executável Visualiza todos os caminhos de diretório do MATLAB O mesmo que o comando cd Visualiza o arquivo M-file test.m na janela de comandos Retorna uma lista de todos os M-files do diretório corrente Visualiza o caminho do diretório do arquivo test.m Arquivos Script (M-files) Para resolver problemas simples, é cômodo e eficiente utilizar o MATLAB como se fosse uma calculadora, entrando-se com os comandos diretamente no prompt. Entretanto, a medida que o número de comandos aumenta, ou quando se deseja mudar o valor de uma ou mais variáveis e executar novamente os comandos, o uso do MATLAB simplesmente como calculadora torna-se ineficiente e tedioso. Nestes casos, o melhor é utilizar o MATLAB como uma linguagem de programação de alto nível, isto é, escrever um arquivo “script” ou M-files. Os M-files são os programas fontes do MATLAB e levam a extensão .m , por exemplo, exemplo1.m. Para escrever um programa no MATLAB, escolha File na barra de menu. Dentro do menu File escolha New e selecione M-file, como mostrado na figura 4. Abre-se, então, um editor de textos, onde pode-se escrever os comandos do MATLAB. Escreva, por exemplo, o programa abaixo : %===================================================== % Exemplo de programação no MATLAB % Este exemplo plota uma função seno nas sequintes % condições: % sen(x) % 2*sen(x) % 2*sen(x+45) % 2*sen(x-90) % 2*sen(2*x) %============================================== % x=0:360; % % Seno com amplitude A=1 e defasagem phi=0 graus A=1; phi=0; y=A*sin(2*pi*x/360+2*pi*phi/360); % Seno com amplitude A=2 e defasagem phi=0 graus A=2; phi=0; z=A*sin(2*pi*x/360+2*pi*phi/360); % Seno com amplitude A=2 e defasagem phi=45 graus A=2; phi=45; v=A*sin(2*pi*x/360+2*pi*phi/360); % Seno com amplitude A= 2 e defasagem phi=-90 graus A=2; phi=-90; w=A*sin(2*pi*x/360+2*pi*phi/360); % Seno com amplitude A= 2 e defasagem phi=0 graus A=2; phi=0; u=A*sin(2*pi*2*x/360+2*pi*phi/360); % Plotagem do resultado plot(x,y,'k-',x,z,'k--',x,v,'k-.',x,w,'k.',x,u, 'ko') grid xlabel('Valores de x em graus') ylabel('y,z,v,w e u') title('Estudo de defasagem e amplitude de um seno') legend('sen(x)','2*sen(x)','2*sen(x+45)','2*sen(x-90)', '2*sen(2*x)') Uma vez escrito o programa, entre no menu File da janela do editor de textos e escollha a opção Save as... Nesta opção do menu, salve o programa como prog1.m no seu diretório de trabalho. Em seguida, feche a janela do editor de textos, o que faz com que volte à janela de comandos do MATLAB. Na janela de comandos, use o comando cd para ir ao diretório onde o programa prog1.m foi salvo. Em seguida, digite : ((prog1 ( O gráfico mostrado na figura 5 é obtido. Figura 4. Procedimento para começar um novo M-file Funções M-files : Por causa da grande utilidade dos M-files, o MATLAB possui diversas funções que tornam os M-files ainda mais interessantes. Estas funções estão listadas na tabela 8 : Tabela 8 : Funções M-files echo input pause pause(n) disp(ans) waitforbottonpress keyboard Ecoa cada um dos comandos do M-file na janela de comandos. Permite entrada de dados durante a execução do programa via teclado. Faz uma pausa na execução do programa até que uma tecla qualquer seja pressionada. Faz uma pausa de n segundos na execução do programa Visualiza os resultados sem mostrar os nomes das variáveis Faz uma pausa até que uma tecla do “mouse” ou do teclado seja pressionada. Passa o controle temporariamente para o teclado (“Type return to quit”) Como exemplo, escreva o seguinte programa (M-file) : % Exemplo de utilização da função M-file “input” %========================================= % Programa para traçar a curva : % % y=A.sin(x+phi), % % sendo que os valores de x [rad] ; A e phi [graus] devem ser % entrados via teclado durante a execução do programa % x=input(‘Entre com o vetor x [rad]> ’); A=input(‘Entre com o valor de A> ’); phi=input(‘Entre com o valor de phi [graus]> ’); % y=A*sin(x+2*pi*phi/360); plot(x,y,‘r’); grid on title(‘Exemplo de utilização da função “input”’) xlabel(‘x em rad/s’) ylabel(‘y=A.sin(x+phi)’) CONSTRUÇÃO DE VETORES Nas construções das funções implementadas até agora, utilizou-se da construção de vetores. Agora, mostrar-se-á algumas outras formas de manipular vetores no MATLAB. Na tabela 8, tem-se um resumo das diversas formas de se construir um vetor no MatLab. Tabela 9. Construção de Vetores x=[2 2*pi sqrt(2) 2-3j] Cria um vetor x contendo os elementos especificados x=primero : último Cria um vetor x começando com o valor primeiro, incrementando-se de 1(um) em 1(um) até atingir o valor último ou o valor mais próximo possível de último x=primeiro:incremento:último Cria um vetor x começando com o valor primeiro, incrementando-se do valor incremento até atingir o valor último ou o valor mais próximo possível de último x=linspace(primeiro, último, n) Cria um vetor x começando com o valor primeiro e terminado-se no valor último, contendo n elementos x=logspace(primeiro, último, n) Cria um vetor com os elementos espaçado logaritmicamente, começando-se com o valor 10primeiro e terminando-se no valor 10último, contendo n elementos Exemplos : i) Uso da construção de vetor : x=[2 2*pi sqrt(2) 2-3j] (( x=[8 6 8.10 5-6j] ( x= 8.0000 6.0000 8.1000 5.0000-6.0000i ii) Uso da construção de vetor : x=primero : último (( x=1:10.5 ( x= 1 2 3 4 5 6 7 8 9 10 iii) Uso da construção de vetor : x=primeiro:incremento:último (( x=1:0.5:10.5 ( x = Columns 1 through 7 1.000 1.5000 2.0000 2.5000 3.0000 3.5000 4.0000 Columns 8 through 14 4.5000 5.0000 5.5000 6.0000 6.5000 7.0000 7.5000 Columns 15 through 20 8.0000 8.5000 9.0000 9.5000 10.0000 10.5000 iv) Uso da construção de vetor : x=linspace(primeiro, último, n) (( x=linspace(1,10.5,5) ( x= 1.0000 3.3750 5.7500 8.1250 10.5000 v) Uso da construção de vetor : x=logspace(primeiro, último, n) (( x=logspace(0,2,5) ( x= 1.0000 3.1623 10.0000 31.6228 100.00 ENDEREÇAMENTO DE VETORES Seja : (( x=linspace(0,360,10) ( x= 0 40 80 120 160 200 240 280 320 360 (( y=sin(2*pi*x/360) ( y= Columns 1 through 7 0 0.6428 0.9848 0.8660 0.3420 -0.3420 -0.8660 Columns 1 through 10 -0.9848 -0.6428 0.0000 No exemplo acima, os vetores de entrada x e de saída y possuem 11 elementos cada um. No MatLab, cada um dos elementos de um vetor podem ser acessados através de seu índice que identifica cada uma das colunas. Por exemplo : (( x(3) % Acessa o terceiro elemento de x ( ans = 80 (( x(5) % Acessa o quinto elemento de x ( ans = 160 O MatLab também permite o acesso em blocos dos elementos de um vetor, como ilustrado nos exemplos a seguir : (( x(1:5) ( ans = 0 40 80 120 160 Neste exemplo, a expressão entre parêntesis “ 1:5 ” , diz para acessar os elementos de 1 a 5 do vetor x. (( x(2:2:8) ( ans = 40 120 200 280 A expressão entre parêntesis no comando acima, “ 2:2:8” , diz para que acesse os elementos do vetor x, começando-se do 2o. elemento e, a partir deste, contando-se de 2 em 2 até atingir o 8o. elemento. (( x(2:2:7) ( ans = 40 120 200 Este exemplo é igual ao anterior, mas como depois do 6o. elemento vem o 8o. elemento (pois a contagem é feita de 2 em 2), o 7o. elemento não é acessado. (( y(10:-2:1) ( ans = 0.0000 -0.9848 -0.3420 0.8660 0.6428 A expressão entre parêntesis no comando, “ 10:-2:1” , diz para que acesse os elementos do vetor y, começando-se do 10o. elemento e, a partir deste, contando-se de 2 em 2 no sentido decrescente até atingir o 1o. elemento. (( y([8 5 10 1]) ( ans = -0.9848 0.3420 0.0000 0 Os elementos do vetor y são acessados na ordem indicada pelo vetor de índices [8 5 10 1], isto é : y(8), y(5), y(10) e y(1). Controles de Fluxo no MatLab Loops for Os loops for permitem que um conjunto de comandos seja repetido por um número de vezes fixo e pré-definido. A forma geral do loop for é : Exemplo 1 : O vetor x=[0 36 72 108 144 180 216 252 288 324] pode ser construído com as seguintes instruções : (( x(1)=0; ( (( for n=2:10 ( x(n)=x(n-1)+36; ( end ( (( x ( x = 0 36 72 108 144 180 216 252 288 324 Isto é, a primeira instrução diz : para n igual a 2 até 10, execute todas os comandos até a instrução de end. No primeiro ciclo do for, n=2, no segundo n=3 a assim por diante, até n=10. Depois do ciclo para n=10, o loop for termina e os comandos após a instrução end são executados, como é o caso da apresentação dos resultados em x. Exemplo 2 : Plote 360 pontos de um período da função y=sen(2*(*x/360) mostrado na figura 1 usando o loop for. ((for x=1:360 ( y(x)=sin(2*pi*x/360); ( end ( ((plot(y) ( Loops while Ao contrário do loop for, que executa um conjunto de comandos um número fixo de vezes, o loop while executa um conjunto de comandos um número indefinido de vezes. A forma geral do loop while é : Os comandos entre as instruções while e end são executadas enquanto todos os elementos na expressão forem verdadeiras. Exemplo : Construa o vetor y = [64 32 16 4 2 1] , usando o loop while ((eps=128; ( ((n=0; ( ((while eps>1 ( eps=eps/2; ( n=n+1; ( y(n)=eps; ( end ( ((y ( Estruturas if-else-end Em diversas situações, as seqüências de comandos tem de ser executadas condicionalmente, com base em um teste relacional. Isto pode ser resolvido por meio de alguma variação da estrutura if-else-end. A estrutura if-else-end mais simples é : Os comandos entre as instruções if e end são executados se todos os elementos na expressão forem Verdadeiros (diferentes de zero). Exemplo 1 : » custo=5; » bananas=10; » if bananas>5 custo=0.1*custo; end » custo custo = 0.5000 No exemplo acima, a expressão bananas > 5 é verdadeira, assim o comando : custo=0.1* custo foi executado, de modo que o novo valor de custo é igual a 0.5. Exemplo 2 : custo=5; » bananas=5; » if bananas>5 custo=0.1*custo; end » custo custo = 5 Neste exemplo, a expressão bananas > 5 é falsa, assim o comando : custo=0.1* custo não foi executado. Assim o custo continua igual a 5. Exemplo 3 : Plote a função retangular da figura 3 utilizando-se a estrutura if-else-end. % x=linspace(0,2*pi,100); % Criou-se 100 amostras entre 0 e 2*pi % for n=1:100 if x(n)<=pi f(n)=1; %Faz f(t)=1 para 0<t<=pi,i.e., %as primeiras 50 amostras de %f(t) são iguais a 1 else f(n)= -1; % Faz f(t)=-1 para pi<t<=2*pi, % i.e., as últimas 50 amostras de % f(t) são iguais a 1 end end plot(x,f, 'ko'); grid on title('Figura II.3: Função retangular') xlabel('t em radianos') ylabel('f(t)') MATRIZES Os vetores vistos até agora tratam-se de vetores linha, pois, possuem apenas 1(uma) linha com várias colunas. Também pode-se obter vetores coluna, isto é, vetores com apenas 1(uma) coluna e várias linhas : (( c=[1; 5; 6; 8; 10] ( c = 1 5 6 8 10 Se um vetor passa a consistir de várias linhas e colunas, denominamo-lo de Matrizes : (( m=[1 4 5 6; 5 10 3 20] % Este comando cria uma matriz 2(4 ( m= 1 4 5 6 5 10 3 20 Portanto, um vetor linha é um caso particular de uma matriz 1( N , e um vetor coluna é um caso particular de matriz N ( 1. Operações Escalares com Matrizes no MatLab Uma operação de adição, subtração, multiplicação e divisão de uma matriz com um valor escalar, é obtida simplesmente aplicado-se a respectiva operação em cada um dos elementos da matriz : (( m=[1 4 5 6; 5 10 3 20] % Matriz 2(4 ( m= 1 4 5 6 5 10 3 20 (( m-2 ( ans= -1 2 3 4 3 8 1 18 No exemplo acima, de cada elemento da matriz m subtraiu-se o valor 2. Outro exemplo : (( 2*m-2 ( ans= 0 6 8 10 8 18 4 38 Cada elemento da matriz foi multiplicado por 2 e, posteriormente, subtraiu-se 2. y=(1:5)*0 % Cria um vetor linha com todos os elementos iguais a 0(zero) ( y= 0 0 0 0 0 Operações entre Matrizes no MatLab As operações entre matrizes requer que as mesmas tenham as mesmas dimensões, e as operações de adição, subtração, multiplicação e divisão são aplicados elemento-por- elemento : (( g=[1 2 3 4; 5 6 7 8; 9 10 11 12] % g é uma matriz 3(4 ( g= 1 2 3 4 5 6 7 8 9 10 11 12 (( h=[1 1 1 1; 2 2 2 2; 3 3 3 3] % h é uma outra matriz 3(4 ( h= 1 1 1 1 2 2 2 2 3 3 3 3 (( g+h % adiciona a matriz g com a matriz h ( ans = 2 3 4 5 7 8 9 10 12 13 14 15 (( 2*g-h % Multiplica a matriz g por 2 e subtrai a matriz h do resultado ( ans= 1 3 5 7 8 10 12 14 15 17 19 21 (( g.*h % Multiplica a matriz g pela matriz matriz h elemento por elemento ( ans= 1 2 3 4 10 12 14 16 27 30 33 36 (( g./h % Divide a matriz g pela matriz matriz h elemento por elemento ( ans= 1.0000 2.0000 3.0000 4.0000 2.5000 3.0000 3.5000 4.0000 3.0000 3.3333 3.6667 4.0000 (( g % Chama a matriz g novamente ( g = 1 2 3 4 5 6 7 8 9 10 11 12 (( w=[1 2; 3 4; 5 6; 7 8] % Cria uma matriz 4(2 ( w= 1 2 3 4 5 6 7 8 (( g*w % Multiplicação da matriz g pela matriz w ( ans = 50 60 114 140 178 220 Observe que a operação g.*h é diferente da operação g*h. Enquanto que a primeira executa uma mutiplicação elemento-por-elemento de duas matrizes, a segunda executa uma multiplicação entre duas matrizes. Manipulação de Gráficos Nesta secção mostrar-se-ão alguns comandos úteis para manipulação de gráficos. Pode-se adicionar curvas a um gráfico já plotado usando o comando hold. % Exemplo de utilização do comando hold %========================================= % Geração da curva sin(x) : % % x=linspace(0,2*pi,30); y= sin(x); plot(x,y,‘r’); grid on title(‘Exemplo de utilização do comando hold’) xlabel(‘x em rad/s’) ylabel(‘y=sin(x)’) %Agora mantém-se acurva e acrescenta-se a curva do cosseno z= cos(x); hold on plot(x,z,’g’); ylabel(‘y1=sin(x); y2=cos(x)’) hold off O resultado é apresentado na figura 6. Figura 6: Exemplo do comando hold. Pode-se utilizar o comando subplot(m,n,p) para subdividir a janela de figura em uma matriz m-por-n de áreas de plotagem e escolher a p-ésima área para ser ativa. O exemplo seguinte ilustra a utilização deste comando. % Exemplo de utilização do comando subplot(m,n,p) %========================================= % Geração das curvas % x=linspace(0,2*pi,30); y= sin(x); z=cos(x); a=2*sin(x).*cos(x); b=sin(x)./(cos(x)+eps); %o eps é uma variável especial do MatLab utilizada para %se evitar divisão por zero subplot(2,2,1); %ativa o subplot à esquerda superior dentre os 4 subplots plot(x,y); grid on title(‘sin(x)’) ylabel(‘y=sin(x)’) % subplot(2,2,2); %ativa o subplot à direita superior dentre os 4 subplots plot(x,z); grid on title(‘cos(x)’) ylabel(‘y=cos(x)’) % subplot(2,2,3); %ativa o subplot à esquerda inferior dentre os 4 subplots plot(x,a); grid on title(‘2sin(x)cos(x)’) xlabel(‘x em rad/s’) ylabel(‘y=2*cos(x)*sin(x)’) % subplot(2,2,4); %ativa o subplot à direita inferior dentre os 4 subplots plot(x,b); grid on title(‘sin(x)/cos(x)’) xlabel(‘x em rad/s’) ylabel(‘y=sin(x)/cos(x)’) O resultado é apresentado na figura 7. Figura 7: Utilização do comando subplot. O uso do comando subplot(1,1,1) retorna ao modo default de utilização da janela de figura. Duas outras formas úteis de se construir gráficos são utilizando-se os comandos hist e stem. O Comando hist(y) desenha um histograma com 10 bins para os dados de um vetor y. hist(y,n) cria um histograma com n bins. hist(y,x), onde x é um vetor cria um histograma usando os bins especificados no vetor x. O exemplo seguinte ilustra o uso do hist. % Exemplo de gráficos usando hist %========================================= x=-2.9:0.2:2.9; %gera um vetor com os bins a serem usados em um dos gráficos y= randn(5000,1); %gera 5000 números aleatórios subplot(3,1,1); hist(y); %gera um histograma com 10 bins title(‘Histograma com 10 bins’) subplot(3,1,2); hist(y,20); %gera um histograma com 20 bins title(‘Histograma com 20 bins’) subplot(3,1,3); hist(y,x) %gera um histograma com os bins dados por x title(‘Histograma com bins dados por x’) O resultado é dado pela figura 8. Figura 8: Exemplo de Histogramas. Para a representação de seqüências discretas, é útil a plotagem de gráficos com stem. stem(y) plota os dados do vetor y. stem(x,y) plota os valores do vetor y dados por x. O exemplo seguinte ilustra o uso do stem. % Exemplo de gráficos usando stem %========================================= x=1:50; %gera um vetor com os pontos do vetor y y= randn(50,1); %gera 50 números aleatórios subplot(1,2,1); stem(y); %gera um gráfico com os 50 pontos do vetor y title(‘stem(y)’) subplot(1,2,2); stem(x,y,’:‘); %gera um gráficos com os pontos do vetor y dados por x title(‘stem(x,y)’) O resultado é dado pela figura 9. Figura 9: Exemplo de construção de gráficos com stem. Estilo de Linhas e Cores: Nos exemplos anteriores, utilizamos diferentes estilos de linhas e cores. Os estilos de linhas e as cores podem ser especificados nos comandos de plotagem como um argumento do tipo caracter string (entre apóstrofes – por exemplo, ´c´), consistindo de 1,2 ou 3 caracteres. A tabela 11 apresenta estes caracteres. Tabela 11: Estilos de linhas e cores � EXEMPLOS DE APLICAÇÃO DE VETORES NA VISUALIZAÇÃO DE SINAIS REPRESENTADOS NO DOMÍNIO DO TEMPO Exemplo 1 : Escreva um M-file que visualize o sinal f(t) representada no domínio do tempo por : � Resolução : Na seção I.3.6, esta mesma função foi visualizada através da utilização da função sign(x). Neste exemplo, será utilizado somente o conceito de vetores : % x=linspace(0,2*pi,100) % Criou-se 100 amostras entre 0 e 2*pi % f=(1:50)*0+1 % Faz f(t) = 1 para 0 < t <= pi , i.e., as % primeiras 50 amostras de f(t) são % iguais a 0 f(51:100)=(1:50)*0 - 1 % Faz f(t) = -1 para pi < t <=2*pi, i.e., as % últimas 50 amostras de f(t) são % iguais a 1 plot(x,f, ‘ko’); grid on title(‘Figura II.3: Função retangular’) xlabel(‘t em radianos’) ylabel(‘f(t)’) Obter-se-á o resultado mostrado na figura II.3 Exemplo 2 : Escreva um M-file que visualize o sinal f(t) representada no domínio do tempo por : � Resolução : % t=linspace(0,5,51); % Cria 51 amostras entre 0 e 5 % espaçados de 0.1 f(1:11)=t(1:11); % f(t) = t para 0<t<=1 f(12:31)=-t(12:31)/2 + 3/2; % f(t)=-t/2 + 3/2 para 1<t<=3 f(32:51)=(32:51)*0; f(t)=0 para t>3 % plot(t,f, ‘ko’); grid on title(‘Figura II.4 : Função Triangular’) xlabel (‘Tempo’) ylabel(‘f(t)’) Exercício : Faça as modificações necessárias no M-file do exemplo 2 de modo a visualizar 101 amostras da função f(t) no intervalo de 0 a 5. APOSTILA MATLAB Figura 1 - Plotagem de um seno Figura 2 – Função –sign(t), no intervalo -( ( t ( (. Figura 3 - Função retangular deslocada Figura 5 - Senos deslocados Figura 2.3 - Função retangular Figura 2.4 - Função triangular for x=n1:n2 comandos end while expressão Comandos end if expressão Comandos end �PAGE � �PAGE �1� _919524579.unknown _989842294.unknown _1014028127.xls Plan1 Operador Descrição < Menor que <= Menor ou igual a > Maior que >= Maior ou igual a == Igual a ~= Diferente de _1014029287.xls Plan1 Símbolo Cor Símbolo Estilo de Linha y amarelo . pontos m magenta o círculos c cian x marcas x r vermelho + marcas mais g verde * marcas asterístico b azul - linha sólida w branco : linha pontilhada k preto -. linha com traço e ponto -- linha com segmentos de traço _919540104.unknown _919583060.unknown _848611944.unknown _891634139.unknown _848611943.unknown C�lculo Num�rico/Programas do Primeiro Est�gio-2000.zip Text4.FOR C ESTE PROGRAMA CALCULA A SOMA DA SERIE C S= SOMATORIO(DE 1 ATE 30)DE 1/(2**I) C COM ERRO E SEM ERRO C REAL SOMA,EPS REAL*8 SOMAP,EPSP OPEN(UNIT=6,FILE='DADO4.TXT',STATUS='NEW') SOMA=0 I=0 10 EPS=1.00/(2.00**(I+1)) IF (I.NE.29)THEN I=I+1 SOMA=EPS+SOMA GOTO 10 ELSE WRITE(6,20)SOMA,I 20 FORMAT(/,2X,'O SOMA DA SERIE COM PRECISAO SIMPLES E ',E22.17, *' NA ',I3,' ITERACAO') END IF SOMAP=0 I=0 30 EPSP=1.00/(2.00**(I+1)) IF (I.NE.29)THEN I=I+1 SOMAP=EPSP+SOMAP GOTO 30 ELSE WRITE(6,40)SOMAP,I 40 FORMAT(/,2X,'O SOMA DA SERIE COM PRECISAO DUPLA E ',D22.17, *' NA ',I3,' ITERACAO') END IF END C QUESTAO4-A)=PARA A PRECISAO SIMPLES, NAO E NECESSARIO O CALCULO C DA SOMA ATE TRIGESIMO TERMO POIS O PROGRAMA JA TRUNCA O VALOR C DA SOMA PARA 1.0000000 NA OITAVA CASA DECIMAL E NA VIGESIMA C QUINTA ITERACAO.PARA A PRECISAO DUPLA, O SOMATORIO ATE O TRIGE- C TERMO E SIGUINIFICATIVO,MAS ISSO FICA A CARGO DO PROGRAMADOR C DETERMINAR COM QUAL PRECISAO O PROGRAMA DEVE OBTER OS DADOS. C E NECESSARIO DETERMINAR QUAL O TIPO DE PRECISAO E C PARA QUAL VALOR DE I O TERMO DO SOMATORIO E IGUAL AO EPS, NO C CASO DA MAQUINA USADA, O I= 52 C QUESTAO4-B)=BASTA USARMOS A PRECISAO DUPLA Serie.for C ESTE PROGRAMA REALIZA UMA SOMA DA SERIE C 4-4/3+4/5-4/7+4/9......, ATE ENCONTRAR C UM VALOR MENOR QUE 0.00001. C DIMENSION TERMO(200000) OPEN(UNIT=6,FILE='DADO3.TXT',STATUS='REPLACE') J=1 N=0 SOMA=0 C C ARMAZENAMENTO DA VARIAVEL INDEXADA 10 TERMO(J)=((-1)**N)*4/(2*N+1.0) IF (ABS(TERMO(J)).GE.0.00001) THEN SOMA=SOMA+TERMO(J) N=N+1 J=J+1 GOTO 10 ELSE C C SOMA OS TERMOS PELA DIREITA WRITE(6,15) WRITE(6,20)N,SOMA 15 FORMAT(/,2X,'O PROGRAMA ENCONTROU UM VALOR MENOR QUE 0.00001 NA') 20 FORMAT(2X,I6,' ITERACAO E A SOMA DA ESQUERDA DA SERIE E ',F10.7) END IF I=0 SOMA=0 C SOMA OS TERMOS PELA ESQUERDA 30 IF (ABS(TERMO(J)).GE.4.0) THEN WRITE(6,35) WRITE(6,40)I,SOMA 35 FORMAT(/,2X,'O PROGRAMA ENCONTROU UM VALOR MENOR QUE 0.00001 NA') 40 FORMAT(2X,I6,' ITERACAO E A SOMA DA DIREITA DA SERIE E ',F10.7) GOTO=45 ELSE J=J-1 I=I+1 SOMA=SOMA+TERMO(J) GOTO 30 45 END IF C C CALCULO DA SOMA DOS TERMOS POSITIVOS E NEGATIVOS ISOLADAMENTE I=0 SOMAP=0.0 SOMAN=0.0 SOMA=0.0 DO 46 J=1,200000,2 SOMAP=SOMAP+TERMO(J) 46 CONTINUE DO 50 N=2,200000,2 SOMAN=SOMAN+TERMO(N) I=I+1 50 CONTINUE C C CALCULO DA SOMA DA SERIE SOMA=SOMAP+SOMAN WRITE(6,55) WRITE(6,60)I,SOMA 55 FORMAT(/,2X,'O PROGRAMA ENCONTROU UM VALOR MENOR QUE 0.00001 NA') 60 FORMAT(2X,I6,' ITERACAO E A SOMA DA DIREITA DA SERIE E ',F10.7) END principal.for C ESTE PROGRAMA CALCULA AS RAIZES DE UMA FUNCAO PELOS METODOS C NUMERICOS ESTUDADOS. C C LEITURA DE DADOS OPEN(UNIT=7,FILE='DADOS.TXT',STATUS='REPLACE') 1 WRITE(6,2) WRITE(6,3) 2 FORMAT(2x,'M E O LIMITE DE ITERACOES COM') 3 FORMAT(2X,'TRES ESPACOS DE MEMORIA, ALOCADOS ') READ(*,10)M 10 FORMAT(I3)!O FORMATO(2I3) ALOCA TRES ESPASOS PARA DOIS NUMEROS WRITE(6,11) 11 FORMAT(2X,'E NECESSARIO SABER AS CODICOES DE EXISTENCIA DA ',/, *2X,'FUNCAO DESEJADA PARA DETERMINAR A E B, ONDE A>B') READ(*,20)A,B C=A D=B 20 FORMAT(2f6.2) WRITE(6,22)M,A,B 22 FORMAT(/,2x,'M=',2x,I3,2x,'A=',f6.2,2x,'B=',f6.2) WRITE(6,23) 23 FORMAT(2X,'ESCOLHA A EQUACAO E A PRECISAO DE PARADA:',/, *2X,'F(X)=4.0*COS(X)-EXP(2X) COM 10E-04 DE P. DIGITE 1',/, *2X,'F(X)=4.0*COS(X)-EXP(2X) COM 10E-06 DE P. DIGITE 2',/, *2X,'F(X)=1-X*LN(X) PARA X>0 COM 10E-04 DE P. DIGITE 3',/, *2X,'F(X)=1-X*LN(X) PARA X>0 COM 10E-04 DE P. DIGITE 4',/, *2X,'F(X)=SQRT(X)-5.0*EXP(-X) PARA X>=0 COM 10E-04 DE P. DIGITE 5', */,2X, *'F(X)=SQRT(X)-5.0*EXP(-X) PARA X>=0 COM 10E-04 DE P. DIGITE 6') READ(*,24)I 24 FORMAT(I1) IF(I.EQ.1)THEN EPSOL1=0.1000000E-03 EPSOL2=EPSOL1 WRITE(7,26)EPSOL1,EPSOL2 26 FORMAT(\,2x,'PRECISAO DE PARADA',2e18.8) CALL BISSEC(M,A,B,EPSOL1,EPSOL2) A=C B=D X0=0.6 CALL NEWTON(M,X0,EPSOL1,EPSOL2) CALL CORDAS(M,A,B,EPSOL1,EPSOL2) A=C B=D END IF IF((I.EQ.2).OR.(I.EQ.4))THEN EPSOL1=0.1000000E-05 EPSOL2=EPSOL1 WRITE(7,27)EPSOL1,EPSOL2 27 FORMAT(\,2x,'PRECISAO DE PARADA',2e18.8) IF(I.EQ.2)THEN CALL BISSEC(M,A,B,EPSOL1,EPSOL2) A=C B=D X0=0.6 CALL NEWTON(M,X0,EPSOL1,EPSOL2) CALL CORDAS(M,A,B,EPSOL1,EPSOL2) A=C B=D ELSE CALL BISSEC1(M,A,B,EPSOL1,EPSOL2) A=C B=D X0=0.6 CALL NEWTON1(M,X0,EPSOL1,EPSOL2) CALL CORDAS1(M,A,B,EPSOL1,EPSOL2) A=C B=D END IF END IF IF(I.EQ.3)THEN EPSOL1=0.1000000E-02 EPSOL2=EPSOL1 WRITE(7,28)EPSOL1,EPSOL2 28 FORMAT(\,2x,'PRECISAO DE PARADA',2e18.8) CALL BISSEC1(M,A,B,EPSOL1,EPSOL2) A=C B=D X0=0.6 CALL NEWTON1(M,X0,EPSOL1,EPSOL2) CALL CORDAS1(M,A,B,EPSOL1,EPSOL2) A=C B=D END IF IF(I.EQ.5)THEN EPSOL1=0.1000000E-04 EPSOL2=EPSOL1 WRITE(7,29)EPSOL1,EPSOL2 29 FORMAT(\,2x,'PRECISAO DE PARADA',2e18.8) CALL BISSEC2(M,A,B,EPSOL1,EPSOL2) A=C B=D X0=0.6 CALL NEWTON2(M,X0,EPSOL1,EPSOL2) CALL CORDAS2(M,A,B,EPSOL1,EPSOL2) A=C B=D END IF IF(I.EQ.6)THEN EPSOL1=0.1000000E-07 EPSOL2=EPSOL1 WRITE(7,30)EPSOL1,EPSOL2 30 FORMAT(\,2x,'PRECISAO DE PARADA',2e18.8) CALL BISSEC2(M,A,B,EPSOL1,EPSOL2) A=C B=D X0=0.6 CALL NEWTON2(M,X0,EPSOL1,EPSOL2) CALL CORDAS2(M,A,B,EPSOL1,EPSOL2) A=C B=D END IF STOP END C C SUBROTINA BISSECAO C SUBROUTINE BISSEC(M,A,B,EPSOL1,EPSOL2) REAL FA,FB C C K É UM CONTADOR DE ITERACOES C WRITE(7,7) 7 FORMAT(/,26X,'F(X)=4.0*COS(X)-EXP(2.0*X)',//,26X, *'METODO DA BISSECAO') K=0 FA=4*COS(A)-EXP(2.0*A) FB=4*COS(B)-EXP(2.0*B) C C CALCULA O POMTO MEDIO DO INTERVALO C 10 X=(A+B)/2.0 FX=4.0*COS(X)-EXP(2.0*X) C C ELIMINACAO DE PARTE DO INTERVALO C PROD=FX*FA IF (PROD.GT.0) THEN A=X FA=FX ELSE B=X FB=FX END IF C C TESTE DE PARADA C IF (ABS(A-B).LE.EPSOL1) THEN IF (ABS(FA-FB).LE.EPSOL2) THEN GOTO 20 ELSE K=K+1 END IF ELSE K=K+1 END IF IF (K.GT.M) THEN GOTO 35 ELSE GOTO 10 END IF 20 WRITE(7,25)A,FA,K 25 FORMAT(/2X,'A RAIZ DA FUNCAO E=',2X,E14.9,/, *2X,'O VALOR DA FUNCAO E=',2X,E14.9,/, *2X,'O NUMERO DE INTERACOE E=',2X,I4) GOTO 60 35 WRITE(7,40)K 40 FORMAT(/,2X,'NAO COVERGIU EMK=',2X,I4,2X,'ITERACOES') WRITE(7,50) A,B,FA 50 FORMAT(/,2X,'A,B=',2X,2E20.9,2X,'FX=',2X,E20.9) 60 RETURN END C C SUBROUTINA NEWTON C SUBROUTINE NEWTON(M,X0,EPSOL1,EPSOL2) WRITE(7,5) 5 FORMAT(/,26X,'METODO DE NEWTON') K=0 10 XK=X0 C C X0 SATISFAZ A CONDICAO DE CONVERGENCIA C FXK=4.0*COS(XK)-EXP(2.0*XK) DFXK=-4.0*SIN(XK)-2*EXP(2.0*XK) C C CALCULA UM NOVO NUMERO PARA X0 C X0=XK-(FXK/DFXK) FX0=4.0*COS(X0)-EXP(2.0*X0) C C TESTE DE PARADA C IF(ABS(X0-XK).LE.EPSOL1)THEN IF(ABS(FX0).LE.EPSOL2)THEN GOTO 20 ELSE K=K+1 END IF ELSE K=K+1 END IF IF(K.GT.M)THEN GOTO 30 ELSE GOTO 10 END IF 20 WRITE(7,25)X0,FX0,K 25 FORMAT(/,2X,'A RAIZ APROXIMADA DA FUNCAO E=',2X,E18.8, */,2X,'O VALOR DA FUNCAO E=',2X,E18.8,/,2X, *'O NUMERO DE ITERACOES E=',2X,I4) GOTO 50 30 WRITE(7,35)K 35 FORMAT(/,2X,'NAO CONVERGIU EM K=',2X,I4,2X,'ITERACOES') WRITE(7,40)X0,FX0 40 FORMAT(/,2X,'XK1=',2X,E20.9,2X,'FXK1=',2X,E20.9) 50 RETURN END C C SUBROUTINA CORDAS C SUBROUTINE CORDAS(M,A,B,EPSOL1,EPSOL2) WRITE(7,5) 5 FORMAT(/,26X,'METODO DAS CORDAS') K=0 FA=4.0*COS(A)-EXP(2.0*A) FB=4.0*COS(B)-EXP(2.0*B) C C GERAR OS PONTOS QUE DEVEM COVERGIR PARA A RAIZ C 10 XK1=A-((A-B)/(FA-FB))*FA C C CALCULA O VALOR DA FUNCAO EM XK C FXK1=4.0*COS(XK1)-EXP(2.0*XK1) C C ELIMINACAO DA PARTE DO INTERVALO C PROD=FA*FXK1 IF(PROD.GT.0)THEN XK=A A=XK1 FA=FXK1 ELSE XK=B B=XK1 FB=FXK1 END IF C C TESTE DE PARADA C IF(ABS(XK1-XK).LE.EPSOL1)THEN IF(ABS(FXK1).LE.EPSOL2)THEN GOTO 20 ELSE K=K+1 END IF ELSE K=K+1 END IF IF(K.GT.M)THEN GOTO 30 ELSE GOTO 10 END IF 20 WRITE(7,25)XK1,FXK1,K 25 FORMAT(/,2X,'A RAIZ DA FUNCAO E=',2X,E18.8,/,2X, *'O VALOR DA FUNCAO E=',2X,E18.8,/,2X, *'O NUMERO DE ITERACOE E=',2X,I4) GOTO 50 30 WRITE(7,35)K 35 FORMAT(/,2X,'NAO CONVERGIU EM K=',2X,I4,2X,'ITERACOES') WRITE(7,40)XK1,FXK1 40 FORMAT(/,2X,'XK1=',2X,E20.9,2X,'FXK1=',2X,E20.9) 50 RETURN END C C SUBROTINA BISSECAO1 C SUBROUTINE BISSEC1(M,A,B,EPSOL1,EPSOL2) REAL FA,FB C C K É UM CONTADOR DE ITERACOES C WRITE(7,7) 7 FORMAT(/,26X,'F(X)=1-X*LN(X)',//,26X, *'METODO DA BISSECAO') K=0 FA=1-A*LOG(A) FB=1-A*LOG(B) C C CALCULA O POMTO MEDIO DO INTERVALO C 10 X=(A+B)/2.0 FX=1-X*LOG(X) C C ELIMINACAO DE PARTE DO INTERVALO C PROD=FX*FA IF (PROD.GT.0) THEN A=X FA=FX ELSE B=X FB=FX END IF C C TESTE DE PARADA C IF (ABS(A-B).LE.EPSOL1) THEN IF (ABS(FA-FB).LE.EPSOL2) THEN GOTO 20 ELSE K=K+1 END IF ELSE K=K+1 END IF IF (K.GT.M) THEN GOTO 35 ELSE GOTO 10 END IF 20 WRITE(7,25)A,FA,K 25 FORMAT(/2X,'A RAIZ DA FUNCAO E=',2X,E14.9,/, *2X,'O VALOR DA FUNCAO E=',2X,E14.9,/, *2X,'O NUMERO DE INTERACOE E=',2X,I4) GOTO 60 35 WRITE(7,40)K 40 FORMAT(/,2X,'NAO COVERGIU EMK=',2X,I4,2X,'ITERACOES') WRITE(7,50) A,B,FA 50 FORMAT(/,2X,'A,B=',2X,2E20.9,2X,'FX=',2X,E20.9) 60 RETURN END C C SUBROUTINA NEWTON1 C SUBROUTINE NEWTON1(M,X0,EPSOL1,EPSOL2) WRITE(7,5) 5 FORMAT(/,26X,'METODO DE NEWTON') K=0 10 XK=X0 C C X0 SATISFAZ A CONDICAO DE CONVERGENCIA C FXK=1-XK*LOG(XK) DFXK=-1-LOG(XK) C C CALCULA UM NOVO NUMERO PARA X0 C X0=XK-(FXK/DFXK) FX0=1-X0*LOG(X0) C C TESTE DE PARADA C IF(ABS(X0-XK).LE.EPSOL1)THEN IF(ABS(FX0).LE.EPSOL2)THEN GOTO 20 ELSE K=K+1 END IF ELSE K=K+1 END IF IF(K.GT.M)THEN GOTO 30 ELSE GOTO 10 END IF 20 WRITE(7,25)X0,FX0,K 25 FORMAT(/,2X,'A RAIZ APROXIMADA DA FUNCAO E=',2X,E18.8, */,2X,'O VALOR DA FUNCAO E=',2X,E18.8,/,2X, *'O NUMERO DE ITERACOES E=',2X,I4) GOTO 50 30 WRITE(7,35)K 35 FORMAT(/,2X,'NAO CONVERGIU EM K=',2X,I4,2X,'ITERACOES') WRITE(7,40)X0,FX0 40 FORMAT(/,2X,'XK1=',2X,E20.9,2X,'FXK1=',2X,E20.9) 50 RETURN END C C SUBROUTINA CORDAS1 C SUBROUTINE CORDAS1(M,A,B,EPSOL1,EPSOL2) WRITE(7,5) 5 FORMAT(/,26X,'METODO DAS CORDAS') K=0 FA=1-A*LOG(A) FB=1-B*LOG(B) C C GERAR OS PONTOS QUE DEVEM COVERGIR PARA A RAIZ C 10 XK1=A-((A-B)/(FA-FB))*FA C C CALCULA O VALOR DA FUNCAO EM XK C FXK1=1-XK1*LOG(XK1) C C ELIMINACAO DA PARTE DO INTERVALO C PROD=FA*FXK1 IF(PROD.GT.0)THEN XK=A A=XK1 FA=FXK1 ELSE XK=B B=XK1 FB=FXK1 END IF C C TESTE DE PARADA C IF(ABS(XK1-XK).LE.EPSOL1)THEN IF(ABS(FXK1).LE.EPSOL2)THEN GOTO 20 ELSE K=K+1 END IF ELSE K=K+1 END IF IF(K.GT.M)THEN GOTO 30 ELSE GOTO 10 END IF 20 WRITE(7,25)XK1,FXK1,K 25 FORMAT(/,2X,'A RAIZ DA FUNCAO E=',2X,E18.8,/,2X, *'O VALOR DA FUNCAO E=',2X,E18.8,/,2X, *'O NUMERO DE ITERACOE E=',2X,I4) GOTO 50 30 WRITE(7,35)K 35 FORMAT(/,2X,'NAO CONVERGIU EM K=',2X,I4,2X,'ITERACOES') WRITE(7,40)XK1,FXK1 40 FORMAT(/,2X,'XK1=',2X,E20.9,2X,'FXK1=',2X,E20.9) 50 RETURN END C C SUBROTINA BISSECAO2 C SUBROUTINE BISSEC2(M,A,B,EPSOL1,EPSOL2) REAL FA,FB C C K É UM CONTADOR DE ITERACOES C WRITE(7,7) 7 FORMAT(/,26X,'F(X)=SQRT(X)-5.0*EXP(-X)',//,26X, *'METODO DA BISSECAO') K=0 FA=SQRT(A)-5.0*EXP(-A) FB=SQRT(B)-5.0*EXP(-B) C C CALCULA O POMTO MEDIO DO INTERVALO C 10 X=(A+B)/2.0 FX=SQRT(X)-5.0*EXP(-X) C C ELIMINACAO DE PARTE DO INTERVALO C PROD=FX*FA IF (PROD.GT.0) THEN A=X FA=FX ELSE B=X FB=FX END IF C C TESTE DE PARADA C IF (ABS(A-B).LE.EPSOL1) THEN IF (ABS(FA-FB).LE.EPSOL2) THEN GOTO 20 ELSE K=K+1 END IF ELSE K=K+1 END IF IF (K.GT.M) THEN GOTO 35 ELSE GOTO 10 END IF 20 WRITE(7,25)A,FA,K 25 FORMAT(/2X,'A RAIZ DA FUNCAO E=',2X,E14.9,/, *2X,'O VALOR DA FUNCAO E=',2X,E14.9,/, *2X,'O NUMERO DE INTERACOE E=',2X,I4) GOTO 60 35 WRITE(7,40)K 40 FORMAT(/,2X,'NAO COVERGIU EMK=',2X,I4,2X,'ITERACOES') WRITE(7,50) A,B,FA 50 FORMAT(/,2X,'A,B=',2X,2E20.9,2X,'FX=',2X,E20.9) 60 RETURN END C C SUBROUTINA NEWTON2 C SUBROUTINE NEWTON2(M,X0,EPSOL1,EPSOL2) WRITE(7,5) 5 FORMAT(/ ,26X,'METODO DE NEWTON') K=0 10 XK=X0 C C X0 SATISFAZ A CONDICAO DE CONVERGENCIA C FXK=SQRT(XK)-5.0*EXP(-XK) DFXK=1/(2.0*SQRT(XK))+10*EXP(-XK) C C CALCULA UM NOVO NUMERO PARA X0 C X0=XK-(FXK/DFXK) FX0=SQRT(X0)-5.0*EXP(-X0) C C TESTE DE PARADA C IF(ABS(X0-XK).LE.EPSOL1)THEN IF(ABS(FX0).LE.EPSOL2)THEN GOTO 20 ELSE K=K+1 END IF ELSE K=K+1 END IF IF(K.GT.M)THEN GOTO 30 ELSE GOTO 10 END IF 20 WRITE(7,25)X0,FX0,K 25 FORMAT(/,2X,'A RAIZ APROXIMADA DA FUNCAO E=',2X,E18.8, */,2X,'O VALOR DA FUNCAO E=',2X,E18.8,/,2X, *'O NUMERO DE ITERACOES E=',2X,I4) GOTO 50 30 WRITE(7,35)K 35 FORMAT(/,2X,'NAO CONVERGIU EM K=',2X,I4,2X,'ITERACOES') WRITE(7,40)X0,FX0 40 FORMAT(/,2X,'XK1=',2X,E20.9,2X,'FXK1=',2X,E20.9) 50 RETURN END C C SUBROUTINA CORDAS2 C SUBROUTINE CORDAS2(M,A,B,EPSOL1,EPSOL2) WRITE(7,5) 5 FORMAT(/,26X,'METODO DAS CORDAS') K=0 FA=SQRT(A)-5.0*EXP(-A) FB=SQRT(B)-5.0*EXP(-B) C C GERAR OS PONTOS QUE DEVEM COVERGIR PARA A RAIZ C 10 XK1=A-((A-B)/(FA-FB))*FA C C CALCULA O VALOR DA FUNCAO EM XK C FXK1=SQRT(XK1)-5.0*EXP(-XK1) C C ELIMINACAO DA PARTE DO INTERVALO C PROD=FA*FXK1 IF(PROD.GT.0)THEN XK=A A=XK1 FA=FXK1 ELSE XK=B B=XK1 FB=FXK1 END IF C C TESTE DE PARADA C IF(ABS(XK1-XK).LE.EPSOL1)THEN IF(ABS(FXK1).LE.EPSOL2)THEN GOTO 20 ELSE K=K+1 END IF ELSE K=K+1 END IF IF(K.GT.M)THEN GOTO 30 ELSE GOTO 10 END IF 20 WRITE(7,25)XK1,FXK1,K 25 FORMAT(/,2X,'A RAIZ DA FUNCAO E=',2X,E18.8,/,2X, *'O VALOR DA FUNCAO E=',2X,E18.8,/,2X, *'O NUMERO DE ITERACOE E=',2X,I4) GOTO 50 30 WRITE(7,35)K 35 FORMAT(/,2X,'NAO CONVERGIU EM K=',2X,I4,2X,'ITERACOES') WRITE(7,40)XK1,FXK1 40 FORMAT(/,2X,'XK1=',2X,E20.9,2X,'FXK1=',2X,E20.9) 50 RETURN END PRINC6.TXT PRECISAO DE PARADA .10000000E-07 .10000000E-07 F(X)=SQRT(X)-5.0*EXP(-X) METODO DA BISSECAO NAO COVERGIU EMK= 1000 ITERACOES A,B= .143044500E+01 .143044500E+01 FX= -.225259500E-07 METODO DE NEWTON NAO CONVERGIU EM K= 1000 ITERACOES XK1= .143044500E+01 FXK1= -.129385700E-07 METODO DAS CORDAS NAO CONVERGIU EM K= 1000 ITERACOES XK1= .143044500E+01 FXK1= -.225259500E-07 PRINC5.TXT PRECISAO DE PARADA .10000000E-04 .10000000E-04 F(X)=SQRT(X)-5.0*EXP(-X) METODO DA BISSECAO A RAIZ DA FUNCAO E= .143044800E+01 O VALOR DA FUNCAO E= .478776600E-05 O NUMERO DE INTERACOE E= 20 METODO DE NEWTON A RAIZ APROXIMADA DA FUNCAO E= .14304390E+01 O VALOR DA FUNCAO E= -.93229490E-05 O NUMERO DE ITERACOES E= 14 METODO DAS CORDAS A RAIZ DA FUNCAO E= .14304490E+01 O VALOR DA FUNCAO E= .60931020E-05 O NUMERO DE ITERACOE E= 23 PRINC4.TXT PRECISAO DE PARADA .10000000E-05 .10000000E-05 F(X)=1-X*LN(X) METODO DA BISSECAO A RAIZ DA FUNCAO E= .176322300E+01 O VALOR DA FUNCAO E= .278934100E-06 O NUMERO DE INTERACOE E= 17 METODO DE NEWTON A RAIZ APROXIMADA DA FUNCAO E= .17632230E+01 O VALOR DA FUNCAO E= .11765750E-07 O NUMERO DE ITERACOES E= 5 METODO DAS CORDAS A RAIZ DA FUNCAO E= .17632230E+01 O VALOR DA FUNCAO E= .29709990E-07 O NUMERO DE ITERACOE E= 3 PRINC3.TXT PRECISAO DE PARADA .10000000E-02 .10000000E-02 F(X)=1-X*LN(X) METODO DA BISSECAO A RAIZ DA FUNCAO E= .176289100E+01 O VALOR DA FUNCAO E= .520476300E-03 O NUMERO DE INTERACOE E= 7 METODO DE NEWTON A RAIZ APROXIMADA DA FUNCAO E= .17632230E+01 O VALOR DA FUNCAO E= .11759100E-07 O NUMERO DE ITERACOES E= 4 METODO DAS CORDAS A RAIZ DA FUNCAO E= .17632200E+01 O VALOR DA FUNCAO E= .43695290E-05 O NUMERO DE ITERACOE E= 1 Lista2.for C ESTE PROGRAMA CALCULA A DERIVADA DA FUNCAO F(X)=EXP(X), C EM X=0, PARA DELTA DE X IGUAL A:0.1, 0.01,....., 10**(-10) C IMPLICIT REAL*8(F,D) K=1 !ONDE K E O CONTADOR DE ITERACOES X=0.0 OPEN(UNIT=6,FILE='DAD3.TXT',STATUS='NEW') WRITE(6,5)X 5 FORMAT(/,2X,'A DERIVADA E CALCULADA EM 'F5.3) 10 DELTA=10.0**(-K) FX=EXP(X) FXD=EXP(X+DELTA) DFX=(FXD-FX)/DELTA WRITE(6,20)K,DFX 20 FORMAT(2X,'A DERIVADA DE F(X) NA ',I3,' ITERACAO E ',F24.17) IF (K.NE.21)THEN K=K+1 GOTO 10 ELSE END IF END PRINC1.TXT PRECISAO DE PARADA .10000000E-03 .10000000E-03 F(X)=4.0*COS(X)-EXP(2.0*X) METODO DA BISSECAO A RAIZ DA FUNCAO E= .597882000E+00 O VALOR DA FUNCAO E= .356950500E-04 O NUMERO DE INTERACOE E= 13 METODO DE NEWTON A RAIZ APROXIMADA DA FUNCAO E= .59788610E+00 O VALOR DA FUNCAO E= -.12218020E-06 O NUMERO DE ITERACOES E= 1 METODO DAS CORDAS A RAIZ DA FUNCAO E= .59788610E+00 O VALOR DA FUNCAO E= -.13247760E-06 O NUMERO DE ITERACOE E= 3 LISTA4.TXT O SOMA DA SERIE COM PRECISAO SIMPLES E .10000000000000000E+01 NA 29 ITERACAO O SOMA DA SERIE COM PRECISAO DUPLA E .99999999813735490D+00 NA 29 ITERACAO LISTA3.TXT O PROGRAMA ENCONTROU UM VALOR MENOR QUE 0.00001 NA 200000 ITERACAO E A SOMA DA ESQUERDA DA SERIE E 3.1415910 O PROGRAMA ENCONTROU UM VALOR MENOR QUE 0.00001 NA 200000 ITERACAO E A SOMA DA DIREITA DA SERIE E 3.1415870 O PROGRAMA ENCONTROU UM VALOR MENOR QUE 0.00001 NA 100000 ITERACAO E A SOMA DA DIREITA DA SERIE E 3.1415870 LISTA2.TXT A DERIVADA E CALCULADA EM .000 A DERIVADA DE F(X) NA 1 ITERACAO E 1.05170918155311800 A DERIVADA DE F(X) NA 2 ITERACAO E 1.00501670877307300 A DERIVADA DE F(X) NA 3 ITERACAO E 1.00050016673203400 A DERIVADA DE F(X) NA 4 ITERACAO E 1.00005000167234000 A DERIVADA DE F(X) NA 5 ITERACAO E 1.00000500002183500 A DERIVADA DE F(X) NA 6 ITERACAO E 1.00000050004433800 A DERIVADA DE F(X) NA 7 ITERACAO E 1.00000005107025100 A DERIVADA DE F(X) NA 8 ITERACAO E 1.00000000000000000 A DERIVADA DE F(X) NA 9 ITERACAO E 1.00000000000000000 A DERIVADA DE F(X) NA 10 ITERACAO E .99999972244434390 A DERIVADA DE F(X) NA 11 ITERACAO E .99999973979156790 A DERIVADA DE F(X) NA 12 ITERACAO E 1.00008847085926000 A DERIVADA DE F(X) NA 13 ITERACAO E .99920033344624850 A DERIVADA DE F(X) NA 14 ITERACAO E .99920023188362580 A DERIVADA DE F(X) NA 15 ITERACAO E 1.11022255040029200 A DERIVADA DE F(X) NA 16 ITERACAO E .00000000000000000 A DERIVADA DE F(X) NA 17 ITERACAO E .00000000000000000 A DERIVADA DE F(X) NA 18 ITERACAO E .00000000000000000 A DERIVADA DE F(X) NA 19 ITERACAO E .00000000000000000 A DERIVADA DE F(X) NA 20 ITERACAO E .00000000000000000 A DERIVADA DE F(X) NA 21 ITERACAO E .00000000000000000 PRINC2.TXT PRECISAO DE PARADA .10000000E-05 .10000000E-05 F(X)=4.0*COS(X)-EXP(2.0*X) METODO DA BISSECAO A RAIZ DA FUNCAO E= .597886000E+00 O VALOR DA FUNCAO E= .364587200E-06 O NUMERO DE INTERACOE E= 20 METODO DE NEWTON A RAIZ APROXIMADA DA FUNCAO E= .59788610E+00 O VALOR DA FUNCAO E= -.12214430E-06 O NUMERO DE ITERACOES E= 2 METODO DAS CORDAS A RAIZ DA FUNCAO E= .59788610E+00 O VALOR DA FUNCAO E= -.13247760E-06 O NUMERO DE ITERACOE E= 3 C�lculo Num�rico/Ra�zes da Fun��o.zip zerofun.doc Raízes de funções Dada uma função f, dizemos que ( é uma raiz de f se f(()=0. Exemplos: 1- f(x)= x - 2 x-2 = 0 x = 2 é raíz de f(x) pois f(2)= 0 2- f(x) = x2 + 5x +6 (x+3) . (x+2)=0 x= -3 é raíz de f(x) pois f(-3)= (9) -15 +6 =0 x= -2 é raíz de f(x) pois f(-2)= (4) -10 +6 =0 3- f(x) = x3 +2x2 -3x x(x2 +2x -3x)=0 x = 0 é raíz de f(x) pois f(0)= 0 + 2*0 - 3*0 = 0 x2 +2x -3=0 (= 4 +12 (= 16 x= 2 ( 4 2 x= 1 é raíz de f(x) pois f(1)= 1 + 2*1 - 3*1 = 0 x= -3 é raíz de f(x) pois f(-3)= -27 + 2*9 - 3*3 = 0 Nos exemplos dados, foi possível encontrar de forma algébrica as raízes das funções. Porém nem sempre isto ocorre, como pode ser observado nos seguintes exemplos: 4- f(x)= x3 + 2x2 + x + 1 5- f(x)= sin(x) + cos(x) 6- f(x)= ex + x Temos ainda que nos certificar se, dada uma função f ela possuí raiz e quantas são. Por exemplo a função: f(x)= ex não possui raiz real. Graficamente uma função ter uma raiz em x0, significa que a curva que representa f intercepta o eixo x em x0. Do exemplo 1 temos: Seja uma função f qualquer, tal que a sua apresentação gráfica é dada por: Os pontos x1, x2, x3, x4, e x5 são as raízes de f no intervalo [-10, 7] Através do gráfico de f conseguimos determinar se f possui raízes e qual a região em x em que cada uma se localiza . Em seguida, podemos diminuir o tamanho deste intervalo, de tal forma a encontrar uma aproximação para o valor de xi. Devemos, no entanto, fazer isto de forma organizada e seguindo alguns critérios e métodos. � EXERCÍCIOS Faça os gráficos das seguintes funções nos intervalos determinados: 1- f(x)= x3 +2x2 + x +1 , [-2,1] Resposta 2- f(x)= sin(x) + cos(x) , [0,2(] Resposta 3- f(x)= ex + x , [-3,3] Resposta 4- f(x)= ex, [-1,2] Resposta Como em muitas equações não é possível encontrar as raízes de forma analítica, temos que usar métodos iterativos que consistem em: encontrar intervalos onde se localizam as raízes e, a partir deste intervalo inicial, refinar sucessivamente a aproximação para obtermos um valor estimado para esta raiz. 1- ISOLAMENTO DAS RAÍZES TEOREMA 1 - (TEOREMA DE BOLZANO) Seja f(x) uma função continua em um intervalo [a,b]. Se f(a) * f(b) <0 então existe pelo menos um valor x=xo entre a e b tal que f(xo)=0. Podemos visualizar graficamente este teorema: Como visto, o teorema 1 não identifica quantas raízes existem em um dado intervalo, porém se f’(x) existir e preservar o sinal em [a,b], então este intervalo contém uma raiz em [a,b]. Exemplo: f(x)= x3 + x - 1 x -3 -2 -1 0 1 2 3 sinal de f(x) - - - - + + + O intervalo [0,1] possui raízes de f(x) f’(x) = 3x2 + 1 f’(x) > 0 em todo intervalo [0,1], logo f(x) possui apenas uma raiz em [0,1]. No caso de f(a) * f(b) > 0, podemos ter vários casos: Se uma função f(x) é formada pela diferença de duas funções g(x) e h(x), podemos encontrar os intervalos onde se encontram as raízes, a partir dos gráficos de g(x) e h(x). Os valores de x tais que g(x) = h(x) são as raízes de f(x), pois: f(x) = g(x) - h(x) (1) Para x1: g(x1) = h(x1) (2) De 2 em 1: f(x1) = h(x1) - h(x1) f(x1) = 0 Este método é muito útil quando as funções g(x) e h(x) tiverem formas conhecidas. 2 - MÉTODOS DE REFINAMENTO 2.1- Método da dicotomia Seja f(x) uma função contínua em [a,b] e xr uma raiz de f neste intervalo. Dividimos o intervalo ao meio, obtendo dois subintervalos dados por: [a , (a+b)/2 ] e [(a+b)/2 , b] Em seguida verificamos em qual destes subintervalos está a raiz usando o teorema 1. Repetimos novamente o processo até que se obtermos a precisão desejada. Para cada intervalo [ ai , bi ] que contém xr, o respectivo ponto médio xi = (ai + bi)/2 é um valor aproximado de xr com erro delimitado por (i =| bi - ai | /2 , ou seja, metade do comprimento do intervalo. Podemos então escrever: xr = xi ( (i Exemplo: Estimar o valor da raiz de f(x) = x3 + 2x2 + x +1 no intervalo [-2,-1] com erro menor ou igual a 0,020. f(-2,000)= -1,000* Existe uma raiz neste intervalo f(-1,000)= 1,000* ( = ( 1,000 f(-2,000)= -1,000* Existe uma raiz neste intervalo pois f(-2,000)*f(-1,500) <0 f(-1,500)= 0,625* ( = ( 0,500 f(-1,000)= 1,000 f(-2,000)= -1,000* Existe uma raiz neste intervalo pois f(-2,000)*f(-1,750) <0 f(-1,750)= 0,016* ( = ( 0,250 f(-1,500)= 0,625 f(-2,000)= -1,000 f(-1,875)= -0,435* Existe uma raiz neste intervalo pois f(-1,875)*f(-1,750) <0 f(-1,750)= 0,016* ( = ( 0,125 f(-1,875)= -0,435 f(-1,812)= -0,195* Existe uma raiz neste intervalo pois f(-1,812)*f(-1,750) <0 f(-1,750)= 0,016* ( = ( 0,063 f(-1,812)= -0,195 f(-1,781)= -0,086* Existe uma raiz neste subintervalo pois f(-1,781)*f(-1,750) <0 f(-1,750)= 0,016* ( = ( 0,031 f(-1,781)= -0,086 f(-1,765)= -0,032* Existe uma raiz neste subintervalo pois f(-1,765)*f(-1,750) <0 f(-1,750)= 0,016* ( = ( 0,015 A estimativa da raíz é xr = -1,757 ( 0,015. EXERCÍCIOS A)- Estime os valores das raízes das seguintes funções, nos intervalos e erros determinados, usando o método da dicotomia. 1 - f(x) = sin(x) + cos(x) [1;3] ( < 0,020 2 - f(x) = ex +x [-1,5;0] ( < 0,020 3 - f(x) = ln x + x2 -2 [1;2] ( < 0,02 4 - f(x) = sin(x +1) + x [-3;3] ( < 0,03 5 - f(x) = - x3 /10 [1,3] ( < 0,03 B)- Estime os valores das raízes de: 1 - f(x) = x4 +2x3 - 5 2 - f(x) = ln(x2 +1) - x + 2 com erro ( < 0,020 C)- Quantas raízes tem a função f(x) = tg(x) - x2 ? D)- Qual o valor de com erro menor ou igual a 0,01 ? � RESPOSTAS A) - 1 f(1,000)= 1,382 f(2,000)= 0,4931* f(3,000)= -0,8489* f(2,000)*f(3,000) <0 ( = ( 0,500 f(2,000)= 0,4931* f(2,500)= -0,2027* f(2,000)*f(2,500) <0 ( = ( 0,250 f(3,000)= -0,8489 f(2,000)= 0,4931 f(2,250)= 0,1499* f(2,250)*f(2,500) <0 ( = ( 0,125 f(2,500)= -0,2027* f(2,250)= 0,1499* f(2,250)*f(2,375) <0 ( = ( 0,063 f(2,375)= -0,0266* f(2,500)= -0,2027 f(2,250)= 0,1499 f(2,313)= 0,0611* f(2,313)*f(2,375) <0 ( = ( 0,031 f(2,375)= -0,0266* f(2,313)= 0,0611 f(2,343)= 0,0172 ( = ( 0,016 f(2,375)= -0,0266 A estimativa da raíz é xr = 2,359 ( 0,016. 2) f(-1,500)= -1,277 f(-0,750)= -0,2776* f(-0,750)*f(0,000) <0 ( = ( 0,375 f(0,000) = 1,000* f(-0,750)= -0,2776* f(-0,750)*f(-0,375) <0 ( = ( 0,187 f(-0,375)= 0,3123* f(0,000) = 1,000 f(-0,750)= -0,2776* f(2,250)*f(2,500) <0 ( = ( 0,094 f(-0,562)= 0,0081* f(-0,375)= 0,3123 f(-0,750)= -0,2776 f(-0,656)= -0,1371* f(-0,656)*f(-0,562) <0 ( = ( 0,047 f(-0,562)= 0,0081* f(-0,656)= -0,1371 f(-0,609)= -0,0651* f(-0,609)*f(-0,562) <0 ( = ( 0,023 f(-0,562)= 0,0081* f(-0,609)= -0,0651 f(-0,585)= -0,028 ( = ( 0,011 f(-0,562)= 0,0081 A estimativa da raíz é xr = -0,573 ( 0,011. 3) - A estimativa da raíz é xr = 1,33 ( 0,02. 4) - A estimativa da raíz é xr = -0,49 ( 0,03. 5) - A estimativa da raíz é xr = 2,53 ( 0,03. B)- Primeiro devemos encontrar os intervalos onde estão as raízes de f(x), para isto vamos construir uma tabela de valores: x -8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 f(x) 3067 1710 859 370 123 22 -5 -6 -5 -2 27 130 Uma outra forma é construindo os gráficos abaixo: Vamos primeiro estimar a raíz no intervalo [-3 ; -2]: f(-3,00)= 22,000 f(-2,50) = 2,812* f(-2,50)*f(-2,00) <0 ( = ( 0,25 f(-2,00) = -5,000* f(-2,50)= 2,812* f(-2,50)*f(,2,25) <0 ( = ( 0,13 f(-2,25)= -2,152* f(-2,00) =-5,000 f(-2,50)= 2,812 f(-2,38)= 0,123* f(-2,38)*f(-2,25) <0 ( = ( 0,07 f(-2,25) =-2,152* f(-2,38)= 0,123* f(-2,38)*f(-2,32) <0 ( = ( 0,03 f(-2,32)= -1,004* f(-2,25) = -2,152 f(-2,38)= 0,123 f(-2,36)= -0,268 ( = ( 0,01 f(-2,32)= -1,004 A estimativa da raíz é xr = -2,37 ( 0,01. Vamos agora estimar a raíz no intervalo [1 ; 2]: f(1,00) = -2,000* f(1,00)*f(1,50) <0 ( = ( 0,25 f(1,50) = 6,812* f(2,00) =27,000 f(1,00)= -2,000* f(1,00)*f(1,25) <0 ( = ( 0,13 f(1,25)= 1,348* f(1,50) = 6,812 f(1,00)= -2,000 f(1,13)= -0,484* f(1,13)*f(1,25) <0 ( = ( 0,06 f(1,25) = 1,348* f(1,13)= -0,484* f(1,13)*f(1,19) <0 ( = ( 0,03 f(1,19)= 0,376* f(1,25) = 1,348 f(1,13)= -0,484 f(1,16)= -0,067 ( = ( 0,02 (se não tivesse arredondado seria 0,015) f(1,19)= 0,376 A estimativa da raíz é xr = 1,18 ( 0,02. 2) - x -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 f(x) 10,26 8,83 7,30 5,61 3,69 2 1,69 1,61 1,30 0,83 0,25 -0,39 -1,09 A estimativa da raíz é xr = 5,39 ( 0,02. C) –A função f(x) = tg(x) -x2 tem infinitas raízes. D)- x = f(x) = x2 - 5 = 0 Devemos encontrar a solução para a raiz positiva uma vez que x deve ser positivo, pois x = . Esta solução se encontra no intervalo [2 ; 3]. f(3,00)= 4,00 f(2,50) = 1,25* f(2,00)*f(2,50) <0 ( = ( 0,25 f(2,00) = -1,00* f(2,50)= 1,25 f(2,25)= 0,06* f(2,00)*f(2,25) <0 ( = ( 0,13 f(2,00) = -1,00* f(2,25)= 0,06 * f(2,13)*f(2,25) <0 ( = ( 0,06 f(2,13)= -0,46* f(2,00) = -1,00 f(2,25)= 0,06* f(2,19)*f(2,25) <0 ( = ( 0,03 f(2,19)= -0,21* f(2,13) =-0,46 f(2,25)= 0,06* f(2,22)*f(2,25) <0 ( = ( 0,02 f(2,22)= -0,07* f(2,19)= -0,46 f(2,25)= 0,06 f(2,24)= 0,02* f(2,22)*f(2,24) <0 ( = ( 0,01 f(2,22)= -0,07 * A estimativa da raíz é xr = 2,23 ( 0,01 Em uma calculadora: = 2,236067977 CRITÉRIOS DE PARADA Estamos usando até agora, o seguinte critério de parada: ( ( (b-a)/2 (1) No entanto, se tivermos uma função do seguinte tipo Podemos estar satisfazendo (1), e no entanto f(x0) pode ser muito maior que zero. Assim, em certos casos pode-se usar a seguinte condição (( (2) Tanto o critério (1), quanto o critério (2), podem levar a um número muito grande de iterações. Uma maneira de se contornar este problema é tomar como um critério de parada adicional, um certo número de iterações máximo. Estimativa do número de iterações no método da bisseção. Como em cada passo, dividimos o intervalo por 2, temos: = (3) 2k Onde k é o número de passos. Queremos que: (k ( 2 2(( (4) de (3) em (4) 2( ( 2k log 2(k+1) ( log ( k +1 ( k ( -1 (5) MÉTODO DAS SUBSTITUIÇÕES OU APROXIMAÇÕES SUCESSIVAS Seja f(x) uma função contínua em [a ; b] com uma raiz neste intervalo. O método consiste em transformar a equação: f(x) = 0 em: x = ((x) onde ((x) é chamada de função de iteração, e a partir de uma aproximação inicial xn = 0, usar xn + 1 = ((xn) para encontrar uma seqüência de {xn}. Graficamente temos: Quando encontrarmos x = ((x), teremos: f(x) = x - ((x) = 0 Exemplo 1 : Quais funções ((x) podem ser usadas para encontrar as raízes de f(x)=x2+ 2x –3? x2 + 2x -3 = 0 (i) x = 3- x2 / 2 ===> ((x) = 3- x2 / 2 (ii) x = ( ===> ((x) = ( (iii) x(x + 2) - 3 = 0 x = 3 / x + 2 ===> ((x) = 3 / x + 2 (iv) x2 = 3 - 2x x = (3/x) -2 ===> ((x) = (3/x) - 2 Exemplo 2: Dada a função f(x) = x2 + 0,96x - 2,08 encontrar a raiz de f(x) no intervalo [1 ; 2], a partir de x0 = 1,2 usando as seguintes funções de iteração: (a) ((x) = 2,08 / x + 0,96 (b) ((x) = x2 + 2,08 / 2x + 0,96 (c) ((x) = x2 +1,96x - 2,08 Faça 5 iterações. (a) - n xn ((xn) = 2,08 / xn + 0,96 f(xn) 0 1,2 0,9630 0,5120 1 0,9630 1,082 -0,2281 2 1,082 1,019 0,1294 3 1,019 1,051 -0,0634 4 1,051 1,034 0,0336 5 1,034 1,043 -0,0182 (b) - n xn ((xn) = x2 + 2,08 / 2x + 0,96 f(xn) 0 1,2 1,048 0,5120 1 1,048 1,040 0,0244 2 1,040 1,040 0,0 (raiz exata) (c) n xn ((xn) = x2 +1,96x -2,08 f(xn) 0 1,2 1,712 0,5120 1 1,712 4,206 2,495 2 4,206 23,854 19,65 3 23,854 613,6 589,6 4 613,6 37770 - Deste exemplo, podemos notar que nem todas as funções de iteração farão com que o método convirja para a raiz procurada. O seguinte teorema estabelece condições suficientes para que o método seja convergente. TEOREMA Seja ( uma raiz da equação f(x) = 0, isolada num intervalo I centrado em (. Seja ((x) uma função de iteração para a equação f(x) = 0. Se, (i) ((x) e (‘(x) são continuas em I (ii) |((x)| ( M ( 1 , ( x ( I (iii) xn=0 ( I Então a seqüência {xn} gerada pelo processo iterativo xn+1 = ((xn) converge para (. DEMONSTRAÇÃO Vamos primeiro provar que se xn=0 ( I, então xn ( I para qualquer n. Sabemos que: f(() = 0 (6) e ( = ((() (7) Pelo processo iterativo, temos xn+1 = ((xn) (8) Logo subtraindo (7) de (8) : xn+1 - ( = ((xn) - ((() (9) Como ((x) é contínua e diferenciável em I, pelo teorema do valor médio, se xn ( I, existe cn entre xn e ( tal que: (‘(cn) (xn - () = ((xn) - ((() (10) De (9) e (10): xn+1 - ( (‘ (cn) (xn - () (11) e |xn+1 - (| = | (‘(cn) | .| xn - ( | Pela condição (ii) do teorema: |xn+1 - (| = |(‘(cn)|.|xn - (| < |xn - (| |xn+1 - ( | < | xn- ( | Assim, a cada passo, a distância entre xn e ( diminui e como I está centrado em (, xn ( I , (n. Agora devemos provar que . De (9): |x1 - (| = | ((xn=0) - ((()| = |(‘ (cno)| | xn=0 - ( | ( M | xn=0 - (| (11) |x1 - (| = | ((x1) - ((()| = |(‘ (cn1)| |x1 - (| ( M | x1 - (| Usando (11): |x2 - (| ( M2 | xn=0 - (| Sucessivamente segue que: |xn - (| ( Mn | xn=0 - (| e |xn - ( | ( Mn |xn=0 - (| Como M (1 , Mn = 0: xn - ( = 0 xn = ( EXEMPLO 3: Verificar as condições do teorema de convergência para as funções (a) e (c) do exemplo 2: (a) ((x) = 2,08 / (x+0,96) (‘(x) = - 2,08 / (x+0,96)2 - ((x) e (‘(x) são contínuas em [1 ; 2] |(‘(x)| < 1 |-2,08 / (x+0,96)2 | < 1 ====> 2,08 / (x+0,96)2 < 1 (x + 0,96)2 > 2,08 x2 + 1,92x - 1,16 > 0 ( = 8,33 ==========> x1 = -2,40 ; x2 = 0,48 |(‘(x)| <1 |(‘(x)| > 1 |(‘(x)| < 1 - |(‘(x)| < 1 em [ 1 ; 2] - 1,2 ( [1 ; 2] Todas as condições são satisfeitas (c) ((x) = x2 - 1,96x - 2,08 (‘(x) = 2x + 1,96 - ((x) e (‘(x) são contínuas em [1 ; 2] |(‘(x)| < 1 |2x + 1,96| < 1 -1 < 2x + 1,96 < 1 -2,96 < 2x < 0,96 -1,48 < x < 0,48 EXERCICIOS 1 - Achar as raízes positivas das seguintes funções, usando como valor inicial xn=0 intervalo e erro dado. a) - f(x) = x3 - 9x + 3 xn=0 = 0,5 [0 ; 1] f(x) ( 0,0001 b) - f(x) = 2x - cos(x) xn=0 = (/8 [0 ; (/4] f(x) ( 0,00005 c) - f(x) = ex - 4x2 xn=0 = 0,5 [0 ; 1] f(x) ( 0,0020 d) - f(x) = x3 - x - 1 xn=0 = 1,5 [1 ; 2] f(x) ( 0,000010 Sugestões de funções de iteração para cada item: a)-((x) = x3/9 +1/3 b)-((x) = cos(x)/2 c)-((x) = ex/2/2 d)-((x) = (x+1)1/3 Resposta: 1 - (a) f(x) = x3 - 9x + 3 ((x) = x3/9 + 1/3 Vamos verificar as condições do teorema de convergência. (i) ((x) é continua para ( x (‘(x) = x2 /3 é continua para ( x (ii) x2/3 < 1 x2/3 < 1 x2 < 3 x < 1,73 logo no intervalo [0 ;1], (‘(x) < 1 (iii) xn=0 = 0,5 ( [0 ; 1] Vamos então usar a função ((x) = x3/9 + 1/3 para encontrar a raíz de f(x). n Xn ((xn) = x3n /9 + 1/3 f(xn) 0 0,5000 0,3472 -1,3750 1 0,3472 0,3380 -0,0820 2 0,3380 0,3376 -0,0030 3 0,3376 613,6 0,0001 logo, a estimativa para a raíz é: x = 0,3376 (b) - f(x) = 2x - cos(x) ((x) = cos(x) / 2 Vamos verificar as condições do teorema da convergência (i) ((x) é contínua em [0 ; (/4] (‘(x) = - sin(x) / 2 é contínua em [0 ; (/4] (ii) |(‘(x)| = |-sin(x) / 2| < 1 em [0 ; (/4] (iii) xn=0 = (/8 ( [0 ; (4] n Xn ((xn) = cos(xn) / 2 f(xn) 0 0,3927 0,4619 -0,13848 1 0,4619 0,4476 0,02859 2 0,4476 0,4507 -0,00629 3 0,4507 0,4501 0,00126 4 0,4501 0,4502 -0,00020 5 0,4502 - 0,00004 a estimativa para a raíz é: x = 0,45020 (c) f(x) = ex - 4x2 ((x) = ex/2 / 2 (i) ((x) é continua em [0 ; 1] (‘(x) = 1/4 ex/2 é continua em [ 0 ; 1] (ii) | (‘(x)| < 1 em [0 ; 1] pois (‘(x) é monótona e (‘(0) =1/4 e (‘(1) = 0,412 n Xn ((xn) = 1/2 ex/2 f(xn) 0 0,50000 0,64201 0,6487 1 0,64201 0,68926 0,2516 2 0,68926 0,70573 0,0919 3 0,70573 0,71157 0,0331 4 0,71157 0,71365 0,0118 5 0,71365 0,71439 0,0042 6 0,71439 - 0,0015 a estimativa para a raíz é: x = 0,71439. �EMBED Word.Picture.8��� x1 x2 x3 x4 x5 � EMBED Word.Picture.8 ��� �EMBED Word.Picture.8��� � � f(x) f(x) f(a) b x a f(b) f(x) f(a) a b x f(b) f(a) f(b) a b x f(b) f(a) a b f(b) b a f(a) f(b) f(a) a b �EMBED Word.Picture.8��� x2 x1 ((x3) RAÍZ � RAÍZ � ((x2) � f(x) f(x) x0=estimativa da raíz (=raiz de f(x) a xo ( b x ((x) y = x ((x1) x1 x3 x4 x2 x0 (‘(x) não é menor que 1 em [1 ; 2] e sim em ] -1,48 ; 0,48[. Logo não é possível garantir a convergência desta função iterativa _1000819443.unknown _1001666938.unknown _1001667377.unknown _1001669164.unknown _1001669178.unknown _1001668897.unknown _1001667272.unknown _1000819446.unknown _1000819460.unknown _1001666916.unknown _1000820510.doc -1 0 1 2 3 4 5 -2 -1.5 -1 -0.5 0 0.5 1 x**3+2*x**2+x+1 _1000819459.unknown _1000819445.unknown _1000819439.unknown _1000819441.unknown _1000819418.doc sin(x) + cos(x) 6 5 4 3 2 1 0 1.5 1 0.5 0 -0.5 -1 -1.5 _1000819437.unknown _1000819431.doc - 2 1 0 -1 -2 -3 8 6 4 2 0 -2 -4 -6 _1000819407.doc 6 4 2 0 -2 -4 -6 -8 1 0.8 0.6 0.4 0.2 0 -0.2 -0.4 -0.6 -0.8 -1 C�lculo Num�rico/Rotina para Gauss.zip gauss.cpp #include <stdio.h> #include <conio.h> #include <math.h> #define MAX 10 #define ERRO 0 int GaussSimples(float [MAX][MAX],float [MAX],int ); int GaussPivotamentoParcial(float [MAX][MAX],float [MAX],int ); int LeMatriz(float matriz[MAX][MAX]); int GaussSeidel(float [MAX][MAX],float [MAX],int,float); void ZeraMatriz(float matriz[MAX][MAX]); void ZeraVetor(float vetor[MAX]); float MaiorElemento(float vetor[MAX]); void CopiaMatriz(float [MAX][MAX],float [MAX][MAX]); void main() { float matriz[MAX][MAX],tempmatriz[MAX][MAX],resultado[MAX],precisao; int num_incognitas=4,i,retorno; char op; //Opcao de menu ZeraMatriz(matriz); ZeraMatriz(tempmatriz); do{ clrscr(); printf("\n\t\tMedodos de Gauss"); printf("\n\n\t(1)Entrar com um novo sistema"); printf("\n\n\t(2)Metodo Simples de Gauss"); printf("\n\n\t(3)Metodo de Gauss com Pivotamento Parcial"); printf("\n\n\t(4)Metodo de Gauss-Seidel"); printf("\n\n\t(5)Sair"); printf("\n\n\tEscolha uma opcao:"); op=getche(); retorno=0; switch(op){ case '1' : num_incognitas=LeMatriz(matriz); CopiaMatriz(tempmatriz,matriz); // faz um backup da matriz para que sejam restauradas break; //as modificacoes feitas nos processos numericos case '2' : retorno=GaussSimples(matriz,resultado,num_incognitas); break; case '3' : retorno=GaussPivotamentoParcial(matriz,resultado,num_incognitas); break; case '4' : printf("\n\n\tDigite a precisao:"); scanf("%f",&precisao); retorno=GaussSeidel(matriz,resultado,num_incognitas,precisao); } if(retorno){ //Se nao hover erro sera impresso o resultado printf("\n\n"); for(i=0;i<num_incognitas;i++){ printf("\n\tx[%d]:%8.4f",i+1,resultado[i]); } getch(); } CopiaMatriz(matriz,tempmatriz); //restaura matriz inicial }while(op!='5'); } //Funcao para leitura de Matrizes //Parametros: uma matriz //Retorno: numero de incognitas(coeficientes de um sistema int LeMatriz(float matriz[MAX][MAX]) { int num_incognitas,i,j,k; float a; clrscr(); printf("\n\n\tDados:"); printf("\n\tNumero de incognitas:"); scanf("%d",&num_incognitas); for(i=0;i<num_incognitas;i++) { printf("\n"); for(j=0;j<num_incognitas;j++){ printf("\tDigite o coeficiente [%d][%d]:",i+1,j+1); scanf("%f",&matriz[i][j]); } printf("\tDigite o termo independente:"); scanf("%f",&matriz[i][j]); } return num_incognitas; } //Resolve o sistema pelo metodo de Gauss sem pivotamento //Parametros:sistema, vetor para resultados e numero de incognitas //Retorno: 1 em caso de sucesso e 0 em caso de Erro int GaussSimples(float matriz[MAX][MAX],float resultado[MAX],int num_incognitas) { int i,j,k; float a,aux; clrscr(); for(i=0;i<num_incognitas;i++){ //Faz a troca se houver um elemento 0 no inicio da linha principal k=i+1; while(matriz[i][i]==0){ if(matriz[k][i]==0){ printf("\nSistema indeterminado!!!!!"); //em caso ca coluna estar zerada retorna erro getch(); return ERRO; } for(j=0;j<=num_incognitas;j++){ //Efetua a troca da linha que comeca por 0 com outra aux=matriz[i][j]; matriz[i][j]=matriz[k][j]; matriz[k][j]=aux; } k++; } //efetua o metodo de Gauss propriamente dito for(j=i+1;j<num_incognitas;j++){ a=-matriz[j][i]/matriz[i][i]; for(k=i;k<=num_incognitas;k++){ matriz[j][k]=a*matriz[i][k]+matriz[j][k]; } aux=0; for(k=0;k<=num_incognitas;k++){ //Testa se a linha nao foi zerada if(matriz[j][k]!=0) aux=1; } if(!aux){ //se a linha for zerada retorna erro printf("\nSistema indeterminado!!!!!"); getch(); return ERRO; } } } printf("\n\tMatriz triangularizada:\n\n"); for(i=0;i<num_incognitas;i++){ for(j=0;j<=num_incognitas;j++){ printf(" %8.3f",matriz[i][j]); } printf("\n"); } for(i=num_incognitas-1;i>=0;i--) //Efetua o calculo final das solucoes na matriz triangularizada { resultado[i]=matriz[i][num_incognitas]; for(j=i+1;j<num_incognitas;j++){ resultado[i]=resultado[i]-matriz[i][j]*resultado[j]; } resultado[i]=resultado[i]/matriz[i][i]; } return 1; } //Resolve o sistema pelo metodo de Gauss com Pivotamento parcial //Parametros:sistema, vetor para resultados e numero de incognitas //Retorno: 1 em caso de sucesso e 0 em caso de Erro int GaussPivotamentoParcial(float matriz[MAX][MAX],float resultado[MAX],int num_incognitas) { int i,j,k,l,m; float a,aux; clrscr(); for(i=0;i<num_incognitas;i++){ // Metodo bolha para fazer o pivotamento for(l=i;l<num_incognitas;l++){ for(m=i;m<num_incognitas-1;m++){ if(matriz[m][i]<matriz[m+1][i]){ for(k=0;k<=num_incognitas;k++){ aux=matriz[m][k]; matriz[m][k]=matriz[m+1][k]; matriz[m+1][k]=aux; } } } } if(matriz[i][i]==0){ // Em caso da primeira coluna ser zero retorna erro printf("Sistema Indeterminado!!!"); getch(); return ERRO; } for(j=i+1;j<num_incognitas;j++){ a=-matriz[j][i]/matriz[i][i]; for(k=i;k<=num_incognitas;k++){ matriz[j][k]=a*matriz[i][k]+matriz[j][k]; } aux=0; for(k=0;k<=num_incognitas;k++){ if(matriz[j][k]!=0) aux=1; } if(!aux){ printf("\nSistema indeterminado!!!!!"); getch(); return ERRO; } } } printf("\n\tMatriz triangularizada:\n\n"); for(i=0;i<num_incognitas;i++){ for(j=0;j<=num_incognitas;j++){ printf(" %8.3f",matriz[i][j]); } printf("\n"); } for(i=num_incognitas-1;i>=0;i--) { resultado[i]=matriz[i][num_incognitas]; for(j=i+1;j<num_incognitas;j++){ resultado[i]=resultado[i]-matriz[i][j]*resultado[j]; } resultado[i]=resultado[i]/matriz[i][i]; } return 1; } void ZeraMatriz(float matriz[MAX][MAX]) { int i,j; for(i=0;i<MAX;i++) for(j=0;j<MAX;j++) matriz[i][j]=0; } void CopiaMatriz(float matriz1[MAX][MAX],float matriz2[MAX][MAX]) { int i,j; for(i=0;i<MAX;i++) for(j=0;j<MAX;j++) matriz1[i][j]=matriz2[i][j]; } //Resolve o sistema pelo metodo iterativo de Gauss-Siedel //Parametros:sistema, vetor para resultados e numero de incognitas //Retorno: 1 em caso de sucesso e 0 em caso de Erro int GaussSeidel(float matriz[MAX][MAX],float resultado[MAX],int num_incognitas,float precisao) { int i,j,k; float a,aux[MAX],VetorPrecisao[MAX],coefdivisor,oldprec; clrscr(); for(i=0;i<num_incognitas;i++){ coefdivisor=matriz[i][i]; //retira o coef. divisor do elemento a ser isolado for(j=0;j<=num_incognitas;j++){ if(i==j){ matriz[i][j]=0; //Coloca 0 no local do da variavel isolada } else{ matriz[i][j]=-matriz[i][j]/coefdivisor;//Faz o recalculo dos membros isolados if(j==num_incognitas) matriz[i][j]=matriz[i][j]*(-1); //Retorna o sinal original para os membros isolados do sistema } } } for(i=0;i<num_incognitas;i++){ resultado[i]=matriz[i][num_incognitas]; //inicializa o vetor de solucoes com os membros isolados } k=0; oldprec=100000000; //inicializa uma variavel auxiliar de precisao; para manter a memoria da precisao anterior ZeraVetor(VetorPrecisao); do{ for(i=0;i<num_incognitas;i++) aux[i]=resultado[i]; //inicializa uma matriz auxiliar com as solucoes for(i=0;i<num_incognitas;i++){ resultado[i]=0; //zera o correspondente valor das solucoes for(j=0;j<num_incognitas;j++){ resultado[i]=resultado[i]+matriz[i][j]*aux[j]; } resultado[i]=resultado[i]+matriz[i][j]; VetorPrecisao[i]=fabs(aux[i]-resultado[i]); aux[i]=resultado[i]; printf(" %10.5f",resultado[i]); //imprime os resultados das iteracoes } printf("\n"); if(VetorPrecisao[0]>oldprec){ printf("\n\n\tSistema Divergente para o metodo");//Testa convergencia getch(); return 0; } oldprec=VetorPrecisao[0]; k++; }while(MaiorElemento(VetorPrecisao)> precisao); return 1; } void ZeraVetor(float vetor[MAX]){ int i; for(i=0;i<MAX;i++) vetor[i]=0; } float MaiorElemento(float vetor[MAX]){ int i; float maior=vetor[0]; for(i=1;i<MAX;i++) { if(vetor[i]>maior) maior=vetor[i]; } return maior; } C�lculo Num�rico/Rotina para Jacobi.zip Jacobi.c #include <stdio.h> #include <conio.h> #include <math.h> main(void) { float maior_erro,precisao,aux,D[10][10]; float I[10][10],C[10][10],coef[10][10],res[10],x[10],erro[10]; int i,j,k,n,l,m; clrscr(); printf("\n\tDigite a precisao:"); scanf("%f",&precisao); printf("\n\tDigite o numero de variaveis:"); scanf("%d",&n); n=n-1; for(i=0;i<=n;i++){ printf("\n\tCoeficientes da linha %d:\n",i+1); for(j=0;j<=n;j++){ printf("\n\tDigite o coeficiente de x%d:",j+1); scanf("%f",&coef[i][j]); } printf("\n\tTermo independente:"); scanf("%f",&res[i]); } k=0; for(i=0;i<=n;i++){ for(j=0;j<=n;j++){ if(i==j){ I[i][j]=1; D[i][j]=1/coef[i][j]; } else{ I[i][j]=0; D[i][j]=0; } } } for(l=0;l<=n;l++){ printf("\n"); for(m=0;m<=n;m++) printf(" %f",D[l][m]); }getche(); for(l=0;l<=n;l++){ for(m=0;m<=n;m++){ C[l][m]=0; for(k=0;k<=n;k++){ C[l][m] =D[l][k]*coef[k][m]+C[l][m]; } C[l][m]=I[l][m]-C[l][m]; } } for(l=0;l<=n;l++){ printf("\n"); for(m=0;m<=n;m++) printf(" %f",C[l][m]); }getche(); do{ for(i=0;i<=n;i++){ x[i]=0; for(l=0;l<=n;l++) x[i]=C[i][l]*x[l]+x[i]; } for(i=0;i<=n;i++) x[i]=res[i]/coef[i][i]+x[i]; k++; for(j=0;j<=n;j++){ printf("\n\tx%d=%f",j+1,x[j]); erro[j]=fabs(x[j]-x[j]); } for(l=0;l<=n;l++){ for(m=0;m<=n;m++){ if(erro[m]<erro[m+1]){ aux=erro[m]; erro[m]=erro[m+1]; erro[m+1]=aux; } } } maior_erro=erro[0]; }while(maior_erro>=precisao); for(j=0;j<=n;j++) printf("\n\tx=%f",x[j]); getche(); return 0; } C�lculo Num�rico/Rotina para Lagrange.zip Lagran.cpp #include <iostream.h> #include <conio.h> #define NUM 4 void main(void) { // float f[NUM+1]={117.3,86.132,50.271,15.388,-13.236,-31.459,-36.914,-29.482}; // float x[NUM+1]={.3,.5,.7,.9,1.1,1.3,1.5,1.7}; // float f[NUM+1]={86.132,50.271,15.388,-13.236,-31.459}; // float x[NUM+1]={.5,.7,.9,1.1,1.3}; float f[NUM+1],x[NUM+1]; float L[NUM+1],aux,fx,soma; int i,j; for(i=0;i<=NUM;i++){ cout << "digite f:" ; cin >> f[i] ; cout << endl; } for(i=0;i<=NUM;i++){ cout << "digite x:" ; cin >> x[i] ; cout << endl; } cout << " Digite o fx:"; cin >> fx; for(i=0;i<=NUM;i++){ aux=1; for(j=0;j<=NUM;j++){ if(j!=i) aux=aux*(fx-f[j]); } for(j=0;j<=NUM;j++){ if(j!=i) aux=aux/(f[i]-f[j]); } L[i]=aux; } clrscr(); soma=0; for(i=0;i<=NUM;i++){ soma=soma+x[i]*L[i]; } for(i=0;i<=NUM;i++){ cout << "L[" << i << "]: " << L[i] << endl; } cout << "Soma:" << soma; getche(); } C�lculo Num�rico/Unidade 1- Eq. Lineares.pdf 1 11 RREESSOOLLUUÇÇÃÃOO DDEE EEQQUUAAÇÇÕÕEESS NNÃÃOO LLIINNEEAARREESS Como o próprio nome diz, este é um curso de cálculo numérico. Mas o que vem a ser isso? Sem muito rigor, se pode dizer que este é um curso para aprender a resolver problemas manipulando números. Com um pouco mais de rigor se acrescentaria que essa manipulação de números deve ser de maneira sistemática e eficiente. O objetivo é aprender a resolver problemas matemáticos através da aplicação de métodos numéricos, ou seja, de técnicas que envolvem apenas operações aritméticas. Embora haja muitas classes de métodos numéricos, todos têm uma característica em comum: Envolvem invariavelmente uma grande quantidade de cálculos aritméticos tediosos. Com o desenvolvimento de computadores digitais eficientes e cada vez mais rápidos, o papel dos métodos numéricos na resolução de problemas de engenharia aumentou tanto nas últimas décadas que se tornaram praticamente absolutos. Embora a variedade de linguagens de programação seja grande e cresça a cada dia, Fortran continua sendo a mais apropriada para cálculo numérico. Neste curso, será utilizada a linguagem Fortran 90, que embora tenha sido lançada como uma nova versão do Fortran1 é de fato uma linguagem absolutamente nova, concebida de acordo com os atuais conceitos de engenharia de software. O Fortran 90 manteve a eficiência computacional, que sempre foi o compromisso do Fortran: Rotinas de cálculo são mais eficientes e mais fáceis de implementar em Fortran 90 do que noutras linguagens. Com a melhoria constante dos recursos computacionais, o tamanho e a complexidade dos problemas cuja solução torna-se viável cresce vertiginosamente. 1 Do inglês FORmula TRANslation. Fortran foi a primeira linguagem de computador. Lançada em 1958 para codificar rotinas de cálculo eficientes, evolui ao longo dos anos. Até cheagar ao Fortran 90/95 de hoje, apareceram várias versões, sendo as mais notáveis: Fortran 66, Fortran IV, Fortran 77, WatFor e WatFiv. © 2 00 0 by B en em ar A le nc ar d e So uz a 2 Por exemplo, para projetar os circuitos integrados em extra-alta escala de hoje, os engenheiros precisam resolver simultaneamente equações com dezenas de milhões de variáveis. Em engenharia de alta tensão e de sistemas de potência também há problemas assim. Por exemplo, resolver os problemas de cálculo de campos eletromagnéticos em alta tensão empregando o método dos elementos finitos, também exige máquinas de alto desempenho e sobretudo bom conhecimento de cálculo numérico e de técnicas de programação. Para conseguir esta habilidade toda há motivo de sobra, mas precisa tempo e dedicação e antes de tudo precisa começar. Este curso de cálculo numérico tem justamente como objetivo, começar. 1. Começando com um problema simples A capacidade de produção de uma pequena fábrica de queijo é função do tempo e pode ser aproximada por: CBtAtp += )sen()( , (1) sendo t o tempo em meses medidos a partir de hoje (t = 0). Supõe-se que eq. (1) seja válida para os próximos 24 meses, isto é, para t tal que 240 ≤≤t . A, B e C são parâmetros conhecidos. Estima-se que a demanda pelos queijos produzidos cresça linearmente com o tempo: EDttd +=)( , (2) também para 240 ≤≤t e D e F sendo parâmetros conhecidos. Para planejar a ampliação de suas instalações, o produtor quer saber a partir de quando ele não poderá atender a demanda. Este problema, ao qual se farão referências repetidas vezes como o problema do produtor, consiste em se determinar o tempo em que a demanda é igual à produção: )()( tdtp = , EDtCBtA +=+)sen( , ou ainda, 0)sen( =−+− ECDtBtA . (3) A equação (3) é a equação do problema na chamada forma padrão (lado direito zero). O valor de t para o qual a equação se verifica é chamado de raiz da equação. A eq. (3) é um caso particular de 0)( =tf , (4) em que f é uma função não-linear. Daí a equação ser chamada de equação não linear. Ao contrário das equações lineares, as não lineares nem sempre tem solução “exata”2. Algumas equações não lineares podem ser resolvidas mais fáceis que outras: são as equações polinomiais e racionais. As equações que não são dessas classes, como é o caso da eq. (3), são chamadas de equações transcendentais. 2 Este conceito será formalizado mais tarde. 3 Da forma como foi equacionado, o problema do produtor pode ser resolvido de diferentes maneiras. Para facilitar o entendimento de como essas soluções são levadas a efeito sejam fixados os valores dos parâmetros: A = 180 kg, B = π/36 mês-1, C = 10 kg, D = 10 kg/mês, E = 10 kg. Se as equações polinomiais são de solução mais fácil que as transcendentais, como foi dito antes, por que não procurar algum polinômio que seja uma aproximação da função seno? Sim, porque é o seno que está determinando a natureza transcendental da eq. (3). Pois bem, a série de Maclaurin para o seno é: !+−+−= !7!5!3 sen 753 xxx xx ∞≤≤∞− x Assim, o polinômio correspondente aos dois primeiros termos dessa série infinita é uma aproximação da função seno: !3 sen 3 x xx −≅ , de modo que com alguma aproximação, se pode trocar a a eq. (3) pela seguinte equação polinomial: 0 6 )( 3 =−+− − ECDtBtBtA . (5) Pelo fato dos parâmetros C e E serem iguais, a equação (5) se simplifica: 0 6 23 = −− ttABDAB . (6) A solução não trivial da eq. (6) é 3 )(6 AB DABt −= . (7) Substituindo-se os valores dos parâmetros na eq. (7) se determina o valor de t = 16,92. Isto é, a demanda será maior que a produção de queijo daqui a aproximadamente 17 meses. A equação (7) é uma solução analítica exata da eq. (6). Pelo fato desta última ser apenas uma aproximação da eq. (3), é que a solução acima é apenas uma solução aproximada do problema. Há vários métodos numéricos que permitem resultados até melhores, sem necessidade de tanto artifício. Esses métodos são denominados iterativos, porque eles começam com uma estimativa inicial da solução e sistematicamente vão se aproximando da solução exata. O processo de cálculo termina quando se consegue uma aproximação satisfatória (em caso de sucesso) ou 4 quando um número máximo especificado de iterações for alcançado. Mas o que significa uma “aproximação satisfatória”? Depende da natureza do problema, no caso do problema do produtor, uma tolerância de 0,1 é suficiente. Em problemas típicos de engenharia, a tolerância é da ordem de 10-3 a 10-5 e em problemas científicos mais sofisticados a tolerância geralmente é da ordem de 10-10 ou menor. 2. O método da bisseção Um dos métodos de solução de equação não linear mais antigos, embora usado até hoje, é o método da bisseção. Baseia-se no fato de que o zero de uma função contínua está num intervalo cujos extremos são tais que os valores da função nesses pontos sejam de sinais trocados, como se pode vê na fig. 1. Assim, dados: Uma função contínua f ; Dois pontos, t1 e t2, do domínio dessa função, tais que t1 < t2; Um número máximo de iteração, n; Uma tolerância τ; O algoritmo3 do método da bisseção é o seguinte: 1. Calcule f(t1) e f(t2); 2. Teste f(t1) f(t2) < 0, se for verdadeiro vá para o passo 3, senão pare. 3. Defina o novo ponto )( 122 1 3 ttt +← 4. Calcule f(t3) 5. Teste f(t1) f(t3) < 0, se for verdadeiro vá para o passo 6 senão vá para o passo7. 6. Faça 32 tt ← e )()( 32 tftf ← e vá para o passo 8. 7. Faça 31 tt ← e )()( 31 tftf ← . 8. volte para o passo 3 enquanto τ>)( 3tf e não fez isso mais de n vezes. Do contrário pare. Na fig. 2 se tem o código de uma rotina Fortran 90 para resolver o problema do produtor de queijo. 3 Uma seqüência de passos e opeações estabelecida de modo formal para a resolução de um problema. x1 x2 x3 x f(x) raiz Fig. 1 Trecho da curva f(t) versus t num intervalo a que um zero de f pertence. 2331 xxxx = . 5 program fabricaDeQueijoBissecao implicit none !especificação das variáveis e da função f. real:: t,t1,t2,t3,f real,parameter:: pi=3.141593 real,parameter:: a=180,b=pi/36,c=10,d=10,e=10 integer:: k f(t)=a*sin(b*t)-d*t+c-e !inicialização das abssisas dos pontos extremos iniciais. t1=6 t2=24 !o processo iterativo de cálculo da raiz. do k=1,50 t3=(t1+t2)/2 if(abs(f(t3))<0.1) then write(*,*) 'A raiz',t3, 'foi encontrada em', & k,' iterações.' stop end if if(f(t1)*f(t3)<0) then t2=t3 else t1=t3 end if end do write(*,*) ' Nao foi possível encontrar a raiz em 50 iterações.' end program fabricaDeQueijoBissecao (a) A raiz 18.00586 foi encontrada em 10 iteracoes. Press any key to continue (b) Fig. 2 (a) Rotina Fortran 90 para solução do problema do produtor pelo método da bisseção e (b) a resposta. 3. O método da falsa posição Outro método muito simples de resolução de equações não lineares é o método da falsa posição, também denominado de método regula falsi. Como o método da bisseção é um método fechado, ou seja, que necessita de partida da definição de um intervalo ao qual a raiz pertença. A diferença é que em vez de definir o novo ponto como a média aritmética das abscissas dos pontos extremos, se define como: )()( )( 12 12 223 xfxf xx xfxx − − −= . (8) Isso corresponde à interseção da reta que passa pelos pontos extremos com o eixo das abscissas, como se vê na fig. 3. Daí esse método também ser denominado de método da interpolação linear. A diferença deste método para o anterior é apenas no 6 passo 3. Como exercício, modifique o código da fig. 2, para que passe a ser baseado no algoritmo da falsa posição. 4. Método de Gauss-Seidel Há outros métodos de solução de equações não lineares, denominados métodos abertos ou métodos de ponto fixo, que em vez de requererem dois valores iniciais exigem um só. Um deles é o método de Gauss-Seidel, que tem a seguinte fórmula de iteração: )( )1()( −= kk xFx , max,,2,1 kk "= , (9) sendo k um contador de iteração, kmax um número máximo de iteração e x(0) uma estimativa inicial da solução. O processo iterativo termina quando se alcança o limite de iterações especificado ou ( ) τ≤− )()( kk xxf , ou então τ≤− − )1()( kk xx , sendo τ uma tolerância especificada. Se a equação não linear a ser resolvida pelo método de Gauss-Seidel estiver na forma padrão (eq. (4)) deve ser posta na forma do ponto fixo (eq. (9)). Por exemplo, a equação do problema do produtor (eq. (3)) deve ser rescrita como: D EC Bt D A t − += )sen( . (10) O método de Gauss-Seidel foi implementado em Fortran 90 para resolver o problema do produtor conforme se vê na fig. 4. x1 x2 x3 x f(x) raiz Fig. 3 Trecho da curva f(t) versus t num intervalo a que um zero de f pertence. )()()( 12 12 2 32 xfxf xx xf xx − − = − . 7 program fabricaDeQueijoGaussSeidel implicit none !especificação das variáveis e da função f. real:: t,f real,parameter:: pi=3.141593 real,parameter:: a=180,b=pi/36,c=10,d=10,e=10 integer:: k f(t)=a/d*sin(b*t)+(c-e)/d !inicialização das abssisas dos pontos extremos iniciais. t=9 !o processo iterativo de cálculo da raiz. do k=1,50 t=f(t) if(abs(f(t)-t)<0.1)then write(*,*) 'A raiz',t, 'foi encontrada em ', & k,' iteracoes.' stop end if end do write(*,*) ' Nao foi possível encontrar a raiz em 50 iterações.' end program fabricaDeQueijoGaussSeidel (a) A raiz 17.99607 foi encontrada em 4 iteracoes. Press any key to continue (b) Fig. 4 Resolução do problema do produtor pelo método de Gauss-Seidel. (a) A rotina Fortran 90 e (b) a saída. 5. O método de Newton-Raphson Este é o concorrente direto do método de Gauss-Seidel, de convergência bem mais rápida, porém muito mais dependente da estimativa inicial. Enquanto o método de Gauss-Seidel pode demorar muito para convergir (pode precisar de várias dezenas de iterações) o método de Newton-Raphson não. Dada uma estimativa incial, converge em poucas iterações (3 ou 4) ou então não converge. O método de Newton-Raphson é um método iterativo de convergência quadrática. Isto é, o método necessita de uma única iteração se a função é quadrática. Isto explica porque o método de Newton-Raphson é tão eficiente computacional- mente quando se tem uma boa estimativa inicial. É que as funções não lineares a serem resolvidas normalmente são de terminação quadrática, isto é, num intervalo suficientemente pequeno as funções geralmente podem ser bem aproximadas por parábolas. Uma das formas de chegar à fórmula de iteração do método de Newton- Raphson é recorrendo-se à série de Taylor, que para função de uma única variável é: 8 !+−+−+−+= !3 )( !2 )()()()( 3 0 3 32 0 2 2 00 000 xx dx fdxx dx fdxx dx dfxfxf xxx , (11) entendendo que )1( )1( dx fd dx df = e que 0x k k dx fd é o valora da derivada de ordem k da fuanção f(x), para 0xx = . Truncando-se a série infinita da eq. (11) de modo que só os dois primeiros termos sejam mantidos se tem: )()()( 00 0 xx dx dfxfxf x −+= . (12) Da eq. (12) se tem a fórmula de recorrência do método de Newton-Rapson: )1( )( )1()1()( − − − −= kx k kk dx df xfxx . (13) Note-se que para o método funcionar é preciso além da função, a sua deriva primeira. Algumas vezes, esta derivada primeira não há uma expressão matemática fechada ou esta expressão existe mais é muito complicada. De um modo ou de outro pode ser preciso se recorrer a derivação numérica. Isto será matéria da unidade 5 deste curso. Uma representação gráfica do método de Newton-Raphson e sua implementação para solução do problema do produtor são mostradas nas figs. 5 e 6 x(0) x f(x) x(1) x(2) x(3) Fig. 5 Representação gráfica do método de Newton-Raphson. 9 respectivamente. No caso do problema do produtor se tem ECDtBtAtf −+−= )sen()( . e DBtAB dx df t −= )cos( . 6. Entradas e saídas mais flexíveis As rotinas Fortran apresentadas até aqui funcionem bem, mais são simples demais. Isto foi a propósito, mas está na hora de melhora-las um pouco. Uma primeira coisa a se fazer no sentido de dotar as rotinas de mais flexibilidade é fazer com que os dados do problema a ser resolvidos sejam externos ao programa. Desse modo eles são passados para o processador no tempo de execução da rotina. Mudanças eventuais nos dados não implicarão modificações na rotina. Para que os dados possam ser fornecidos no tempo de execução a partir do teclado se usa a instrução read, ou read(*,*). program fabricaDeQueijoNewtonRaphson implicit none !especificação das variáveis e das funçõwa f e df. real:: t,f,df real,parameter:: pi=3.141593 real,parameter:: a=180,b=pi/36,c=10,d=10,e=10 integer:: k f(t)=a*sin(b*t)-d*t+c-e df(t)=a*b*cos(b*t)-d !estimativa inicial da solucão. t=12 !o processo iterativo de cálculo da raiz. do k=1,10 t=t-f(t)/df(t) if(abs(f(t))>0.1) cycle write(*,*) 'A raiz',t, 'foi encontrada em ', & k,' iteracoes.' stop end do write(*,*) 'Raiz nao encontrada em 10 iterações.' end program fabricaDeQueijoNewtonRaphson (a) A raiz 18.00907 foi encontrada em 4 iteracoes. Press any key to continue (b) Fig. 6 Solução do problema do produtor pelo método de Newton-Raphson. (a) A rotina e (b) o resultado. 10 Quando a quantidade de dados é maior, torna-se inconveniente usar o teclado e o vídeo como dispositivos de entrada e saída. Se em vez disso os dados são mantidos em arquivos, eles podem ser lidos e modificados tantas vezes quanto se queira. Eles podem também ser impressos ou exportados para outro aplicativo, como o Word®, por exemplo. Freqüentemente, o resultado de um programa Fortran precisa ser anexado a um relatório técnico ou de iniciação científica, a um artigo a ser publicado em congresso ou a uma tese. Para que os valores das variáveis a, b e c sejam lidos no arquivo dados.ent, por exemplo, e os resultados de x e y, calculados internamente, sejam gravados no arquivo resultados.sai se pode fazer o seguinte: open(1, file=’dados.ent’,status=’old’) read(1,*) a, b, c x=a+b+c y=a*b/c open(2, file=’resultados.sai’) write(2,*) x, y, z Os números 1 e 2 como primeiro argumento da função open, podem ser quaisquer entre 1 e 99. Porém é recomendável evitar 5 e 6. Para manter a compatibilidade com versões antigas, read(1,5) ficou sendo o mesmo que read(1,*), e write(2,6) o mesmo que write(2,*). Na verdade, esses números são apenas chaves de endereçamento de arquivos dos quais os dados serão recebidos, ou para os quais serão remetidos. Os arquivos de dados podem ser criados e editados com qualquer editor de texto, desde que não seja empregada formatação rica (padrão de processadores de texto como o Word®). O uso do editor do Developer Studio® não é obrigatório. Por exemplo, o Notepad® do Windows® é uma boa alternativa para se criar arquivos de dados, porque é um editor que gera apenas código ASCII. 7. Rotinas baseadas em métodos alternativos Talvez já deu para perceber que em matéria de cálculo numérico e programação Fortran o céu é o limite. Mal começou e já se tem quatro rotinas (três foram apresentadas acima e uma foi proposta como exercício). Se continuar neste ritmo não se terá o que fazer com tanta rotina logo mais. É verdade, por isso é bom evitar ter tantas rotinas pequenas para fazer a mesma coisa. Em vez de se ter as quatro rotinas para encontrar a raiz de uma equação, porque não ter uma só em que o algoritmo a ser empregado possa ser escolhido no tempo de execução? Claro que isso é possível e tem vantagens. Há apenas um pequeno problema: Dois dos métodos requerem pares de valores iniciais em torno da raiz procurada. Os outros só precisam de um. Uma saída para esse impasse é fornecer sempre um único valor aproximado da raiz. Se a opção for por um dos métodos que precise de dois valores iniciais, o próprio computador que encontre o segundo. Na fig. 7a se vê como essa idéia funciona. Essa rotina é a mesma da fig. 2 acrescida de um conjunto de instruções encabeçado pelo linha de comentário: !procura pelo segundo ponto extremo inicial.. Uma vez dado um valor próximo da raiz, t1, se procura outro, t2, tal que o sinal de f (t2) seja contrário a do sinal de f (t1). A procura é alternada, uma vez a 11 direita de t1, outra vez a esquerda. Se não se tem sucesso em 100 pares de tentativa o processo pára com uma mensagem na tela. 8. Para não ter que reinventar a roda Que o Fortran permite criar rotinas com muita facilidade já foi dito. De fato a facilidade vai além: Uma vez criadas, as rotinas podem ser organizadas de modo que o uso e a atualização sejam simples. Consegue-se isso com as chamadas bibliotecas Fortran. Cada usuário pode formar suas próprias bibliotecas, mas também pode usar as de outros. Há inúmeras bibliotecas desenvolvidas por empresas especializadas, universidades e centros de pesquisas que podem ser compradas ou obtidas sem ônus. Uma das mais conhecidas é a IMSL®, com mais 1000 rotinas matemáticas, estatísticas e de serviço, todas otimizadas e testadas. Se for assim, por que programar se as rotinas já estão prontas nas bibliotecas? É aquela velha questão: Fazer ou comprar feito? Esse dilema pode ocorrer com respeito a uma refeição ou a uma mesa, por exemplo. Há duas situações em que se pode optar por (mandar) fazer uma mesa: Quando não se encontra nenhuma que satisfaça plenamente no comércio ou quando se quer ganhar dinheiro com essa atividade. Com software é a mesma coisa. Muitas vezes, uma rotina menor, mais simples, elaborada com propósito específico, é muito mais apropriada. Fortran serve aos dois senhores: O consumidor exigente ou a fornecedor especializado. Não é difícil criar e atualizar bibliotecas em Fortran, mas isso ficará para depois. Uma coisa de cada vez. Primeiro convém olhar na fig. 8 como se resolve um problema particular empregando rotina de uma biblioteca comercial, no caso a IMSL®. Só precisa dizer de antemão qual biblioteca específica será usada. Veja a segunda linha no código Fortran da fig. 8: use dfimsl. Adiante, quando a sub-rotina zbren for chamada, call zbren(f,errAbs,errrel,t1,t2,maxf), ela será encontrada naquela biblioteca que foi declarada antes com use. Ao usar uma função ou sub-rotina de uma biblioteca, é preciso se submeter às regras estabelecidas pelo fabricante, as quais constam nos manuais (escritos ou eletrônicos) da biblioteca. Como exercício, se sugere que seja feita uma pesquisa sobre a sub-rotina zbren no manual da biblioteca IMSL®, procurando descobrir qual o algoritmo em que ela se baseia e o que significa cada um de seus argumentos. 9. Alguns esclarecimentos Para finalizar essa primeira unidade é preciso dizer que esse texto não é suficiente, nem tem a intenção de ser. Muita coisa foi dita sem ser devidamente explicada. As informações que faltam aqui foram ou poderão ser complementas em sala de aula. Também há a possibilidade de obter esclarecimento em consultas ao professor, individuais ou em pequenos grupos. Pede-se a compreensão do aluno, no sentido de ser tolerante quanto aos erros que devem existir nessa versão preliminar, porque não houve tempo algum para revisão. Como o curso começou com uma semana de atraso, essas notas de aulas tiveram que ser feitas em apenas dois ou três dias. Correções, críticas e sugestões são bem-vindas. 12 program fabricaDeQueijoBissecaoUmSo implicit none !especificação das variáveis e da função f. real:: t,t1,y1,te,td,t2,t3,f real,parameter:: pi=3.141593 real,parameter:: a=180,b=pi/36,c=10,d=10,e=10 integer:: k f(t)=a*sin(b*t)-d*t+c-e !inicialização um dos pontos extremos iniciais. t1=6 y1=f(t1) !procura pelo segundo ponto extremo inicial. te=t1 td=t1 do k=1,100 td=1.1*td+1e-3 if(f(td)*y1<0) then t2=td write(*,*) 'Segundo ponto extremo (',t2,') encontrado em', & k,' iteracoes.' exit end if te=0.9*te-1e-3 if(f(te)*y1<0) then t2=te write(*,*) 'Segundo ponto extremo (',te,') encontrado em', & k,' iteracoes.' exit end if end do if(k>100) stop ‘Segundo extremo nao encontrado em 200 tentativas.' !o processo iterativo de cálculo da raiz. do k=1,50 t3=(t1+t2)/2 if(abs(f(t3))<0.1) then write(*,*) 'A raiz',t3, 'foi encontrada em ', & k,' iteracoes.' stop end if if(f(t1)*f(t3)<0) then t2=t3 else t1=t3 end if end do write(*,*) ' Nao foi possível encontrar a raiz em 50 iterações.' end program fabricaDeQueijoBissecaoUmSo (a) Segundo ponto extremo ( 18.85196 ) encontrado em 12 iteracoes. A raiz 17.99851 foi encontrada em 8 iteracoes. Press any key to continue (b) Fig. 7 Fechamento automático de um intervalo que contenha a raiz. (a) A rotina e (b) o resultado. 13 program fabricaDeQueijoBissecaoImsl use dfimsl implicit none external f !especificação das variáveis e da função f. real:: t,t1,t2,t3,f real:: errRel,errAbs integer:: maxf errRel=0 errAbs=0.1 maxf=100 !inicialização das abssisas dos pontos extremos iniciais. t1=6 t2=24 !cálculo da raiz. call zbren(f,errAbs,errrel,t1,t2,maxf) !esta sub-rotina é da !biblioteca IMSL. write(*,*) 'A raiz encontrada foi',t2 end program fabricaDeQueijoBissecaoImsl function f(t) implicit none real:: t,f real,parameter:: pi=3.141593 real,parameter:: a=180,b=pi/36,c=10,d=10,e=10 f=a*sin(b*t)-d*t+c-e return end function f (a) A raiz encontrada foi 17.99957 Press any key to continue (b) Fig. 8 (a) Uma rotina que utiliza a biblioteca IMSL e (b) o resultado.